# API Contract

更新时间：2026-04-01

本文档只描述当前仓库里真实存在、且在 `cmd/server/main.go` 中实际接线的接口。

## 1. 基本约定

- 基础路径：`/api/v1`
- 认证方式：`Authorization: Bearer <access_token>`
- 当前实现不支持通过 query string 传递 token
- 统一响应：

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

- 基础设施接口不走统一响应：
  - `GET /health`
  - `GET /health/live`
  - `GET /health/ready`
  - `GET /metrics`
  - `GET /swagger/*any`

## 2. 当前公开接口

### 2.1 认证

- `POST /api/v1/auth/register`
  - 当请求体包含 `phone` 时，当前实现要求同时提供 `phone_code`
- `POST /api/v1/auth/bootstrap-admin`
- `POST /api/v1/auth/login`
- `POST /api/v1/auth/refresh`
- `GET /api/v1/auth/capabilities`
- `GET /api/v1/auth/activate`
- `POST /api/v1/auth/resend-activation`
- `POST /api/v1/auth/send-email-code`
- `POST /api/v1/auth/login/email-code`
- `POST /api/v1/auth/send-code`
- `POST /api/v1/auth/login/code`
- `GET /api/v1/auth/csrf-token`
- `GET /api/v1/auth/oauth/providers`
- `GET /api/v1/auth/oauth/:provider`
- `GET /api/v1/auth/oauth/:provider/callback`

说明：

- `/api/v1/auth/*` 当前会统一返回 `Cache-Control: no-store` 等防缓存头。

### 2.2 密码重置

- `POST /api/v1/auth/forgot-password`
- `GET /api/v1/auth/reset-password`
- `POST /api/v1/auth/reset-password`

### 2.3 验证码

- `GET /api/v1/auth/captcha`
- `GET /api/v1/auth/captcha/image`
- `POST /api/v1/auth/captcha/verify`

## 3. 当前受保护接口

### 3.1 认证与当前用户

- `POST /api/v1/auth/logout`
- `GET /api/v1/auth/userinfo`
- `GET /api/v1/auth/2fa/status`
- `GET /api/v1/auth/2fa/setup`
- `POST /api/v1/auth/2fa/enable`
- `POST /api/v1/auth/2fa/disable`
- `POST /api/v1/auth/2fa/verify`
- `GET /api/v1/users/me/social-accounts`
- `POST /api/v1/users/me/bind-social`
- `DELETE /api/v1/users/me/bind-social/:provider`

### 3.2 用户

- `GET /api/v1/users`
  - 当前要求管理员
  - 支持 `page`、`page_size`、`keyword`
  - 支持 `status=0|1|2|3`
  - 支持高级筛选：`role_ids`、`created_from`、`created_to`、`sort_by`、`sort_order`
- `GET /api/v1/users/:id`
  - 当前要求本人或管理员
- `PUT /api/v1/users/:id`
  - 当前要求本人或管理员
- `DELETE /api/v1/users/:id`
  - 当前要求权限 `user:delete`
- `PUT /api/v1/users/:id/password`
  - 当前只允许本人
- `PUT /api/v1/users/:id/status`
  - 当前要求权限 `user:manage`
- `GET /api/v1/users/:id/roles`
  - 当前要求本人或管理员
- `PUT /api/v1/users/:id/roles`
  - 当前要求权限 `user:manage`
- `POST /api/v1/users/:id/avatar`

### 3.3 角色与权限

以下接口全部要求管理员：

- `POST /api/v1/roles`
- `GET /api/v1/roles`
- `GET /api/v1/roles/:id`
- `PUT /api/v1/roles/:id`
- `DELETE /api/v1/roles/:id`
- `PUT /api/v1/roles/:id/status`
- `GET /api/v1/roles/:id/permissions`
- `PUT /api/v1/roles/:id/permissions`
- `POST /api/v1/permissions`
- `GET /api/v1/permissions`
- `GET /api/v1/permissions/tree`
- `GET /api/v1/permissions/:id`
- `PUT /api/v1/permissions/:id`
- `DELETE /api/v1/permissions/:id`
- `PUT /api/v1/permissions/:id/status`

### 3.4 设备

- `GET /api/v1/devices`
- `POST /api/v1/devices`
- `GET /api/v1/devices/:id`
- `PUT /api/v1/devices/:id`
- `DELETE /api/v1/devices/:id`
- `PUT /api/v1/devices/:id/status`
- `POST /api/v1/devices/:id/trust`
  - 设置设备信任状态，跳过2FA
  - 请求体: `{ "trust_duration": "30d" }` (可选，默认永久)
- `DELETE /api/v1/devices/:id/trust`
  - 取消设备信任状态
- `POST /api/v1/devices/by-device-id/:deviceId/trust`
  - 通过设备标识字符串设置信任状态
  - 请求体: `{ "trust_duration": "30d" }` (可选，默认永久)
- `GET /api/v1/devices/me/trusted`
  - 获取当前用户的信任设备列表
- `POST /api/v1/devices/me/logout-others`
  - 登出所有其他设备
  - 请求头: `X-Device-ID: <current_device_id>`
- `GET /api/v1/devices/users/:id`

### 3.5 日志

- `GET /api/v1/logs/login/me`
- `GET /api/v1/logs/operation/me`
- `GET /api/v1/logs/login`
  - 当前要求管理员
- `GET /api/v1/logs/operation`
  - 当前要求管理员

### 3.6 2FA / TOTP

- `GET /api/v1/auth/2fa/status`
- `GET /api/v1/auth/2fa/setup`
- `POST /api/v1/auth/2fa/enable`
- `POST /api/v1/auth/2fa/disable`
- `POST /api/v1/auth/2fa/verify`
  - 请求体: `{ "code": "123456", "device_id": "xxx" }` (device_id 可选)
  - 若设备已信任且未过期，跳过TOTP验证

### 3.7 Webhook

- `POST /api/v1/webhooks`
- `GET /api/v1/webhooks`
- `PUT /api/v1/webhooks/:id`
- `DELETE /api/v1/webhooks/:id`
- `GET /api/v1/webhooks/:id/deliveries`

### 3.8 管理员扩展接口

- `GET /api/v1/admin/users/export`
  - 支持 `format=csv|xlsx`
  - 支持 `fields=username,email,...`
  - 支持基础导出筛选：`keyword`、`status`
- `POST /api/v1/admin/users/import`
  - 当前支持上传 `.csv` 或 `.xlsx`
- `GET /api/v1/admin/users/import/template`
  - 支持 `format=csv|xlsx`
- `GET /api/v1/admin/stats/dashboard`
- `GET /api/v1/admin/stats/users`

## 4. 当前响应形态

### 4.1 列表接口

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "items": [],
    "total": 0,
    "page": 1,
    "page_size": 20
  }
}
```

### 4.2 登录成功

```json
{
  "code": 0,
  "message": "success",
  "data": {
    "access_token": "token",
    "refresh_token": "refresh-token",
    "expires_in": 7200,
    "user": {
      "id": 1,
      "username": "admin",
      "email": "admin@example.com",
      "phone": "",
      "nickname": "",
      "avatar": "",
      "status": 1
    }
  }
}
```

## 5. 运行时说明

- 当前主密码算法为 `Argon2id`
- 当前主 JWT 算法为 `RS256`
- 当前配置下短信验证码路由已挂载
- OAuth 路由始终存在，具体 provider 是否可用取决于配置是否填写真实凭据
