# backend-dev - 发现记录

> 工作中发现的问题和技术要点。

---

## OPT-08: 一键完整生成 API

### 实现的文件

1. **server/src/modules/book-generator/book-generator.service.ts** - 编排服务
   - `BatchGenerationOrchestrator` 类：按顺序执行各生成步骤
   - 支持的步骤：`generate_content`, `generate_audio`, `merge_audio`, `generate_video`, `merge_video`
   - 取消标志管理：支持用户随时取消任务
   - 实时进度推送：通过 WebSocket 发送 `batch_generation_progress` 事件

2. **server/src/modules/book-generator/book-generator.controller.ts** - API 路由
   - `POST /api/book-generator/books/:id/batch-generate` - 启动批量生成
   - `POST /api/book-generator/books/:id/batch-generate/cancel` - 取消任务
   - `GET /api/book-generator/books/:id/batch-generate/status` - 查询任务状态

3. **server/src/app.ts** - 路由挂载
   - 新增 `bookGeneratorRoutes` 导入和挂载

### 实现要点

- 内容生成步骤复用 `langGraphGenerator.generate()` 接口
- 音频/视频生成复用现有的 `bookStore.generateChapterAudioById()` 和 `createVideoProjectFromBook()` 接口
- 通过轮询方式监控子任务完成状态
- 取消机制使用内存标志，已完成步骤保留

### 注意事项

- 批量生成任务存储在内存 Map 中，服务重启后会丢失运行状态
- 视频合并步骤简化处理（直接使用第一个子章节视频）
- 最大等待时间为 60 分钟（内容/音频/视频生成各自）

---

## OPT-12: 意见反馈 API

### 实现的文件

1. **server/src/modules/feedback/feedback.service.ts** - 反馈服务
   - `FeedbackInput` 接口：定义输入参数
   - `submitFeedback()` 方法：保存反馈到数据库
   - 使用 uuid 作为反馈 ID

2. **server/src/modules/feedback/feedback.controller.ts** - 反馈控制器
   - `POST /api/feedback` - 提交反馈接口
   - 参数验证：type, title, content 必填
   - type 只能是 suggestion, bug, other

3. **server/prisma/schema.prisma** - 数据模型
   - 新增 `Feedback` 模型
   - 字段：id, type, title, content, contact, screenshotUrls, status, createdAt, updatedAt

4. **server/src/app.ts** - 路由挂载
   - 新增 `feedbackRoutes` 导入和挂载

### API 规范

- 端点：`POST /api/feedback`
- Request:
  ```json
  {
    "type": "suggestion|bug|other",
    "title": "string",
    "content": "string",
    "contact": "string",
    "screenshotUrls": ["string"]
  }
  ```
- Response:
  ```json
  {
    "code": 0,
    "message": "success",
    "data": {
      "id": "uuid",
      "status": "submitted"
    }
  }
  ```

### 后续步骤

- 运行 `npx prisma generate` 生成客户端
- 运行 `npx prisma db push` 更新数据库表

---
