mirror of
https://github.com/Start9Labs/start-os.git
synced 2026-03-30 12:11:56 +00:00
implement toggling gateways for service interface
This commit is contained in:
@@ -1,11 +1,18 @@
|
|||||||
import { CommonModule } from '@angular/common'
|
import { CommonModule } from '@angular/common'
|
||||||
import { ChangeDetectionStrategy, Component, input } from '@angular/core'
|
import {
|
||||||
|
ChangeDetectionStrategy,
|
||||||
|
Component,
|
||||||
|
input,
|
||||||
|
inject,
|
||||||
|
} from '@angular/core'
|
||||||
import { TuiTitle } from '@taiga-ui/core'
|
import { TuiTitle } from '@taiga-ui/core'
|
||||||
import { TuiSkeleton, TuiSwitch } from '@taiga-ui/kit'
|
import { TuiSkeleton, TuiSwitch } from '@taiga-ui/kit'
|
||||||
import { FormsModule } from '@angular/forms'
|
import { FormsModule } from '@angular/forms'
|
||||||
import { i18nPipe } from '@start9labs/shared'
|
import { i18nPipe, LoadingService, ErrorService } from '@start9labs/shared'
|
||||||
import { TuiCell } from '@taiga-ui/layout'
|
import { TuiCell } from '@taiga-ui/layout'
|
||||||
import { InterfaceGateway } from './interface.service'
|
import { InterfaceGateway } from './interface.service'
|
||||||
|
import { ApiService } from 'src/app/services/api/embassy-api.service'
|
||||||
|
import { InterfaceComponent } from './interface.component'
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'section[gateways]',
|
selector: 'section[gateways]',
|
||||||
@@ -21,7 +28,7 @@ import { InterfaceGateway } from './interface.service'
|
|||||||
[showIcons]="false"
|
[showIcons]="false"
|
||||||
[ngModel]="gateway.enabled"
|
[ngModel]="gateway.enabled"
|
||||||
(ngModelChange)="onToggle(gateway)"
|
(ngModelChange)="onToggle(gateway)"
|
||||||
[disabled]="isOs() && !gateway.public"
|
[disabled]="!interface.packageId() && !gateway.public"
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
} @empty {
|
} @empty {
|
||||||
@@ -54,8 +61,39 @@ import { InterfaceGateway } from './interface.service'
|
|||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class InterfaceGatewaysComponent {
|
export class InterfaceGatewaysComponent {
|
||||||
readonly gateways = input.required<InterfaceGateway[] | undefined>()
|
private readonly loader = inject(LoadingService)
|
||||||
readonly isOs = input.required<boolean>()
|
private readonly errorService = inject(ErrorService)
|
||||||
|
private readonly api = inject(ApiService)
|
||||||
|
readonly interface = inject(InterfaceComponent)
|
||||||
|
|
||||||
async onToggle(gateway: InterfaceGateway) {}
|
readonly gateways = input.required<InterfaceGateway[] | undefined>()
|
||||||
|
|
||||||
|
async onToggle(gateway: InterfaceGateway) {
|
||||||
|
const addressInfo = this.interface.value()!.addressInfo
|
||||||
|
const pkgId = this.interface.packageId()
|
||||||
|
|
||||||
|
const loader = this.loader.open().subscribe()
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (pkgId) {
|
||||||
|
await this.api.pkgBindingToggleGateway({
|
||||||
|
gateway: gateway.id,
|
||||||
|
enabled: !gateway.enabled,
|
||||||
|
internalPort: addressInfo.internalPort,
|
||||||
|
host: addressInfo.hostId,
|
||||||
|
package: pkgId,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await this.api.serverBindingToggleGateway({
|
||||||
|
gateway: gateway.id,
|
||||||
|
enabled: !gateway.enabled,
|
||||||
|
internalPort: 80,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} catch (e: any) {
|
||||||
|
this.errorService.handleError(e)
|
||||||
|
} finally {
|
||||||
|
loader.unsubscribe()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,7 @@ import { InterfaceAddressesComponent } from './addresses/addresses.component'
|
|||||||
selector: 'service-interface',
|
selector: 'service-interface',
|
||||||
template: `
|
template: `
|
||||||
<div>
|
<div>
|
||||||
<section
|
<section [gateways]="value()?.gateways"></section>
|
||||||
[gateways]="value()?.gateways"
|
|
||||||
[isOs]="!!value()?.isOs"
|
|
||||||
></section>
|
|
||||||
<section [publicDomains]="value()?.publicDomains"></section>
|
<section [publicDomains]="value()?.publicDomains"></section>
|
||||||
<section [torDomains]="value()?.torDomains"></section>
|
<section [torDomains]="value()?.torDomains"></section>
|
||||||
<section [privateDomains]="value()?.privateDomains"></section>
|
<section [privateDomains]="value()?.privateDomains"></section>
|
||||||
|
|||||||
@@ -488,7 +488,6 @@ export type MappedServiceInterface = T.ServiceInterface & {
|
|||||||
common: DisplayAddress[]
|
common: DisplayAddress[]
|
||||||
uncommon: DisplayAddress[]
|
uncommon: DisplayAddress[]
|
||||||
}
|
}
|
||||||
isOs: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type InterfaceGateway = GatewayPlus & {
|
export type InterfaceGateway = GatewayPlus & {
|
||||||
|
|||||||
@@ -135,7 +135,6 @@ export default class ServiceInterfaceRoute {
|
|||||||
torDomains: host.onions.map(o => `${o}.onion`),
|
torDomains: host.onions.map(o => `${o}.onion`),
|
||||||
publicDomains: getPublicDomains(host.publicDomains, gateways),
|
publicDomains: getPublicDomains(host.publicDomains, gateways),
|
||||||
privateDomains: host.privateDomains,
|
privateDomains: host.privateDomains,
|
||||||
isOs: false,
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -131,6 +131,13 @@ export default class GatewaysComponent {
|
|||||||
handler: async (input: typeof spec._TYPE) => {
|
handler: async (input: typeof spec._TYPE) => {
|
||||||
const loader = this.loader.open('Saving').subscribe()
|
const loader = this.loader.open('Saving').subscribe()
|
||||||
|
|
||||||
|
console.log('FILE', input.config.value.file)
|
||||||
|
|
||||||
|
console.log(
|
||||||
|
'FILE STRINGIFIED',
|
||||||
|
JSON.stringify(input.config.value.file),
|
||||||
|
)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await this.api.addTunnel({
|
await this.api.addTunnel({
|
||||||
name: input.name,
|
name: input.name,
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ export default class StartOsUiComponent {
|
|||||||
torDomains: network.host.onions.map(o => `${o}.onion`),
|
torDomains: network.host.onions.map(o => `${o}.onion`),
|
||||||
publicDomains: getPublicDomains(network.host.publicDomains, gateways),
|
publicDomains: getPublicDomains(network.host.publicDomains, gateways),
|
||||||
privateDomains: network.host.privateDomains,
|
privateDomains: network.host.privateDomains,
|
||||||
isOs: true,
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -325,7 +325,10 @@ export namespace RR {
|
|||||||
}
|
}
|
||||||
export type OsUiRemovePrivateDomainRes = null
|
export type OsUiRemovePrivateDomainRes = null
|
||||||
|
|
||||||
export type PkgBindingToggleGatewayReq = ServerBindingToggleGatewayReq & {
|
export type PkgBindingToggleGatewayReq = Omit<
|
||||||
|
ServerBindingToggleGatewayReq,
|
||||||
|
'internalPort'
|
||||||
|
> & {
|
||||||
// package.host.binding.set-gateway-enabled
|
// package.host.binding.set-gateway-enabled
|
||||||
internalPort: number
|
internalPort: number
|
||||||
package: T.PackageId // string
|
package: T.PackageId // string
|
||||||
|
|||||||
Reference in New Issue
Block a user