Files
Edu/packages/shared-proto/proto/core_edu.proto
SpecialX 23246ade6d feat(p3): core teaching service with Outbox + Kafka event bus
P3 阶段交付物:
- services/core-edu: 教学核心服务(DDD 限界上下文:exams/grades/homework/classes)
  - exams: 考试 CRUD + 事务内写 exam + outbox
  - grades: 成绩 CRUD
  - homework: 作业 CRUD
  - classes.module: 复用 P1 classes 模块(聚合到 core-edu 服务)
- Outbox 模式实现:
  - outbox.schema.ts: core_edu_outbox 表(id/aggregate_id/event_type/payload/status/retry_count)
  - outbox.repository.ts: 支持事务参数 tx,确保业务+事件原子性
  - outbox.publisher.ts: Kafka idempotent producer + transactionalId,TOPIC_MAP 路由 9 种事件,MAX_RETRY=5
- config/kafka.ts: idempotent producer + transactionalId 配置
- main.ts: 启动顺序 initTracer → connectKafka → outboxPublisher.start → app.listen
- packages/shared-proto/proto/core_edu.proto: ExamService/HomeworkService/GradeService 契约
- packages/shared-proto/proto/events.proto: ClassEvent/ExamEvent/HomeworkEvent/GradeEvent 领域事件契约
2026-07-08 01:38:07 +08:00

182 lines
3.7 KiB
Protocol Buffer

syntax = "proto3";
package next_edu_cloud.core_edu.v1;
// CoreEdu service contracts - P3 core teaching domain.
// Covers exam management, homework assignment, and grade recording.
// Event contracts live in events.proto under next_edu_cloud.events.v1.
service ExamService {
rpc CreateExam(CreateExamRequest) returns (CreateExamResponse);
rpc GetExam(GetExamRequest) returns (Exam);
rpc ListExamsByClass(ListExamsByClassRequest) returns (ListExamsResponse);
rpc UpdateExam(UpdateExamRequest) returns (UpdateExamResponse);
rpc DeleteExam(DeleteExamRequest) returns (DeleteExamResponse);
}
service HomeworkService {
rpc AssignHomework(AssignHomeworkRequest) returns (AssignHomeworkResponse);
rpc GetHomework(GetHomeworkRequest) returns (Homework);
rpc ListHomeworkByClass(ListHomeworkByClassRequest) returns (ListHomeworkResponse);
rpc SubmitHomework(SubmitHomeworkRequest) returns (SubmitHomeworkResponse);
}
service GradeService {
rpc RecordGrade(RecordGradeRequest) returns (RecordGradeResponse);
rpc GetGrade(GetGradeRequest) returns (Grade);
rpc ListGradesByStudent(ListGradesByStudentRequest) returns (ListGradesResponse);
rpc ListGradesByExam(ListGradesByExamRequest) returns (ListGradesResponse);
rpc ListGradesByHomework(ListGradesByHomeworkRequest) returns (ListGradesResponse);
}
message Exam {
string id = 1;
string class_id = 2;
string title = 3;
string description = 4;
string exam_date = 5;
string duration = 6;
string total_score = 7;
string status = 8;
string created_by = 9;
string created_at = 10;
string updated_at = 11;
}
message Homework {
string id = 1;
string class_id = 2;
string title = 3;
string description = 4;
string due_date = 5;
string status = 6;
string created_by = 7;
string created_at = 8;
string updated_at = 9;
}
message Grade {
string id = 1;
string student_id = 2;
string exam_id = 3;
string homework_id = 4;
string score = 5;
string feedback = 6;
string graded_by = 7;
string created_at = 8;
string updated_at = 9;
}
message CreateExamRequest {
string class_id = 1;
string title = 2;
string description = 3;
string exam_date = 4;
string duration = 5;
string total_score = 6;
string created_by = 7;
}
message CreateExamResponse {
string id = 1;
}
message GetExamRequest {
string id = 1;
}
message ListExamsByClassRequest {
string class_id = 1;
}
message ListExamsResponse {
repeated Exam exams = 1;
}
message UpdateExamRequest {
string id = 1;
string title = 2;
string description = 3;
string exam_date = 4;
string duration = 5;
string total_score = 6;
string status = 7;
}
message UpdateExamResponse {
bool success = 1;
}
message DeleteExamRequest {
string id = 1;
}
message DeleteExamResponse {
bool success = 1;
}
message AssignHomeworkRequest {
string class_id = 1;
string title = 2;
string description = 3;
string due_date = 4;
string created_by = 5;
}
message AssignHomeworkResponse {
string id = 1;
}
message GetHomeworkRequest {
string id = 1;
}
message ListHomeworkByClassRequest {
string class_id = 1;
}
message ListHomeworkResponse {
repeated Homework homework = 1;
}
message SubmitHomeworkRequest {
string id = 1;
}
message SubmitHomeworkResponse {
bool success = 1;
}
message RecordGradeRequest {
string student_id = 1;
string exam_id = 2;
string homework_id = 3;
string score = 4;
string feedback = 5;
string graded_by = 6;
}
message RecordGradeResponse {
string id = 1;
}
message GetGradeRequest {
string id = 1;
}
message ListGradesByStudentRequest {
string student_id = 1;
}
message ListGradesByExamRequest {
string exam_id = 1;
}
message ListGradesByHomeworkRequest {
string homework_id = 1;
}
message ListGradesResponse {
repeated Grade grades = 1;
}