api-server/src/modules/config/config.controller.ts
WangDL 8d52214dd5
Some checks failed
Deploy API Server / build-and-deploy (push) Has been cancelled
feat: M0-03 Config & Feature Flag — DB-backed config + Redis cache + Admin AAPI
2026-05-22 22:36:32 +08:00

57 lines
2.1 KiB
TypeScript

import { Controller, Get, Post, Patch, Delete, Body, Param, Query, Req, UseGuards } from '@nestjs/common';
import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger';
import { AppConfigService } from './config.service';
import { FeatureFlagService } from './feature-flag.service';
import { AdminAuthGuard } from '../../common/guards/admin-auth.guard';
import { AdminRolesGuard } from '../../common/guards/admin-roles.guard';
import { AdminRoles } from '../../common/decorators/admin-roles.decorator';
import type { AdminRole } from '../../common/types/admin-role.enum';
@ApiTags('admin-config')
@Controller('admin-api/config')
@UseGuards(AdminAuthGuard, AdminRolesGuard)
@ApiBearerAuth()
export class AppConfigController {
constructor(
private readonly config: AppConfigService,
private readonly flags: FeatureFlagService,
) {}
@Get()
@AdminRoles('SUPER_ADMIN' as AdminRole)
@ApiOperation({ summary: '配置列表' })
async list() { return { configs: await this.config.getAll(), flags: await this.flags.getAll() } }
@Post()
@AdminRoles('SUPER_ADMIN' as AdminRole)
async create(@Body() d: { key: string; value: string; description?: string }, @Req() req: any) {
await this.config.set(d.key, d.value, req.adminUser?.email);
return { success: true };
}
@Patch(':key')
@AdminRoles('SUPER_ADMIN' as AdminRole)
async update(@Param('key') key: string, @Body() d: { value: string }, @Req() req: any) {
await this.config.set(key, d.value, req.adminUser?.email);
return { success: true };
}
@Delete(':key')
@AdminRoles('SUPER_ADMIN' as AdminRole)
async remove(@Param('key') key: string) {
await this.config.delete(key);
return { success: true };
}
@Get('changelog')
@AdminRoles('SUPER_ADMIN' as AdminRole)
async changelog() { return this.config.getChangeLogs(); }
@Post('flags/:name')
@AdminRoles('SUPER_ADMIN' as AdminRole)
async toggleFlag(@Param('name') name: string, @Body() d: { enabled: boolean }, @Req() req: any) {
await this.flags.setEnabled(name, d.enabled, req.adminUser?.email);
return { success: true };
}
}