700 lines
15 KiB
Markdown
700 lines
15 KiB
Markdown
# API 参考文档
|
||
|
||
本文档是当前后端接口边界的快速参考,不是 OpenAPI 替代品。
|
||
目标是帮助开发、重构、测试和 Code Review 快速回答三个问题:
|
||
|
||
- 这个能力现在走哪组接口
|
||
- 这组接口是否需要登录或管理员身份
|
||
- 这组接口当前属于稳定主线、兼容保留,还是正在迁移中的边界
|
||
|
||
如果接口细节和本文档冲突,以当前控制器和安全配置为准:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/config/SecurityConfig.java`
|
||
- `backend/src/main/java/com/yoyuzh/**/**/*Controller.java`
|
||
|
||
## 1. 接口分层总览
|
||
|
||
### 1.1 公开接口
|
||
|
||
无需登录即可访问:
|
||
|
||
- `/api/auth/**`
|
||
- `/api/app/android/**`
|
||
- `GET /api/v2/site/ping`
|
||
- `GET /api/v2/shares/{token}`
|
||
- `GET /api/v2/shares/{token}?download`
|
||
- `POST /api/v2/shares/{token}/verify-password`
|
||
- `/api/transfer/**`
|
||
- `GET /api/files/share-links/{token}`
|
||
- `/`
|
||
|
||
注意:
|
||
|
||
- `/api/transfer/**` 在安全层面是公开的,但其中“发送离线快传”“查看自己的离线快传”“导入到网盘”等操作会在控制器或业务层再要求登录。
|
||
|
||
### 1.2 登录后接口
|
||
|
||
需要 Bearer Token:
|
||
|
||
- `/api/user/**`
|
||
- `/api/files/**`
|
||
- `/api/v2/files/**`
|
||
- `/api/v2/tasks/**`
|
||
- `POST /api/v2/shares`
|
||
- `GET /api/v2/shares/mine`
|
||
- `DELETE /api/v2/shares/{id}`
|
||
- `POST /api/v2/shares/{token}/import`
|
||
|
||
### 1.3 管理接口
|
||
|
||
- `/api/admin/**`
|
||
|
||
要求:
|
||
|
||
- 已登录
|
||
- 通过 `@adminAccessEvaluator.isAdmin(authentication)` 校验
|
||
|
||
当前管理员事实源:
|
||
|
||
- 当前由 `@adminAccessEvaluator.isAdmin(authentication)` 统一判定。
|
||
- 实际判定基于认证里的角色 authority,而不是用户名白名单。
|
||
- 当前允许进入 `/api/admin/**` 的角色是 `ROLE_MODERATOR` 与 `ROLE_ADMIN`。
|
||
- 因此这里已经不再依赖 `app.admin.usernames` 作为管理权限来源。
|
||
|
||
## 2. 认证与用户模块
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/auth/AuthController.java`
|
||
- `backend/src/main/java/com/yoyuzh/auth/DevAuthController.java`
|
||
- `backend/src/main/java/com/yoyuzh/auth/UserController.java`
|
||
|
||
### 2.1 `POST /api/auth/register`
|
||
|
||
用途:
|
||
|
||
- 注册并直接签发登录态
|
||
|
||
关键规则:
|
||
|
||
- 需要邀请码
|
||
- 用户名、邮箱、手机号必须唯一
|
||
- 成功注册后自动创建默认目录
|
||
- 支持可选请求头 `X-Yoyuzh-Client: desktop|mobile`
|
||
|
||
### 2.2 `POST /api/auth/login`
|
||
|
||
用途:
|
||
|
||
- 普通登录
|
||
|
||
关键规则:
|
||
|
||
- 支持可选 `X-Yoyuzh-Client`
|
||
- 同一用户桌面端和移动端可以同时在线
|
||
- 同一客户端类型再次登录会挤掉旧会话
|
||
|
||
### 2.3 `POST /api/auth/refresh`
|
||
|
||
用途:
|
||
|
||
- 刷新 access token 和 refresh token
|
||
|
||
关键规则:
|
||
|
||
- refresh token 会旋转,旧 token 失效
|
||
- 默认按 `desktop` 兜底
|
||
- 若 refresh token 本身带有客户端类型,则沿用原客户端类型
|
||
|
||
### 2.4 `POST /api/auth/dev-login`
|
||
|
||
用途:
|
||
|
||
- 开发环境免密登录
|
||
|
||
约束:
|
||
|
||
- 仅 `dev` profile 下可用
|
||
- 支持可选 `X-Yoyuzh-Client`
|
||
|
||
### 2.5 `GET /api/user/profile`
|
||
|
||
用途:
|
||
|
||
- 获取当前登录用户资料
|
||
|
||
### 2.6 `PUT /api/user/profile`
|
||
|
||
用途:
|
||
|
||
- 修改个人资料
|
||
|
||
关键规则:
|
||
|
||
- 邮箱、手机号仍需保持唯一
|
||
|
||
### 2.7 `POST /api/user/password`
|
||
|
||
用途:
|
||
|
||
- 用户自行修改密码
|
||
|
||
关键规则:
|
||
|
||
- 旧密码必须正确
|
||
- 修改后旧会话和旧 refresh token 失效
|
||
- 会重新签发新的登录态
|
||
|
||
### 2.8 头像接口
|
||
|
||
- `POST /api/user/avatar/upload/initiate`
|
||
- `POST /api/user/avatar/upload`
|
||
- `POST /api/user/avatar/upload/complete`
|
||
- `GET /api/user/avatar/content`
|
||
|
||
用途:
|
||
|
||
- 用户头像上传与读取
|
||
|
||
关键规则:
|
||
|
||
- 头像属于资料域,不属于普通网盘目录
|
||
- 支持直传初始化和代理上传
|
||
- 完成上传时会替换旧头像引用
|
||
|
||
## 3. Android 发布接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/config/AndroidReleaseController.java`
|
||
|
||
### 3.1 `GET /api/app/android/latest`
|
||
|
||
用途:
|
||
|
||
- 获取最新 Android 安装包元信息
|
||
|
||
特点:
|
||
|
||
- 公开接口
|
||
- 读取后端当前发布元数据
|
||
|
||
### 3.2 下载接口
|
||
|
||
- `GET /api/app/android/download`
|
||
- `GET /api/app/android/download/{fileName}`
|
||
|
||
用途:
|
||
|
||
- 下载当前或指定名称的 Android 安装包
|
||
|
||
特点:
|
||
|
||
- 公开接口
|
||
|
||
## 4. 网盘主接口(旧主线,仍在使用)
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/files/core/FileController.java`
|
||
|
||
这组接口仍然是当前网盘主业务入口,尤其是:
|
||
|
||
- 列表
|
||
- 目录创建
|
||
- 文件操作
|
||
- 下载
|
||
- 回收站
|
||
- 旧分享接口
|
||
|
||
### 4.1 上传接口
|
||
|
||
- `POST /api/files/upload`
|
||
- `POST /api/files/upload/initiate`
|
||
- `POST /api/files/upload/complete`
|
||
|
||
用途:
|
||
|
||
- 兼容旧上传流程
|
||
|
||
当前定位:
|
||
|
||
- 仍可用
|
||
- 但新上传主线已经转向 v2 上传会话
|
||
|
||
关键规则:
|
||
|
||
- 路径和文件名必须合法
|
||
- 同目录禁止重名
|
||
- 受系统限制、用户限制、默认存储策略限制共同约束
|
||
|
||
### 4.2 目录与列表
|
||
|
||
- `POST /api/files/mkdir`
|
||
- `GET /api/files/list`
|
||
- `GET /api/files/recent`
|
||
|
||
用途:
|
||
|
||
- 创建目录
|
||
- 分页列目录
|
||
- 最近文件
|
||
|
||
关键规则:
|
||
|
||
- `path` 必须是合法目录路径
|
||
- 创建目录时根目录 `/` 不能再次创建
|
||
|
||
### 4.3 下载
|
||
|
||
- `GET /api/files/download/{fileId}`
|
||
- `GET /api/files/download/{fileId}/url`
|
||
|
||
用途:
|
||
|
||
- 下载文件或目录压缩包
|
||
- 获取可直接下载的 URL
|
||
|
||
关键规则:
|
||
|
||
- 目录下载会被压缩为 zip
|
||
- 普通文件优先返回直链或重定向
|
||
- 特定公开安装包走专用下载逻辑
|
||
|
||
### 4.4 文件操作
|
||
|
||
- `PATCH /api/files/{fileId}/rename`
|
||
- `PATCH /api/files/{fileId}/move`
|
||
- `POST /api/files/{fileId}/copy`
|
||
- `DELETE /api/files/{fileId}`
|
||
|
||
用途:
|
||
|
||
- 重命名
|
||
- 移动
|
||
- 复制
|
||
- 删除
|
||
|
||
关键规则:
|
||
|
||
- `DELETE` 语义是“移入回收站”,不是立即物理删除
|
||
- 目录不能移动或复制到自己或自己的子目录
|
||
- 所有写操作都要经过同名冲突和配额判断
|
||
|
||
### 4.5 回收站
|
||
|
||
- `GET /api/files/recycle-bin`
|
||
- `POST /api/files/recycle-bin/{fileId}/restore`
|
||
|
||
用途:
|
||
|
||
- 查看回收站根条目
|
||
- 恢复回收站条目
|
||
|
||
关键规则:
|
||
|
||
- 恢复按整组恢复
|
||
- 恢复前检查原路径冲突和配额
|
||
|
||
### 4.6 旧分享接口
|
||
|
||
- `POST /api/files/{fileId}/share-links`
|
||
- `GET /api/files/share-links/{token}`
|
||
- `POST /api/files/share-links/{token}/import`
|
||
|
||
用途:
|
||
|
||
- 旧版分享创建、查看、导入
|
||
|
||
当前定位:
|
||
|
||
- 仍存在
|
||
- 但新分享主线已经转向 `/api/v2/shares/**`
|
||
|
||
注意:
|
||
|
||
- 旧接口和 v2 分享接口能力并不完全一致
|
||
- 后续开发应优先确认是否继续沿用这套接口
|
||
|
||
## 5. v2 文件接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/files/UploadSessionV2Controller.java`
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/files/FileSearchV2Controller.java`
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/files/FileEventsV2Controller.java`
|
||
|
||
这组接口当前承担的是“新能力”而不是完整替代旧 `/api/files/**`。
|
||
|
||
### 5.1 v2 上传会话
|
||
|
||
- `POST /api/v2/files/upload-sessions`
|
||
- `GET /api/v2/files/upload-sessions/{sessionId}`
|
||
- `DELETE /api/v2/files/upload-sessions/{sessionId}`
|
||
- `GET /api/v2/files/upload-sessions/{sessionId}/prepare`
|
||
- `POST /api/v2/files/upload-sessions/{sessionId}/content`
|
||
- `GET /api/v2/files/upload-sessions/{sessionId}/parts/{partIndex}/prepare`
|
||
- `PUT /api/v2/files/upload-sessions/{sessionId}/parts/{partIndex}`
|
||
- `POST /api/v2/files/upload-sessions/{sessionId}/complete`
|
||
|
||
用途:
|
||
|
||
- 统一上传会话生命周期
|
||
|
||
上传模式:
|
||
|
||
- `PROXY`
|
||
- `DIRECT_SINGLE`
|
||
- `DIRECT_MULTIPART`
|
||
|
||
关键规则:
|
||
|
||
- 上传模式由默认存储策略能力决定
|
||
- 会话只属于创建者
|
||
- 已完成、已取消、已过期、已失败会话不能继续上传
|
||
- multipart 必须先准备分片上传,再记录分片,再完成会话
|
||
|
||
### 5.2 文件搜索
|
||
|
||
- `GET /api/v2/files/search`
|
||
|
||
用途:
|
||
|
||
- 组合条件搜索当前用户文件
|
||
|
||
支持条件:
|
||
|
||
- 名称
|
||
- 类型 `file|directory|all`
|
||
- 大小上下界
|
||
- 创建时间上下界
|
||
- 更新时间上下界
|
||
- 分页
|
||
|
||
### 5.3 文件事件流
|
||
|
||
- `GET /api/v2/files/events`
|
||
|
||
用途:
|
||
|
||
- SSE 订阅文件变更事件
|
||
|
||
关键参数:
|
||
|
||
- `path`,默认 `/`
|
||
- 可选请求头 `X-Yoyuzh-Client-Id`
|
||
|
||
## 6. v2 分享接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/shares/ShareV2Controller.java`
|
||
|
||
这是当前更完整的分享接口组。
|
||
|
||
### 6.1 创建与管理
|
||
|
||
- `POST /api/v2/shares`
|
||
- `GET /api/v2/shares/mine`
|
||
- `DELETE /api/v2/shares/{id}`
|
||
|
||
用途:
|
||
|
||
- 创建分享
|
||
- 查看自己创建的分享
|
||
- 删除自己的分享
|
||
|
||
关键规则:
|
||
|
||
- 当前只支持文件,不支持目录
|
||
- 可设置密码、过期时间、最大次数、是否允许下载、是否允许导入
|
||
|
||
### 6.2 公共访问
|
||
|
||
- `GET /api/v2/shares/{token}`
|
||
- `GET /api/v2/shares/{token}?download`
|
||
- `POST /api/v2/shares/{token}/verify-password`
|
||
|
||
用途:
|
||
|
||
- 查看分享
|
||
- 下载分享
|
||
- 验证密码
|
||
|
||
关键规则:
|
||
|
||
- 公开可访问
|
||
- 过期或次数耗尽后失效
|
||
- 有密码时需要先验密,或下载时携带密码
|
||
|
||
### 6.3 导入分享
|
||
|
||
- `POST /api/v2/shares/{token}/import`
|
||
|
||
用途:
|
||
|
||
- 把分享文件导入自己的网盘
|
||
|
||
关键规则:
|
||
|
||
- 必须登录
|
||
- 受 `allowImport` 开关控制
|
||
- 当前实现中会消耗同一个分享次数额度
|
||
|
||
## 7. 快传接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/transfer/TransferController.java`
|
||
|
||
### 7.1 会话创建与查询
|
||
|
||
- `POST /api/transfer/sessions`
|
||
- `GET /api/transfer/sessions/lookup`
|
||
- `POST /api/transfer/sessions/{sessionId}/join`
|
||
|
||
用途:
|
||
|
||
- 创建在线或离线快传会话
|
||
- 通过取件码查找会话
|
||
- 加入在线会话或确认离线会话
|
||
|
||
关键规则:
|
||
|
||
- 创建在线快传允许匿名
|
||
- 创建离线快传要求登录
|
||
- 在线快传只允许首个接收者加入
|
||
|
||
### 7.2 离线快传文件
|
||
|
||
- `GET /api/transfer/sessions/offline/mine`
|
||
- `POST /api/transfer/sessions/{sessionId}/files/{fileId}/content`
|
||
- `GET /api/transfer/sessions/{sessionId}/files/{fileId}/download`
|
||
- `POST /api/transfer/sessions/{sessionId}/files/{fileId}/import`
|
||
|
||
用途:
|
||
|
||
- 查看自己的离线快传记录
|
||
- 上传离线快传文件
|
||
- 下载离线快传文件
|
||
- 导入离线快传文件到网盘
|
||
|
||
关键规则:
|
||
|
||
- 查看自己的离线快传记录需要登录
|
||
- 上传离线快传文件需要登录且必须是发送者本人
|
||
- 下载可匿名,但会话必须已 `ready`
|
||
- 导入需要登录
|
||
|
||
### 7.3 在线快传信令
|
||
|
||
- `POST /api/transfer/sessions/{sessionId}/signals`
|
||
- `GET /api/transfer/sessions/{sessionId}/signals`
|
||
|
||
用途:
|
||
|
||
- WebRTC/在线快传信令交换
|
||
|
||
特点:
|
||
|
||
- 公开访问
|
||
- 仅对在线会话有意义
|
||
|
||
## 8. v2 后台任务接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/tasks/BackgroundTaskV2Controller.java`
|
||
|
||
### 8.1 列表与详情
|
||
|
||
- `GET /api/v2/tasks`
|
||
- `GET /api/v2/tasks/{id}`
|
||
|
||
用途:
|
||
|
||
- 查看当前用户自己的后台任务
|
||
|
||
### 8.2 取消与重试
|
||
|
||
- `DELETE /api/v2/tasks/{id}`
|
||
- `POST /api/v2/tasks/{id}/retry`
|
||
|
||
用途:
|
||
|
||
- 取消自己的任务
|
||
- 重试失败任务
|
||
|
||
关键规则:
|
||
|
||
- 只有失败任务可以重试
|
||
|
||
### 8.3 创建任务
|
||
|
||
- `POST /api/v2/tasks/archive`
|
||
- `POST /api/v2/tasks/extract`
|
||
- `POST /api/v2/tasks/media-metadata`
|
||
|
||
用途:
|
||
|
||
- 为当前用户文件创建归档、解压、媒体元数据任务
|
||
|
||
关键规则:
|
||
|
||
- 任务目标文件必须属于当前用户
|
||
- 提交的 `path` 必须与文件当前逻辑路径一致
|
||
- 不同任务类型对文件类型有额外要求
|
||
|
||
## 9. 管理接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/admin/AdminController.java`
|
||
|
||
当前管理端覆盖的是真实治理能力,不只是统计看板。
|
||
|
||
### 9.1 概览与系统设置
|
||
|
||
- `GET /api/admin/summary`
|
||
- `GET /api/admin/settings`
|
||
- `PATCH /api/admin/settings/registration/invite-code`
|
||
- `POST /api/admin/settings/registration/invite-code/rotate`
|
||
- `GET /api/admin/filesystem`
|
||
- `PATCH /api/admin/settings/offline-transfer-storage-limit`
|
||
|
||
用途:
|
||
|
||
- 查看全局指标
|
||
- 查看系统设置快照
|
||
- 修改邀请码
|
||
- 轮换邀请码
|
||
- 查看文件系统与存储能力
|
||
- 修改离线快传总容量上限
|
||
|
||
注意:
|
||
|
||
- 当前管理台“可写设置”边界很窄,很多设置只是只读快照
|
||
|
||
### 9.2 用户治理
|
||
|
||
- `GET /api/admin/users`
|
||
- `PATCH /api/admin/users/{userId}/role`
|
||
- `PATCH /api/admin/users/{userId}/status`
|
||
- `PUT /api/admin/users/{userId}/password`
|
||
- `PATCH /api/admin/users/{userId}/storage-quota`
|
||
- `PATCH /api/admin/users/{userId}/max-upload-size`
|
||
- `POST /api/admin/users/{userId}/password/reset`
|
||
|
||
用途:
|
||
|
||
- 用户查询与治理
|
||
|
||
关键规则:
|
||
|
||
- 封禁用户会让旧登录态失效
|
||
- 管理员修改用户密码会让旧登录态失效
|
||
- 密码仍需满足密码规则
|
||
|
||
### 9.3 文件、分享、任务、实体
|
||
|
||
- `GET /api/admin/files`
|
||
- `DELETE /api/admin/files/{fileId}`
|
||
- `GET /api/admin/file-blobs`
|
||
- `GET /api/admin/shares`
|
||
- `DELETE /api/admin/shares/{shareId}`
|
||
- `GET /api/admin/tasks`
|
||
- `GET /api/admin/tasks/{taskId}`
|
||
|
||
用途:
|
||
|
||
- 全局文件治理
|
||
- 全局分享治理
|
||
- 全局任务治理
|
||
- 全局文件实体 / blob 视图
|
||
|
||
### 9.4 存储策略
|
||
|
||
- `GET /api/admin/storage-policies`
|
||
- `POST /api/admin/storage-policies`
|
||
- `PUT /api/admin/storage-policies/{policyId}`
|
||
- `PATCH /api/admin/storage-policies/{policyId}/status`
|
||
- `POST /api/admin/storage-policies/migrations`
|
||
|
||
用途:
|
||
|
||
- 查询、创建、修改、启停存储策略
|
||
- 创建迁移任务
|
||
|
||
关键规则:
|
||
|
||
- 默认策略不能被禁用
|
||
- 迁移当前只支持同运行时后端类型
|
||
- 目标策略必须已启用
|
||
|
||
## 10. 站点健康接口
|
||
|
||
控制器:
|
||
|
||
- `backend/src/main/java/com/yoyuzh/api/v2/site/SiteV2Controller.java`
|
||
- `backend/src/main/java/com/yoyuzh/config/ApiRootController.java`
|
||
|
||
### 10.1 `GET /api/v2/site/ping`
|
||
|
||
用途:
|
||
|
||
- v2 站点健康检查
|
||
|
||
### 10.2 `GET /`
|
||
|
||
用途:
|
||
|
||
- 根路径可用性检查
|
||
|
||
## 11. 当前接口演进状态
|
||
|
||
### 11.1 当前稳定主线
|
||
|
||
- 认证与用户资料:`/api/auth/**`、`/api/user/**`
|
||
- 网盘主操作:`/api/files/**`
|
||
- 快传:`/api/transfer/**`
|
||
- 管理台:`/api/admin/**`
|
||
- 新分享主线:`/api/v2/shares/**`
|
||
- 新上传主线:`/api/v2/files/upload-sessions/**`
|
||
- 新任务主线:`/api/v2/tasks/**`
|
||
|
||
### 11.2 当前并存边界
|
||
|
||
- 旧分享:`/api/files/share-links/**`
|
||
- 新分享:`/api/v2/shares/**`
|
||
- 旧上传:`/api/files/upload/**`
|
||
- 新上传:`/api/v2/files/upload-sessions/**`
|
||
|
||
这些边界当前是“并存”,不是“完全迁移完成”。
|
||
|
||
## 12. 接口层已知风险
|
||
|
||
1. 管理员权限规则不由单一领域字段决定,容易在前后端或测试里误判。
|
||
2. 旧分享和 v2 分享并存,后续加需求时容易加错接口组。
|
||
3. 旧上传与 v2 上传会话并存,规则变更时容易只改一边。
|
||
4. `/api/transfer/**` 安全层公开、业务层局部要求登录,这个边界必须在测试里显式覆盖。
|
||
5. 当前没有一份单独文档明确“哪些接口是兼容保留,哪些接口是后续唯一主线”,后续若继续演进应优先补这条决策。
|
||
|
||
## 13. 2026-04-11 Admin 审计能力补充
|
||
|
||
管理台新增审计查询接口(只读):
|
||
|
||
- `GET /api/admin/audits`
|
||
|
||
用途:
|
||
|
||
- 查询管理端治理写操作的审计日志;
|
||
- 支持按 `actorQuery`、`actionType`、`targetType`、`targetId` 过滤;
|
||
- 返回字段包含 actor、action、target、summary、detailsJson、createdAt。
|
||
|
||
当前接入审计记录的写路径:
|
||
|
||
- 设置治理:邀请码更新/轮换、离线快传容量上限更新
|
||
- 用户治理:角色、封禁、密码、配额、上传上限、重置密码
|
||
- 资源治理:删除分享、删除文件
|
||
- 存储治理:策略创建、更新、启停、迁移任务创建
|