import { Body, Inject, Post, Provide } from '@midwayjs/core'; import { Context } from '@midwayjs/koa'; import { CoolController, BaseController } from '@cool-midway/core'; import { TeamDomainEntity } from '../../entity/domain'; import { TeamDomainService } from '../../service/domain'; import { BindDomainDTO, SslCertMockInfo } from '../../../../comm/types/omni'; /** * 后台租户域名标准 CRUD 配置 */ export const adminTeamDomainCurdOption = { api: ['add', 'delete', 'update', 'info', 'list', 'page'] as Array< 'add' | 'delete' | 'update' | 'info' | 'list' | 'page' >, entity: TeamDomainEntity, service: TeamDomainService, serviceApis: [ { method: 'validate', summary: '域名格式校验' }, { method: 'verifyDns', summary: 'CNAME 解析核验' }, { method: 'checkSsl', summary: 'SSL 证书检测' }, { method: 'bind', summary: '绑定独立域名' }, ], pageQueryOp: { keyWordLikeFields: ['a.custom_domain'], fieldEq: [{ column: 'a.ssl_status', requestParam: 'sslStatus' }], addOrderBy: { update_time: 'desc' as const }, }, }; /** * 企业团队-租户域名与 SSL 治理 * 路由前缀:/admin/team/domain */ @Provide() @CoolController(adminTeamDomainCurdOption) export class AdminTeamDomainController extends BaseController { @Inject() ctx: Context; @Inject() teamDomainService: TeamDomainService; /** * 域名格式严格正则检验 */ @Post('/validate', { summary: '域名格式校验' }) async validate(@Body() body: { domain: string }) { const result = this.teamDomainService.validateDomainFormat(body?.domain); return this.ok(result); } /** * CNAME DNS 解析核验 */ @Post('/verify-dns', { summary: 'CNAME 解析核验' }) async verifyDns( @Body() body: { domain: string; targetCname?: string; mockRecords?: string[]; } ) { const targetCname = body?.targetCname || 'cname.omnicard.ai'; const result = await this.teamDomainService.verifyDnsRecord( body?.domain, targetCname, { mockRecords: body?.mockRecords } ); return this.ok(result); } /** * SSL 证书状态与过期时间检测 */ @Post('/check-ssl', { summary: 'SSL 证书检测' }) async checkSsl( @Body() body: { domain: string; port?: number; mockCert?: SslCertMockInfo; } ) { const result = await this.teamDomainService.checkSslCertificate( body?.domain, body?.port, { mockCert: body?.mockCert } ); return this.ok(result); } /** * 绑定独立域名 */ @Post('/bind', { summary: '绑定独立域名' }) async bind(@Body() body: BindDomainDTO) { const tenantId = body?.tenantId || ((this.ctx?.admin as unknown as { tenantId?: number })?.tenantId) || ((this.ctx as unknown as { tenantId?: number })?.tenantId); const result = await this.teamDomainService.bindDomain( tenantId || 0, body?.domain, { cnameTarget: body?.cnameTarget } ); return this.ok(result); } }