syntax = "proto3"; package next_edu_cloud.events.v1; // Cross-service event contracts published by CoreEdu via the transactional // outbox pattern and consumed by downstream services (notifications, analytics, // audit, etc.). // // Topic naming follows the arbitration in coord-cross-review §3.1: // edu.teaching.. // // Event routing (TOPIC_MAP in outbox.publisher.ts): // edu.exam.events <- exam.created / exam.updated / exam.deleted // edu.homework.events <- homework.assigned / homework.submitted / homework.graded // edu.grade.events <- grade.recorded / grade.updated // edu.class.events <- class.transferred // edu.content.textbook.events <- textbook.created / textbook.updated / textbook.published / textbook.archived // edu.content.chapter.events <- chapter.created / chapter.updated / chapter.deleted // edu.content.knowledge_point.events <- knowledge_point.created / knowledge_point.updated / knowledge_point.prerequisite_added / knowledge_point.prerequisite_removed // edu.content.question.events <- question.created / question.updated / question.published / question.deleted message ClassEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string class_id = 5; string name = 6; string action = 7; EventMetadata metadata = 8; } message ExamEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string exam_id = 5; string class_id = 6; string subject_id = 7; string title = 8; string action = 9; EventMetadata metadata = 10; } message HomeworkEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string homework_id = 5; string class_id = 6; string subject_id = 7; string title = 8; string action = 9; EventMetadata metadata = 10; } message GradeEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string grade_id = 5; string student_id = 6; string score = 7; string total_score = 8; string action = 9; EventMetadata metadata = 10; } message AttendanceEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string attendance_id = 5; string schedule_id = 6; string student_id = 7; string status = 8; EventMetadata metadata = 9; } // IAM 用户事件(edu.iam.user.events topic) // action: created / updated / disabled / role_changed message UserEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string user_id = 5; string email = 6; string name = 7; repeated string roles = 8; string data_scope = 9; string action = 10; map metadata = 11; } // IAM 角色事件(edu.iam.role.events topic) // action: created / updated / deleted message RoleEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string role_id = 5; string role_name = 6; string action = 7; map metadata = 8; } // IAM 审计事件(edu.iam.audit.created topic,统一审计 topic) // action: create / update / delete / login / logout / permission_change message AuditEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string actor_user_id = 5; string action = 6; string resource_type = 7; string resource_id = 8; string before_state = 9; string after_state = 10; string ip = 11; string user_agent = 12; string trace_id = 13; map metadata = 14; } message TextbookEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string textbook_id = 5; string title = 6; string subject_id = 7; string grade_id = 8; string version = 9; string action = 10; map metadata = 11; } message ChapterEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string chapter_id = 5; string textbook_id = 6; string title = 7; int32 order = 8; string action = 9; map metadata = 10; } message KnowledgePointEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string kp_id = 5; string chapter_id = 6; string title = 7; int32 difficulty = 8; string action = 9; string prerequisite_id = 10; map metadata = 11; } message QuestionEvent { string event_id = 1; string aggregate_id = 2; string event_type = 3; int64 occurred_at = 4; string question_id = 5; string kp_id = 6; string type = 7; int32 difficulty = 8; string status = 9; string source = 10; string created_by = 11; string action = 12; map metadata = 13; }