diff --git a/README.md b/README.md index 4d217c7..38f2742 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,8 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs - 当前租户成员 - 租户管理员 - 第一批认证/租户接口已经建立: + - `GET /api/tenant/resolve` + - `GET /api/tenant/current-public` - `POST /api/auth/login/password` - `POST /api/auth/login/sms` - `POST /api/auth/oauth/wechat` @@ -96,6 +98,7 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs - `POST /api/auth/logout` - `GET /api/me` - `GET /api/tenants/current` + - `GET /api/health` - 多租户数据表普遍包含 `TenantId`。 - 大量租户内关系使用 composite FK,避免只靠应用代码约定租户一致性。 - 不迁移 Supabase RLS、`app_private` schema、生产保护 policy。 @@ -122,6 +125,9 @@ Tiku.Infrastructure/Persistence/Migrations/20260725220742_InitialSchema.cs - 租户关系 composite FK - PB raw record 可追踪主键 - API / Auth 测试覆盖: + - 租户按 `tenantCode` / `host` 解析 + - 公开品牌、主题、功能开关和 public config 返回 + - health smoke test - 未登录返回 401 - 无权限返回 403 - 密码登录成功/失败 @@ -169,10 +175,33 @@ dotnet ef migrations script \ --startup-project Tiku.DbMigrator ``` +## API 迁移模板 + +后续从旧 Nest/Supabase 迁移 API 时,优先按当前认证和租户接口的模板推进: + +1. DTO 放到 `Tiku.Api/Contracts`,只包含 HTTP 输入输出形状、校验属性和 OpenAPI 描述。 +2. Controller 保持轻量,只做路由、授权、DTO 到 Application request 的映射。 +3. 业务流程放到 `Tiku.Application`,EF/外部服务实现放到 `Tiku.Infrastructure`。 +4. 已登录业务接口默认从 `ICurrentTenant` / `ICurrentUser` 取上下文,不直接信任 body 里的 `tenantId`。 +5. 公开接口只返回 branding、feature flags、public config 等可暴露字段,不泄露 secret/refund/payment/internal metadata。 +6. 每迁一个小闭环就补集成测试和 Scalar/OpenAPI 描述,测试通过后单独提交。 + +建议下一批迁移顺序: + +```text +Catalog 基础只读 API + -> 地区 / 模块 / 学校 / 专业 / 科目 / 分类 +Content Navigation 只读 API + -> 内容入口 / 内容树 / 题集 / 练习蓝图 +Question Bank 只读 API + -> 题库列表 / 题目详情 / 题目版本 +``` + ## 当前状态 - 数据库模型迁移已完成到初始 schema。 - migration 已整理为单个初始建库 migration。 - API 安全底座已建立:JWT、Session、本地登录、当前用户、当前租户、基础授权策略。 +- 租户公开入口已建立:tenant resolve、public config、health。 - 当前模型测试、认证服务测试、API 认证/租户闭环测试通过。 - 下一步重点是继续把题库、内容、导入、订单等业务 API 接入这套安全轨道,而不是重新散写权限判断。