api-server/src/modules/ai-analysis/ai-analysis.controller.ts
WangDL 35de65e99b feat: 重构 api-server 为模块化单体架构,接入 MySQL + Redis
- 按 BACKEND-PLAN.md 将项目重构为 4 层架构:
  config/ -> common/ -> infrastructure/ -> modules/
- 15 个业务模块,遵循 Controller → Service → Repository 分层
- infrastructure: PrismaService / RedisService / QueueService / AiService / StorageService
- common: guards / interceptors / filters / pipes / decorators / dto / types / utils
- Prisma schema 含 27 张表,MySQL 8.0 服务器 db push 成功
- Redis 7 接入: 限流/任务状态/分布式锁/队列预留
- ai-analysis 模块: 每日 50 次限流 + 重复提交锁 + 异步任务状态追踪
- document-import 模块: 异步导入流程 + 进度追踪
- notifications 模块: BullMQ notification 队列预留
- /health 端点实时返回 database + redis 连接状态
- Swagger 注册 15 个 tag,67 个路由全部映射
2026-05-09 18:25:04 +08:00

30 lines
1.0 KiB
TypeScript

import { Controller, Get, Post, Body, Param } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { AiAnalysisService } from './ai-analysis.service';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import type { UserPayload } from '../../common/types';
@ApiTags('ai-analysis')
@Controller('ai-analysis')
export class AiAnalysisController {
constructor(private readonly service: AiAnalysisService) {}
@Post()
@ApiOperation({ summary: '提交 AI 分析任务' })
async create(@CurrentUser() user: UserPayload | undefined, @Body() body: any) {
return this.service.createJob(String(user?.id || 'anonymous'), body);
}
@Get(':id')
@ApiOperation({ summary: '获取 AI 分析结果' })
async findOne(@Param('id') id: string) {
return this.service.getResult(id);
}
@Get('jobs/:jobId/status')
@ApiOperation({ summary: '查询任务状态' })
async getJobStatus(@Param('jobId') jobId: string) {
return this.service.getJobStatus(jobId);
}
}