In Progress
As a 超级管理员, I want 一个统一的后端文件模块(无租户隔离), so that 可以在租户管理后台统一管理所有文件,统一广告模块使用的文件与其他统一模块保持一致的数据隔离模式。
当前问题:
unified-advertisements-module) 使用 @d8d/core-module-mt/file-module-mt 的 FileMt 实体(多租户,有tenant_id)解决方案:
file-module 复制创建统一版本unified-file-module(无tenant_id字段)UnifiedFile 实体packages/unified-file-module 包,从 file-module 复制并改造为无租户隔离版本tenant_id 字段,与原 file-module 的Entity结构相同但移除租户隔离tenantAuthMiddleware),只有超级管理员(ID=1)可访问[x] 任务1: 创建包结构和配置文件 (AC: 1)
packages/unified-file-module 目录package.json,配置包名为 @d8d/unified-file-moduletsconfig.jsonvitest.config.ts(设置 fileParallelism: false)src/ 子目录:entities/, services/, routes/, schemas/tests/ 子目录:integration/, unit/, utils/[x] 任务2: 定义Entity(无tenant_id字段) (AC: 2)
src/entities/unified-file.entity.ts,参考 file-module 但移除 tenant_id 字段id, fileName, filePath, fileSize, mimeType, status, createdAt, updatedAt, createdBy, updatedBy@Index 索引(status, createdAt等)src/entities/index.ts 导出Entity[x] 任务3: 实现Service层 (AC: 1)
src/services/unified-file.service.ts,继承 GenericCrudServicecreate、update、delete 方法(使用 override 关键字)status=0)src/services/index.ts 导出Service[x] 任务4: 定义Schema (AC: 1)
src/schemas/unified-file.schema.ts,使用 Zod + OpenAPI装饰器z.coerce.date<Date>() 和 z.coerce.number<number>() 泛型语法CreateUnifiedFileDto、UpdateUnifiedFileDto、UnifiedFileListResponseSchemaz.infer),类型由RPC自动推断src/schemas/index.ts 导出Schema[x] 任务5: 实现管理员路由 (AC: 3)
src/routes/admin/unified-files.admin.routes.tsOpenAPIHono 和 AuthContext 泛型createRoute 定义路由,包含请求/响应SchematenantAuthMiddleware 中间件(只有超级管理员可访问)parseWithAwait 验证响应数据createZodErrorResponse 处理Zod错误[x] 任务6: 实现文件上传处理 (AC: 4)
[x] 任务7: 创建包导出入口 (AC: 1)
src/index.ts,导出Entities、Services、Routes、Schemaspackage.json 的 exports 字段[x] 任务8: 编写单元测试 (AC: 5)
[x] 任务9: 编写集成测试 (AC: 5)
tests/integration/unified-files.integration.test.tstenantAuthMiddleware 权限)[x] 任务10: 代码质量检查
pnpm test 确保所有测试通过 (8/8 通过)[ ] 任务11: 创建文件上传策略路由 (AC: 4)
src/routes/upload-policy/post.ts,参考 file-module 对应文件tenantAuthMiddleware 中间件[ ] 任务12: 创建分片上传策略路由 (AC: 4)
src/routes/multipart-policy/post.ts,参考 file-module 对应文件tenantAuthMiddleware 中间件[ ] 任务13: 创建分片上传完成路由 (AC: 4)
src/routes/multipart-complete/post.ts,参考 file-module 对应文件tenantAuthMiddleware 中间件[ ] 任务14: 创建获取文件URL路由 (AC: 4)
src/routes/[id]/get-url.ts,参考 file-module 对应文件GET /:id/url 端点tenantAuthMiddleware 中间件[ ] 任务15: 创建文件删除路由 (AC: 4)
src/routes/[id]/delete.ts,参考 file-module 对应文件DELETE /:id 端点tenantAuthMiddleware 中间件[ ] 任务16: 创建文件下载路由 (AC: 4)
src/routes/[id]/download.ts,参考 file-module 对应文件GET /:id/download 端点(返回带 Content-Disposition 的 URL)tenantAuthMiddleware 中间件[ ] 任务17: 更新路由入口文件 (AC: 4)
src/routes/index.ts,聚合所有路由createCrudRoutes 生成基础 CRUD 路由unifiedFileRoutes 路由集合[ ] 任务18: 创建测试工具文件
tests/utils/integration-test-utils.ts,参考 file-module 对应文件IntegrationTestAssertions 类(expectFileToExist 等方法)UnifiedFile 实体[ ] 任务19: 创建测试数据工厂
tests/utils/integration-test-db.ts,参考 file-module 对应文件TestDataFactory 类UnifiedFile 实体字段[ ] 任务20: 补充集成测试
[ ] 任务21: 完整回归测试
pnpm test 确保所有测试通过pnpm typecheck 确保无类型错误新包位置:
packages/unified-file-module/
├── package.json
├── tsconfig.json
├── vitest.config.ts
├── src/
│ ├── entities/
│ │ ├── unified-file.entity.ts
│ │ └── index.ts
│ ├── services/
│ │ ├── unified-file.service.ts
│ │ └── index.ts
│ ├── routes/
│ │ ├── admin/
│ │ │ └── unified-files.admin.routes.ts
│ │ └── index.ts
│ ├── schemas/
│ │ ├── unified-file.schema.ts
│ │ └── index.ts
│ └── index.ts
└── tests/
├── integration/
│ └── unified-files.integration.test.ts
├── unit/
│ └── unified-file.service.test.ts
└── utils/
└── test-data-factory.ts
参考模块:
packages/file-modulepackages/unified-advertisements-module@d8d/core-module-mt/auth-module-mt@d8d/tenant-module-mt统一文件Entity (unified-file.entity.ts):
file-module 的Entity结构tenant_id 字段id, fileName, filePath, fileSize, mimeType, status, createdAt, updatedAt, createdBy, updatedBy管理员接口 (完整列表):
# 文件上传策略
POST /api/v1/admin/unified-files/upload-policy # 生成MinIO上传策略
POST /api/v1/admin/unified-files/multipart-policy # 生成分片上传策略
POST /api/v1/admin/unified-files/multipart-complete # 完成分片上传
# 文件操作(通过createCrudRoutes自动生成)
GET /api/v1/admin/unified-files # 文件列表
POST /api/v1/admin/unified-files # 创建文件记录
GET /api/v1/admin/unified-files/:id # 获取文件详情
PUT /api/v1/admin/unified-files/:id # 更新文件记录
# 文件专用操作
GET /api/v1/admin/unified-files/:id/url # 获取文件访问URL
GET /api/v1/admin/unified-files/:id/download # 获取文件下载URL
DELETE /api/v1/admin/unified-files/:id # 删除文件(MinIO+DB)
管理员路由:
tenantAuthMiddleware(来自 @d8d/tenant-module-mt,独立包)文件上传流程:
| 测试类型 | 最低要求 | 目标要求 |
|---|---|---|
| 单元测试 | 70% | 80% |
| 集成测试 | 50% | 60% |
status=0 而非物理删除tests/unit/tests/integration/tests/utils/# 进入模块目录
cd packages/unified-file-module
# 运行所有测试
pnpm test
# 运行集成测试
pnpm test:integration
# 生成覆盖率报告
pnpm test:coverage
# 类型检查
pnpm typecheck
| Date | Version | Description | Author |
|---|---|---|---|
| 2026-01-03 | 1.0 | 初始故事创建 | James (Claude Code) |
| 2026-01-04 | 1.1 | 修复阶段 - 修复vitest配置、Entity、Service、Schema、测试 | James (Claude Code) |
| 2026-01-04 | 1.2 | 发现缺失功能 - 添加补充任务11-21,补充完整的路由功能(上传策略、分片上传、URL获取、下载、删除)和测试工具 | James (Claude Code) |
claude-opus-4-5-20251101 (via Happy)
无特殊调试需求,所有测试一次性通过。
修复了初始创建的代码问题:
集成测试设计:
测试结果:
🚨 发现严重问题 (2026-01-04):
file-module 包含完整的文件上传功能(upload-policy, multipart-policy, multipart-complete)file-module 包含文件URL获取和下载功能(get-url, download)file-module 包含独立的删除路由(delete.ts)integration-test-utils.ts, integration-test-db.ts新增文件:
package.json - 包配置,依赖 @d8d/shared-crud, @d8d/shared-utils, @d8d/tenant-module-mttsconfig.json - TypeScript 配置vitest.config.ts - Vitest 测试配置(无别名配置)src/entities/unified-file.entity.ts - 统一文件实体(无 tenant_id)src/entities/index.ts - Entity 导出src/services/unified-file.service.ts - Service 层(软删除实现)src/services/minio.service.ts - MinIO 文件服务src/services/index.ts - Service 导出src/schemas/unified-file.schema.ts - Zod Schema 定义src/schemas/index.ts - Schema 导出src/routes/admin/unified-files.admin.routes.ts - 管理员路由(tenantAuthMiddleware)src/routes/index.ts - Routes 导出src/index.ts - 包主入口tests/integration/unified-files.integration.test.ts - 集成测试tests/unit/unified-file.service.unit.test.ts - 单元测试待QA代理填写