# API 契约:资料管理 --- ## POST /api/source/upload **权限**: UPLOADER **描述**: 上传文件,创建 source_data 记录,文件字节流写入 RustFS **请求**: `multipart/form-data`,字段:`file`(必填)、`dataType`(TEXT / IMAGE / VIDEO) **响应** `201`: ```json { "code": "SUCCESS", "data": { "id": 50, "fileName": "document.txt", "dataType": "TEXT", "fileSize": 204800, "status": "PENDING", "createdAt": "2026-04-09T10:00:00" } } ``` **失败**: - `400` `INVALID_TYPE`: 不支持的资料类型 - `400` `FILE_EMPTY`: 文件为空 --- ## GET /api/source/list **权限**: UPLOADER **描述**: 分页查询资料列表。UPLOADER 只见自己上传的资料;ADMIN 见本公司全部资料 **查询参数**: `page`(默认 1)、`pageSize`(默认 20)、`dataType`(可选)、`status`(可选) **响应** `200`: ```json { "code": "SUCCESS", "data": { "items": [ { "id": 50, "fileName": "document.txt", "dataType": "TEXT", "status": "PENDING", "uploaderId": 1, "createdAt": "2026-04-09T10:00:00" } ], "total": 120, "page": 1, "pageSize": 20 } } ``` --- ## GET /api/source/{id} **权限**: UPLOADER **描述**: 查看资料详情,含 RustFS 预签名临时下载链接(有效期 15 分钟) **响应** `200`: ```json { "code": "SUCCESS", "data": { "id": 50, "dataType": "TEXT", "fileName": "document.txt", "fileSize": 204800, "status": "EXTRACTING", "presignedUrl": "https://rustfs.example.com/...", "parentSourceId": null, "createdAt": "2026-04-09T10:00:00" } } ``` --- ## DELETE /api/source/{id} **权限**: ADMIN **描述**: 删除资料(同时删除 RustFS 文件及元数据) **前置条件**: 资料状态为 PENDING(不允许删除已进入流水线的资料) **响应** `204`: 无响应体 **失败**: `409` `SOURCE_IN_PIPELINE`: 资料已进入标注流程,不可删除