Files
dsh-web/web/API_REQUEST.md

33 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 前后端接口对接
根目录 API.md 是接口契约。公共请求封装与响应类型在 src/api.ts,实例、备份及管理员等组件也通过 api.request 发起业务请求。本文记录当前前端依赖,不将界面入口或请求成功等同于端到端验收。
## 运行与认证
Vite 开发监听 127.0.0.1,默认端口 5173(占用时自动尝试后续端口),代理至 http://127.0.0.1:8088;/dsh 启用 WebSocket 代理。生产构建目录为 web/dist,需由后端同源提供静态页面、/api 和 /dsh。
- 登录和 /api/me 返回 {user,csrf_token}。认证使用 HttpOnly Cookie;浏览器请求携带同源 Cookie,非 GET 请求从可读的 dsh_csrf Cookie 设置 X-CSRF-Token,而不是只使用内存中的旧 token。
- 存在 CSRF token 时,非登录/刷新请求的首次 401 会尝试恢复会话,再重试原请求;使用页内共享 Promise 和可用时的 Web Locks 协调刷新,刷新冲突后复验 /api/me。无法恢复的会话通过 session-expired 通知界面。
- 错误响应读取 {error:string};网络错误和非 JSON 成功响应均显示明确错误,不模拟成功。文件/备份下载和图片预览直接使用同源资源地址,不经过 JSON 请求封装。
## 响应结构与镜像构建
- 实例、镜像、构建历史、工作区目录、用户、审计、备份及孤儿容器的 GET 列表响应为顶层数组,不使用 data envelope;空列表应返回 []。其中 /api/orphans 返回容器 ID 字符串数组;详情、用量和操作结果不适用此列表约定。
- 镜像类型含 id、可选 image_id、version、status、admission、admission_reason、selectable 等字段;前端提交镜像标识时使用 image_id || id,仅允许 status=available 且 selectable=true 的镜像用于创建/升级。
- 构建历史通过 GET /api/builds?limit=...&offset=... 获取摘要;前端每页显示 20 条、多取 1 条判断下一页,不读取 X-Has-More。日志按需通过 GET /api/builds/{id} 的 logs 字段获取。
- 管理员通过 GET /api/releases/latest 检查 Git 发布,确认后 POST /api/releases/build {commit};构建来源字段包括 release_id、source_commit、source_repository。镜像准入使用 POST /api/images/admission {image_id,state,evidence}。不使用旧的 /api/latest、/api/compatibility、POST /api/builds 或创建意图接口。
- 工作区目录项读取 name/path/is_dir/size/mod_time;用量读取 used_bytes/quota_bytes;审计读取 user_id/created_at 等字段;备份读取 id/size/created_at。
## 已接入的业务操作
- 创建实例:POST /api/instances {name,image_id},当前前端不发送 version。启动/停止/重启调用实例对应子路径;删除使用 DELETE /api/instances/{id}。显示后端返回的实例状态,不把操作名称当作运行状态。
- Profile:读取 /profile 和 /profile-preview;停止实例后 PUT /profile {content,restart:true} 保存并启动验证。日志读取 /logs 的 logs 字段。上述路径均位于 /api/instances/{id} 下。
- 备份:GET /api/instances/{id}/backups 列表,POST 同路径 JSON {password} 创建,multipart file,password 导入;GET 同路径 ?download={backup_id} 下载;POST /api/instances/{id}/restore {backup_id,password} 恢复。
- 升级:POST /api/instances/{id}/upgrade {image_id,password}。创建备份和升级使用当前登录密码;导入/恢复使用原包密码,旧平台 key 包可留空。恢复和升级有二次确认。
- 工作区:/api/ws/tree、usage、mkdir、rename、delete、upload、download,并通过 instance 参数选择实例;上传使用 multipart file,path。图片预览使用 /api/ws/image;文本读取 /api/ws/text 返回 {content,version},保存 PUT 同路径 {content,version},冲突不静默覆盖。
- 账户管理:本人 POST /api/me/password;管理员通过 /api/users 创建用户、PATCH 修改配额,通过 /api/users/reset-password 重设密码,并读取 /api/audit。本人改密后重新登录,管理员重设按 reauthenticate 决定是否退出当前会话。孤儿容器回收使用 /api/orphans,删除提交 id 与 confirm。
## 验证边界
在 web/ 执行 npm test 和 npm run build 获取当前测试与构建结果,不沿用早期测试数量或临时服务状态。单元测试包含 fetch 替身,不能证明真实后端、Docker、WS/SSE 或数据恢复流程已验收;真实联调需独立测试环境和授权账号,具体后端限制与验收记录见根目录 API.md、README.md、ACCEPTANCE.md。