chore(msg): merge msg full implementation into main

Merge feat/msg-ai10 with complete messaging service
This commit is contained in:
SpecialX
2026-07-10 19:13:21 +08:00
51 changed files with 5039 additions and 376 deletions

View File

@@ -2,13 +2,53 @@ syntax = "proto3";
package next_edu_cloud.msg.v1;
// Msg 服务契约P5 沟通通知中台)。
//
// 三服务:
// - NotificationService通知发送 / 列表 / 已读 / 检索 / 撤回
// - NotificationPreferenceService用户通知偏好
// - NotificationTemplateService通知模板 CRUD + 渲染
//
// 仲裁依据coord-final-decisions.md M1gRPC 50056 启用)+ msg_contract.md §1.1
// ============================================================
// NotificationService
// ============================================================
service NotificationService {
rpc SendNotification(SendNotificationRequest) returns (Notification);
rpc BatchSendNotification(BatchSendNotificationRequest) returns (BatchSendNotificationResponse);
rpc ListNotifications(ListNotificationsRequest) returns (ListNotificationsResponse);
rpc GetUnreadCount(GetUnreadCountRequest) returns (GetUnreadCountResponse);
rpc MarkAsRead(MarkAsReadRequest) returns (Empty);
rpc BatchMarkAsRead(BatchMarkAsReadRequest) returns (Empty);
rpc MarkAllAsRead(MarkAllAsReadRequest) returns (Empty);
rpc SearchNotifications(SearchNotificationsRequest) returns (SearchNotificationsResponse);
rpc RecallNotification(RecallNotificationRequest) returns (RecallNotificationResponse);
}
// ============================================================
// NotificationPreferenceService
// ============================================================
service NotificationPreferenceService {
rpc GetPreferences(GetPreferencesRequest) returns (GetPreferencesResponse);
rpc UpdatePreferences(UpdatePreferencesRequest) returns (Empty);
}
// ============================================================
// NotificationTemplateService
// ============================================================
service NotificationTemplateService {
rpc CreateTemplate(CreateTemplateRequest) returns (NotificationTemplate);
rpc GetTemplate(GetTemplateRequest) returns (NotificationTemplate);
rpc ListTemplates(ListTemplatesRequest) returns (ListTemplatesResponse);
rpc UpdateTemplate(UpdateTemplateRequest) returns (NotificationTemplate);
rpc DeleteTemplate(DeleteTemplateRequest) returns (Empty);
rpc RenderTemplate(RenderTemplateRequest) returns (RenderedNotification);
}
// ============================================================
// Notification 聚合
// ============================================================
message Notification {
string id = 1;
string user_id = 2;
@@ -18,31 +58,220 @@ message Notification {
string channel = 6;
bool is_read = 7;
int64 created_at = 8;
// 扩展字段P5
string status = 9;
string related_entity_type = 10;
string related_entity_id = 11;
string group_id = 12;
string sender_id = 13;
string template_id = 14;
string event_id = 15;
int64 read_at = 16;
int64 updated_at = 17;
map<string, string> metadata = 18;
}
// ============================================================
// SendNotification
// ============================================================
message SendNotificationRequest {
string user_id = 1;
string type = 2;
string title = 3;
string content = 4;
string channel = 5;
map<string, string> metadata = 6;
string related_entity_type = 7;
string related_entity_id = 8;
string group_id = 9;
string sender_id = 10;
string template_id = 11;
string event_id = 12;
}
message BatchSendNotificationRequest {
repeated SendNotificationRequest items = 1;
string group_id = 2;
}
message BatchSendNotificationResponse {
repeated string ids = 1;
repeated BatchSendFailure failed = 2;
}
message BatchSendFailure {
string user_id = 1;
string error = 2;
}
// ============================================================
// ListNotifications
// ============================================================
message ListNotificationsRequest {
string user_id = 1;
bool only_unread = 2;
string type = 3;
int32 page = 4;
int32 page_size = 5;
}
message ListNotificationsResponse {
repeated Notification notifications = 1;
int32 total = 2;
}
message MarkAsReadRequest { string id = 1; }
// ============================================================
// GetUnreadCount
// ============================================================
message GetUnreadCountRequest {
string user_id = 1;
}
message GetUnreadCountResponse {
int32 count = 1;
}
// ============================================================
// MarkAsRead
// ============================================================
message MarkAsReadRequest {
string id = 1;
string user_id = 2;
}
message BatchMarkAsReadRequest {
repeated string ids = 1;
string user_id = 2;
}
message MarkAllAsReadRequest {
string user_id = 1;
int64 before = 2;
}
// ============================================================
// SearchNotifications
// ============================================================
message SearchNotificationsRequest {
string user_id = 1;
string query = 2;
string type = 3;
int32 page = 4;
int32 page_size = 5;
}
message SearchNotificationsResponse {
repeated Notification notifications = 1;
int32 total = 2;
}
// ============================================================
// RecallNotification
// ============================================================
message RecallNotificationRequest {
string group_id = 1;
string reason = 2;
}
message RecallNotificationResponse {
int32 recalled_count = 1;
}
// ============================================================
// NotificationPreference
// ============================================================
message NotificationPreference {
string id = 1;
string user_id = 2;
string type = 3;
repeated string channels = 4;
int32 frequency_limit = 5;
string quiet_hours_start = 6;
string quiet_hours_end = 7;
string quiet_hours_timezone = 8;
bool enabled = 9;
int64 created_at = 10;
int64 updated_at = 11;
}
message GetPreferencesRequest {
string user_id = 1;
}
message GetPreferencesResponse {
repeated NotificationPreference preferences = 1;
}
message UpdatePreferencesRequest {
string user_id = 1;
repeated NotificationPreference preferences = 2;
}
// ============================================================
// NotificationTemplate
// ============================================================
message NotificationTemplate {
string id = 1;
string code = 2;
string type = 3;
string title_template = 4;
string content_template = 5;
repeated string default_channels = 6;
repeated string variables = 7;
string locale = 8;
string status = 9;
int64 created_at = 10;
int64 updated_at = 11;
}
message CreateTemplateRequest {
string code = 1;
string type = 2;
string title_template = 3;
string content_template = 4;
repeated string default_channels = 5;
repeated string variables = 6;
string locale = 7;
}
message GetTemplateRequest {
string id = 1;
}
message ListTemplatesRequest {
string type = 1;
string status = 2;
}
message ListTemplatesResponse {
repeated NotificationTemplate templates = 1;
}
message UpdateTemplateRequest {
string id = 1;
string title_template = 2;
string content_template = 3;
repeated string default_channels = 4;
repeated string variables = 5;
string status = 6;
}
message DeleteTemplateRequest {
string id = 1;
}
message RenderTemplateRequest {
string code = 1;
map<string, string> variables = 2;
string locale = 3;
}
message RenderedNotification {
string title = 1;
string content = 2;
}
// ============================================================
// Empty
// ============================================================
message Empty {}