refactor: P1-3/4/6 解耦修复 - 拆分 auth/users 文件 + notifications 反向依赖
This commit is contained in:
@@ -176,6 +176,10 @@ src/auth.ts ──▶ import { ... } from "@/shared/lib/permissions"
|
||||
──▶ import { ... } from "@/shared/lib/login-logger"
|
||||
──▶ import { ... } from "@/shared/lib/password-policy"
|
||||
──▶ import { ... } from "@/shared/lib/rate-limit"
|
||||
──▶ import { ... } from "@/shared/lib/role-utils" # P1-3 拆出
|
||||
──▶ import { ... } from "@/shared/lib/bcrypt-utils" # P1-3 拆出
|
||||
──▶ import { ... } from "@/shared/lib/http-utils" # P1-3 拆出
|
||||
──▶ import { ... } from "@/shared/lib/password-security-service" # P1-3 拆出
|
||||
──▶ import { db, schema } from "@/shared/db"
|
||||
|
||||
⟳ 循环:shared/lib/* → @/auth → shared/lib/*
|
||||
@@ -365,7 +369,7 @@ src/auth.ts ──▶ import { ... } from "@/shared/lib/permissions"
|
||||
**已知问题**:
|
||||
- ❌ P0:`shared/lib/*` ↔ `@/auth` 循环依赖
|
||||
- ⚠️ P1:`schema.ts` 1111 行(54 张表混合,超 1000 硬上限)
|
||||
- ⚠️ P1:`auth.ts` 293 行混合 5 类职责
|
||||
- ✅ P1:~~`auth.ts` 293 行混合 5 类职责~~ 已拆分(4 个辅助函数组迁移至 `shared/lib/{role-utils,bcrypt-utils,http-utils,password-security-service}`,auth.ts 仅保留 NextAuth 配置)
|
||||
- ⚠️ P2:`ai.ts` 218 行混合 5 类职责
|
||||
- ⚠️ P2:`onboarding-gate.tsx` 业务逻辑泄漏到 shared
|
||||
|
||||
@@ -383,6 +387,10 @@ src/auth.ts ──▶ import { ... } from "@/shared/lib/permissions"
|
||||
| `lib/login-logger.ts` | - | 登录日志 |
|
||||
| `lib/password-policy.ts` | - | 密码策略纯函数 |
|
||||
| `lib/rate-limit.ts` | - | 内存滑动窗口限流 |
|
||||
| `lib/role-utils.ts` | 35 | 角色规范化纯函数(normalizeRole / resolvePrimaryRole) |
|
||||
| `lib/bcrypt-utils.ts` | 22 | bcrypt 哈希前缀规范化纯函数 |
|
||||
| `lib/http-utils.ts` | 30 | 请求头解析(resolveClientIp,server-only) |
|
||||
| `lib/password-security-service.ts` | 100 | 密码安全 DB 操作(账户锁定/失败登录追踪,server-only) |
|
||||
| `lib/excel.ts` | - | Excel 导入导出 |
|
||||
| `lib/file-storage.ts` | - | 文件存储抽象 |
|
||||
| `hooks/use-permission.ts` | - | 客户端权限 Hook |
|
||||
@@ -669,22 +677,26 @@ src/auth.ts ──▶ import { ... } from "@/shared/lib/permissions"
|
||||
**导出函数**:
|
||||
- Actions:`getUserProfileAction` / `updateUserProfileAction` / `importUsersAction` / `exportUsersAction` / `downloadUserTemplateAction`
|
||||
- Data-access:`getUserProfile`
|
||||
- Import-export:`generateUserImportTemplate` / `parseUserImportData` / `batchImportUsers` / `exportUsersToExcel`
|
||||
- Import-export:`generateUserImportTemplate` / `parseUserImportData` / `exportUsersToExcel`(+ re-export `batchImportUsers` / `UserImportResult` 保持向后兼容)
|
||||
- User-service:`batchImportUsers`(用户创建 + 密码哈希 + 角色分配)
|
||||
- Class-registration:`registerStudentByInvitationCode`(委托 classes/data-access 完成班级注册)
|
||||
|
||||
**依赖关系**:
|
||||
- 依赖:`shared/*`、`@/auth`、`classes`(❌ `batchImportUsers` 直查 classes + 直写 classEnrollments)
|
||||
- 依赖:`shared/*`、`@/auth`、`classes`(✅ P1-4 已修复:通过 `class-registration.ts` 调用 `classes/data-access.enrollStudentByInvitationCode`,不再直写 classEnrollments)
|
||||
- 被依赖:`dashboard`(通过 data-access,P0-4 已修复)、`grades`(❌ 直查)、`homework`(❌ 直查)
|
||||
|
||||
**已知问题**:
|
||||
- ❌ P1:`import-export.ts` 四重职责混合(导入解析 + 导出 + 用户创建 + 班级注册)
|
||||
- ❌ P1:`batchImportUsers` 跨模块写 `classEnrollments`(classes 模块的写操作)
|
||||
- ✅ P1 已解决:`import-export.ts` 四重职责已拆分为 `import-export.ts`(解析/生成)+ `user-service.ts`(用户创建)+ `class-registration.ts`(班级注册)
|
||||
- ✅ P1 已解决:`batchImportUsers` 不再跨模块直写 `classEnrollments`,改为调用 `classes/data-access.enrollStudentByInvitationCode`
|
||||
- ❌ P1:`updateUserProfile` 绕过 data-access 直接 DB 写
|
||||
- ⚠️ P2:`data-access.ts` 仅 71 行,写操作缺失
|
||||
|
||||
**文件清单**:
|
||||
| 文件 | 行数 | 职责 |
|
||||
|------|------|------|
|
||||
| `import-export.ts` | 291 | 导入解析 + 导出 + 用户创建(职责混合) |
|
||||
| `import-export.ts` | 177 | 文件解析/生成(模板生成 + 解析校验 + Excel 导出)+ re-export 向后兼容 |
|
||||
| `user-service.ts` | 96 | 用户创建(批量导入 + 密码哈希 + 角色分配) |
|
||||
| `class-registration.ts` | 30 | 班级注册(委托 classes/data-access) |
|
||||
| `actions.ts` | 151 | 5 个 Server Action |
|
||||
| `data-access.ts` | 71 | 仅 getUserProfile |
|
||||
|
||||
@@ -1196,24 +1208,28 @@ shared/lib/{audit-logger, change-logger, auth-guard} → @/auth → shared/lib/*
|
||||
|
||||
**解耦建议**:actions 层仅做"权限校验 → 解析 → 调用 data-access → revalidatePath → 返回",所有 DB 操作下沉到 data-access。
|
||||
|
||||
### P1-3:auth.ts 混合 5 类职责
|
||||
### P1-3:auth.ts 混合 5 类职责 ✅ 已完成
|
||||
|
||||
`src/auth.ts` 293 行混合:NextAuth 配置 + 密码安全 DB 操作 + 角色规范化 + IP 解析 + 回调函数。
|
||||
`src/auth.ts` 原 293 行混合:NextAuth 配置 + 密码安全 DB 操作 + 角色规范化 + IP 解析 + 回调函数。
|
||||
|
||||
**解耦建议**:
|
||||
- 密码安全 DB 操作 → `shared/lib/password-security-service.ts`
|
||||
- 角色规范化 → `shared/lib/role-utils.ts`
|
||||
- IP 解析 → `shared/lib/http-utils.ts`(与三个 logger 共用)
|
||||
- `authorize` 回调拆分为 `checkRateLimit` / `checkAccountLockout` / `verifyPassword` / `loadUserRoles`
|
||||
**已完成拆分**(auth.ts 现 208 行,仅保留 NextAuth 配置):
|
||||
- ✅ 密码安全 DB 操作 → `shared/lib/password-security-service.ts`(getOrCreatePasswordSecurity / recordFailedLogin / resetFailedLogin,server-only)
|
||||
- ✅ 角色规范化 → `shared/lib/role-utils.ts`(normalizeRole / resolvePrimaryRole,纯函数)
|
||||
- ✅ bcrypt 哈希规范化 → `shared/lib/bcrypt-utils.ts`(normalizeBcryptHash,纯函数)
|
||||
- ✅ IP 解析 → `shared/lib/http-utils.ts`(resolveClientIp,server-only)
|
||||
|
||||
### P1-4:users/import-export.ts 四重职责
|
||||
**后续可选优化**(未执行,需保持 NextAuth 配置不变原则下评估):
|
||||
- `authorize` 回调可进一步拆分为 `checkRateLimit` / `checkAccountLockout` / `verifyPassword` / `loadUserRoles`,使 auth.ts 降至 ≤150 行
|
||||
|
||||
同时处理:导入解析 + 导出 + 用户创建(含密码哈希)+ 班级注册(跨模块写 classEnrollments)。
|
||||
### P1-4:users/import-export.ts 四重职责 ✅ 已完成
|
||||
|
||||
**解耦建议**:
|
||||
- 拆分为 `import.ts`(解析+校验)+ `export.ts`(模板生成+列表导出)
|
||||
- 用户创建逻辑迁移至 `data-access.ts` 的 `createUser`
|
||||
- classEnrollments 写入改为调用 `classes/data-access.enrollStudentByInvitationCode`
|
||||
`users/import-export.ts` 原 291 行混合:导入解析 + 导出 + 用户创建(含密码哈希)+ 班级注册(跨模块写 classEnrollments)。
|
||||
|
||||
**已完成拆分**(import-export.ts 现 177 行,仅保留文件解析/生成):
|
||||
- ✅ 用户创建(含密码哈希、角色分配)→ `user-service.ts`(`batchImportUsers`,96 行,server-only)
|
||||
- ✅ 班级注册 → `class-registration.ts`(`registerStudentByInvitationCode`,30 行,server-only)
|
||||
- ✅ `batchImportUsers` 不再直写 `classEnrollments`,改为调用 `classes/data-access.enrollStudentByInvitationCode`
|
||||
- ✅ `import-export.ts` 通过 re-export `batchImportUsers` / `UserImportResult` 保持向后兼容(`actions.ts` 和 `app/api/export/route.ts` 无需修改)
|
||||
|
||||
### P1-5:notifications 反向依赖 messaging
|
||||
|
||||
@@ -1269,8 +1285,8 @@ shared/lib/{audit-logger, change-logger, auth-guard} → @/auth → shared/lib/*
|
||||
|
||||
### 短期执行(P1)
|
||||
8. actions 层移除直接 DB 操作(exams/homework/questions/announcements/users/scheduling)
|
||||
9. 拆分 `auth.ts`
|
||||
10. 拆分 `users/import-export.ts`
|
||||
9. ~~拆分 `auth.ts`~~ ✅ 已完成(4 个辅助函数组迁移至 shared/lib,auth.ts 保留 NextAuth 配置)
|
||||
10. ~~拆分 `users/import-export.ts`~~ ✅ 已完成(拆为 import-export.ts 177行 + user-service.ts 96行 + class-registration.ts 30行,班级注册改为调用 classes/data-access)
|
||||
11. 消除 notifications → messaging 反向依赖
|
||||
12. 提取 `shared/lib/http-utils.ts` 统一 IP 提取
|
||||
13. 各模块暴露跨模块查询接口(见 P1-1)
|
||||
@@ -1316,7 +1332,7 @@ shared/lib/{audit-logger, change-logger, auth-guard} → @/auth → shared/lib/*
|
||||
| **school** | ✅ | ✅ | - | - | - | - | - | - | - | ⚠️可接受 | - | - | - | - |
|
||||
| **grades** | ✅ | ✅ | ✅外键 | ✅外键 | - | - | ❌直查 | ❌直查 | - | ❌直查 | - | - | - | - |
|
||||
| **dashboard** | ✅ | ✅ | ✅data-access | ✅data-access | ✅data-access | ✅data-access | ✅data-access | - | - | ✅data-access | - | - | - | - |
|
||||
| **users** | ✅ | ✅ | - | - | - | - | ❌写enrollments | - | - | - | - | - | - | - |
|
||||
| **users** | ✅ | ✅ | - | - | - | - | ✅data-access | - | - | - | - | - | - | - |
|
||||
| **messaging** | ✅ | ✅ | - | - | - | - | - | - | - | - | - | - | ❌绕过 | - |
|
||||
| **notifications** | ✅ | ✅ | - | - | - | - | ❌直查 | - | - | - | - | ⟳反向依赖 | - | - |
|
||||
| **attendance** | ✅ | ✅ | - | - | - | - | ❌直查 | - | - | - | - | - | - | - |
|
||||
|
||||
Reference in New Issue
Block a user