import { BadRequestException, Body, Controller, Get, Post, Put, UseGuards } from '@nestjs/common'; import type { SystemConfigUpdateRequest } from '@dukang/shared-types'; import { SYSTEM_CONFIG_GROUP_PERMISSION, SYSTEM_SETTINGS_PERMISSION_KEYS, type HqPermissionKey, } from '@dukang/shared-types'; import { HqAuthGuard } from '../../common/guards/hq-auth.guard'; import { SuperAdminGuard } from '../../common/guards/super-admin.guard'; import { HqPermissionGuard, HqPermissionsResolver, RequireAnySystemSettings, } from '../../common/guards/hq-permission.guard'; import { CurrentUser } from '../../common/decorators/current-user.decorator'; import type { AuthUser } from '../../common/guards/jwt-auth.guard'; import { HqOperation } from '../../common/hq-operation/hq-operation.decorator'; import { HqOperationAction } from '../../common/hq-operation/hq-operation.constants'; import { SystemConfigService } from '../../common/system-config/system-config.service'; import { WecomAibotService } from '../../integrations/wecom/wecom-aibot.service'; import { AlertService } from '../../common/alert/alert.service'; @Controller('admin/system-config') @UseGuards(HqAuthGuard, HqPermissionGuard) export class AdminSystemConfigController { constructor( private readonly systemConfig: SystemConfigService, private readonly permissions: HqPermissionsResolver, private readonly wecomAibot: WecomAibotService, private readonly alert: AlertService, ) {} @Get() @RequireAnySystemSettings() async getForm(@CurrentUser() user: AuthUser) { const keys = await this.permissions.resolveEffectiveKeys(user.actorId); const allowedGroups = allowedConfigGroups(keys); return this.systemConfig.getForm(allowedGroups); } @Put() @RequireAnySystemSettings() @HqOperation({ action: HqOperationAction.SYSTEM_CONFIG_UPDATE, refType: 'SYSTEM_CONFIG', refIdField: 'id', batch: true, includeBody: true, }) async update(@CurrentUser() user: AuthUser, @Body() dto: SystemConfigUpdateRequest) { const keys = await this.permissions.resolveEffectiveKeys(user.actorId); const allowedGroups = allowedConfigGroups(keys); const result = await this.systemConfig.update(dto, allowedGroups); if (result.updatedKeys.includes('WECOM_AIBOT_ENABLED')) { const wecomStatus = await this.wecomAibot.reload('system-config'); return { ...result, wecomAibot: wecomStatus }; } return result; } @Post('sync-env') @UseGuards(SuperAdminGuard) @HqOperation({ action: HqOperationAction.SYSTEM_CONFIG_SYNC_ENV, refType: 'SYSTEM_CONFIG', batch: true, }) syncEnv() { return this.systemConfig.syncToEnvFile(); } @Post('import-env') @UseGuards(SuperAdminGuard) @HqOperation({ action: HqOperationAction.SYSTEM_CONFIG_IMPORT_ENV, refType: 'SYSTEM_CONFIG', batch: true, }) importEnv() { return this.systemConfig.importFromProcessEnv(); } /** 向企微群机器人发送一条测试告警 */ @Post('wecom-alert/test') @RequireAnySystemSettings() @HqOperation({ action: HqOperationAction.WECOM_ALERT_TEST, refType: 'SYSTEM_CONFIG', batch: true, }) async testWecomAlert() { const result = await this.alert.sendTestAlert(); if (!result.ok) { throw new BadRequestException(result.message); } return result; } } function allowedConfigGroups(permissionKeys: HqPermissionKey[]): string[] | null { if (SYSTEM_SETTINGS_PERMISSION_KEYS.every((k) => permissionKeys.includes(k))) { return null; } return Object.entries(SYSTEM_CONFIG_GROUP_PERMISSION) .filter(([, perm]) => permissionKeys.includes(perm)) .map(([group]) => group); }