# core-edu 对接契约

> 负责人：ai08
> 关联：[matrix.md](./matrix.md)、[core_edu.proto](../../../packages/shared-proto/proto/core_edu.proto)、[events.proto](../../../packages/shared-proto/proto/events.proto)

---

## §1 我提供什么（对外接口）

### 1.1 gRPC 接口（如有）

| Service           | RPC                     | 请求                           | 响应                        | 端口  |
| ----------------- | ----------------------- | ------------------------------ | --------------------------- | ----- |
| ClassService      | GetClass                | GetClassRequest                | ClassInfo                   | 50053 |
| ClassService      | GetClassesByTeacher     | GetClassesByTeacherRequest     | GetClassesByTeacherResponse | 50053 |
| ClassService      | BatchGetClasses         | BatchGetClassesRequest         | BatchGetClassesResponse     | 50053 |
| ClassService      | ListStudentsByClass     | ListStudentsByClassRequest     | ListStudentsByClassResponse | 50053 |
| ExamService       | CreateExam              | CreateExamRequest              | CreateExamResponse          | 50053 |
| ExamService       | GetExam                 | GetExamRequest                 | Exam                        | 50053 |
| ExamService       | ListExamsByClass        | ListExamsByClassRequest        | ListExamsResponse           | 50053 |
| ExamService       | UpdateExam              | UpdateExamRequest              | UpdateExamResponse          | 50053 |
| ExamService       | DeleteExam              | DeleteExamRequest              | DeleteExamResponse          | 50053 |
| HomeworkService   | AssignHomework          | AssignHomeworkRequest          | AssignHomeworkResponse      | 50053 |
| HomeworkService   | GetHomework             | GetHomeworkRequest             | Homework                    | 50053 |
| HomeworkService   | ListHomeworkByClass     | ListHomeworkByClassRequest     | ListHomeworkResponse        | 50053 |
| HomeworkService   | SubmitHomework          | SubmitHomeworkRequest          | SubmitHomeworkResponse      | 50053 |
| GradeService      | RecordGrade             | RecordGradeRequest             | RecordGradeResponse         | 50053 |
| GradeService      | GetGrade                | GetGradeRequest                | Grade                       | 50053 |
| GradeService      | ListGradesByStudent     | ListGradesByStudentRequest     | ListGradesResponse          | 50053 |
| GradeService      | ListGradesByExam        | ListGradesByExamRequest        | ListGradesResponse          | 50053 |
| GradeService      | ListGradesByHomework    | ListGradesByHomeworkRequest    | ListGradesResponse          | 50053 |
| AttendanceService | RecordAttendance        | RecordAttendanceRequest        | RecordAttendanceResponse    | 50053 |
| AttendanceService | GetAttendance           | GetAttendanceRequest           | Attendance                  | 50053 |
| AttendanceService | ListAttendanceByStudent | ListAttendanceByStudentRequest | ListAttendanceResponse      | 50053 |
| AttendanceService | ListAttendanceByClass   | ListAttendanceByClassRequest   | ListAttendanceResponse      | 50053 |

### 1.2 HTTP 端点（如有）

无对外 HTTP 端点，仅 gRPC。

### 1.3 GraphQL schema（如 BFF）

不适用。

### 1.4 Kafka 事件发布（如有）

| Topic               | Event                                              | 消费方         |
| ------------------- | -------------------------------------------------- | -------------- |
| edu.exam.events     | ExamEvent（action: created/updated/deleted）       | msg / data-ana |
| edu.homework.events | HomeworkEvent（action: assigned/submitted/graded） | msg / data-ana |
| edu.grade.events    | GradeEvent（action: recorded/updated）             | msg / data-ana |
| edu.class.events    | ClassEvent（action: transferred）                  | msg / data-ana |

### 1.5 错误码前缀

`CORE_EDU_`（如 CORE_EDU_CLASS_NOT_FOUND、CORE_EDU_EXAM_CONFLICT）

---

## §2 我消费什么（依赖上游）

### 2.1 gRPC 调用（同步）

无直接 gRPC 调用上游。core-edu 通过 Kafka 事件接收 iam 用户变更，不主动调 iam。

### 2.2 Kafka 事件订阅（异步）

| Topic               | Event                                                     | 发布方     | mock 策略                                                            |
| ------------------- | --------------------------------------------------------- | ---------- | -------------------------------------------------------------------- |
| edu.iam.user.events | UserEvent（action: created/updated/deleted/role_changed） | iam (ai06) | iam 就绪前不订阅，使用本地内置用户数据（teacher_id/student_id 固定） |
| edu.iam.role.events | RoleEvent（action: created/updated）                      | iam (ai06) | iam 就绪前忽略，权限校验在 core-edu 内部 mock                        |

### 2.3 HTTP 调用（如有）

无。

---

## §3 就绪信号

### 3.1 我依赖的上游就绪标志

- [ ] iam gRPC 50052 启用（ai06）—— 用于用户身份一致性校验（可选，core-edu 可先独立运行）
- [ ] edu.iam.user.events topic 有事件发布（ai06）—— 用于同步用户缓存

### 3.2 我的就绪标志（供下游消费）

- [ ] core-edu gRPC 50053 启用（HealthService.Check 返回 SERVING）
- [ ] ClassService 4 RPC 可调用（GetClass/GetClassesByTeacher/BatchGetClasses/ListStudentsByClass）
- [ ] ExamService 5 RPC 可调用
- [ ] HomeworkService 4 RPC 可调用
- [ ] GradeService 5 RPC 可调用
- [ ] AttendanceService 4 RPC 可调用
- [ ] edu.exam.events / edu.homework.events / edu.grade.events / edu.class.events topic 可发布

---

## §4 Mock 策略

### 4.1 我提供的 mock

在 core-edu 真实服务就绪前，为下游（teacher-bff / student-bff / parent-bff / content / msg / data-ana）提供以下 mock：

- **gRPC mock**：使用 grpc-mock 拦截 50053 端口
  - ClassService.GetClassesByTeacher 返回固定 3 个 ClassInfo
  - ClassService.ListStudentsByClass 返回固定 30 个 StudentInfo
  - ExamService.ListExamsByClass 返回固定 2 个 Exam
  - HomeworkService.ListHomeworkByClass 返回固定 3 个 Homework
  - GradeService.ListGradesByStudent 返回固定 5 个 Grade
  - AttendanceService.ListAttendanceByStudent 返回固定 10 条 Attendance
- **Kafka mock**：core-edu 就绪前不发布真实事件，下游 data-ana/msg 使用本地 stub 事件

### 4.2 我消费的 mock

在真实 iam 就绪前，core-edu 使用以下 mock：

- 用户数据：内置固定 teacher_id / student_id（不订阅 edu.iam.user.events）
- 权限校验：core-edu 内部不校验权限（由 Gateway/BFF 层负责），仅记录 created_by 字段
