# API 接口文档

> 本项目 API 接口说明

---

## 一、接口概览

| 模块 | 接口 | 方法 | 说明 |
|------|------|------|------|
| 候选人 | `/api/candidates` | POST | 提交候选人信息（上传简历） |
| 房间 | `/api/rooms` | POST | 创建语音房间 |
| 管理 | `/api/candidates` | GET | 获取候选人列表 |
| 管理 | `/api/candidates/:id` | GET | 获取候选人详情 |
| 管理 | `/api/candidates/:id/export` | GET | 导出 PDF 报告 |

---

## 二、通用说明

### 2.1 基础 URL

```
开发环境：http://localhost:8000
生产环境：https://api.your-domain.com
```

### 2.2 响应格式

**成功响应**：
```json
{
  "code": 0,
  "message": "success",
  "data": { ... }
}
```

**错误响应**：
```json
{
  "code": 20001,
  "message": "参数错误",
  "data": null
}
```

### 2.3 错误码

| 范围 | 类型 |
|------|------|
| `0` | 成功 |
| `10000-19999` | 用户相关错误 |
| `20000-29999` | 业务逻辑错误 |
| `30000-39999` | 数据错误 |
| `40000-49999` | 系统错误 |
| `50000-59999` | 第三方服务错误 |

常用错误码：

| 错误码 | 说明 |
|--------|------|
| `20001` | 参数错误 |
| `20002` | 数据不存在 |
| `50001` | Coze API 调用失败 |
| `50002` | RTC 服务异常 |

---

## 三、用户端接口

### 3.1 提交候选人信息

提交候选人姓名和简历，创建面试会话。

**请求**

- **URL**: `POST /api/candidates`
- **Content-Type**: `multipart/form-data`

**请求参数**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| name | string | 是 | 候选人姓名，2-20字符 |
| resume | file | 是 | 简历文件，支持 PDF/DOC/DOCX，≤10MB |

**响应示例**

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "sessionId": "SESS_1705737600_张三_abc123",
    "fileId": "file_xxx"
  }
}
```

**处理流程**

1. 校验参数
2. 上传简历到 Coze（`POST /v1/files/upload`）
3. 生成 sessionId
4. 返回结果

---

### 3.2 创建语音房间

创建 RTC 房间，让 Coze Bot 加入房间。

**请求**

- **URL**: `POST /api/rooms`
- **Content-Type**: `application/json`

**请求参数**

```json
{
  "sessionId": "SESS_1705737600_张三_abc123",
  "fileId": "file_xxx"
}
```

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| sessionId | string | 是 | 会话 ID |
| fileId | string | 是 | 简历文件 ID |

**响应示例**

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "roomId": "room_xxx",
    "token": "rtc_token_xxx",
    "appId": "volcengine_app_id",
    "userId": "user_xxx"
  }
}
```

**处理流程**

1. 生成 roomId 和 userId
2. 调用 Coze API 让 Bot 加入房间（`POST /v1/audio/rooms`）
3. 生成 RTC Token
4. 返回房间信息

---

### 3.3 结束面试

通知后端面试已结束。

**请求**

- **URL**: `POST /api/interviews/:sessionId/end`
- **Content-Type**: `application/json`

**请求参数**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| sessionId | string | 是 | 会话 ID（URL 参数） |

**响应示例**

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "success": true
  }
}
```

---

## 四、管理后台接口

### 4.1 获取候选人列表

分页获取候选人列表。

**请求**

- **URL**: `GET /api/candidates`
- **权限**: 需要登录

**请求参数**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| page | number | 否 | 页码，默认 1 |
| pageSize | number | 否 | 每页条数，默认 20 |
| keyword | string | 否 | 搜索关键词（姓名） |
| status | string | 否 | 状态筛选：pending/ongoing/completed |
| startDate | string | 否 | 开始日期，格式 YYYY-MM-DD |
| endDate | string | 否 | 结束日期，格式 YYYY-MM-DD |

**响应示例**

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "list": [
      {
        "sessionId": "SESS_1705737600_张三_abc123",
        "name": "张三",
        "status": "completed",
        "score": 85,
        "createdAt": "2026-01-20T10:00:00+08:00"
      }
    ],
    "total": 100,
    "page": 1,
    "pageSize": 20
  }
}
```

---

### 4.2 获取候选人详情

获取候选人完整面试报告。

**请求**

- **URL**: `GET /api/candidates/:sessionId`
- **权限**: 需要登录

**请求参数**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| sessionId | string | 是 | 会话 ID（URL 参数） |

**响应示例**

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "sessionId": "SESS_1705737600_张三_abc123",
    "name": "张三",
    "resume": "简历内容文本...",
    "status": "completed",
    "currentStage": 60,
    "scores": {
      "salesSkill": 85,
      "salesMindset": 80,
      "quality": 90,
      "motivation": 75
    },
    "analysis": "综合分析报告内容...",
    "interviewLog": "完整对话记录...",
    "createdAt": "2026-01-20T10:00:00+08:00",
    "completedAt": "2026-01-20T10:25:00+08:00"
  }
}
```

---

### 4.3 导出 PDF 报告

导出候选人面试报告为 PDF 文件。

**请求**

- **URL**: `GET /api/candidates/:sessionId/export`
- **权限**: 需要登录

**请求参数**

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| sessionId | string | 是 | 会话 ID（URL 参数） |

**响应**

- **Content-Type**: `application/pdf`
- **Content-Disposition**: `attachment; filename="interview_report_张三.pdf"`

---

## 五、Coze API 调用说明

> 以下为后端调用 Coze API 的内部说明

### 5.1 文件上传

```
POST https://api.coze.cn/v1/files/upload
Authorization: Bearer {PAT_TOKEN}
Content-Type: multipart/form-data

Response:
{
  "data": {
    "id": "file_xxx"
  }
}
```

### 5.2 创建语音房间

```
POST https://api.coze.cn/v1/audio/rooms
Authorization: Bearer {PAT_TOKEN}
Content-Type: application/json

Body:
{
  "bot_id": "7595077233002840079",
  "room_id": "room_xxx",
  "user_id": "user_xxx",
  "voice_id": "voice_id_xxx",
  "config": {
    "input_file_id": "file_xxx"
  }
}
```

### 5.3 查询数据库

```
POST https://api.coze.cn/v1/database/query
Authorization: Bearer {PAT_TOKEN}
Content-Type: application/json

Body:
{
  "database_id": "7595077053909712922",
  "filter": {
    "session_id": "SESS_xxx"
  }
}
```

---

## 变更日志

| 日期 | 变更内容 | 操作人 |
|------|---------|--------|
| 2026-01-20 | 初始化 API 文档 | AI |
