syntax = "proto3"; package topfans.notification; option go_package = "github.com/topfans/backend/pkg/proto/notification;notification"; import "proto/common.proto"; import "google/api/annotations.proto"; import "google/protobuf/struct.proto"; service NotificationService { rpc CreateNotification(CreateNotificationRequest) returns (CreateNotificationResponse) { option (google.api.http) = { post: "/internal/v1/notifications" body: "*" }; } rpc GetNotifications(GetNotificationsRequest) returns (GetNotificationsResponse) { option (google.api.http) = { get: "/api/v1/notifications" }; } rpc GetUnreadCount(GetUnreadCountRequest) returns (GetUnreadCountResponse) { option (google.api.http) = { get: "/api/v1/notifications/unread-count" }; } rpc MarkAsRead(MarkAsReadRequest) returns (MarkAsReadResponse) { option (google.api.http) = { post: "/api/v1/notifications/{id}/read" }; } rpc MarkAsReadByTarget(MarkAsReadByTargetRequest) returns (MarkAsReadByTargetResponse) { option (google.api.http) = { post: "/api/v1/notifications/targets/{target_id}/read" }; } rpc MarkAllAsRead(MarkAllAsReadRequest) returns (MarkAllAsReadResponse) { option (google.api.http) = { post: "/api/v1/notifications/read-all" }; } rpc DeleteNotification(DeleteNotificationRequest) returns (DeleteNotificationResponse) { option (google.api.http) = { delete: "/api/v1/notifications/{id}" }; } rpc DeleteByTarget(DeleteByTargetRequest) returns (DeleteByTargetResponse) { option (google.api.http) = { delete: "/api/v1/notifications/targets/{target_id}" }; } // ========== 设备注册(推送 cid 上报) ========== // 注册/更新当前用户的推送设备 cid;同 cid 重复注册为更新,user 变化时也更新归属。 rpc RegisterDevice(RegisterDeviceRequest) returns (RegisterDeviceResponse) { option (google.api.http) = { post: "/api/v1/notifications/devices" body: "*" }; } // 注销指定 cid 的推送(登出 / 客户端主动关闭通知)。 rpc UnregisterDevice(UnregisterDeviceRequest) returns (UnregisterDeviceResponse) { option (google.api.http) = { post: "/api/v1/notifications/devices/unregister" body: "*" }; } } message Notification { int64 id = 1; int64 user_id = 2; int64 star_id = 3; string type = 4; string title = 5; string content = 6; google.protobuf.Struct data = 7; bool is_read = 8; int64 created_at = 9; int64 read_at = 10; // 列表层聚合:仅 type=like 且按 target_id 聚合时返回 bool aggregated = 11; int32 total_count = 12; repeated ActorPreview actors = 13; int64 target_id = 14; } message ActorPreview { int64 user_id = 1; string nickname = 2; string avatar = 3; int64 liked_at = 4; } message CreateNotificationRequest { int64 user_id = 1; int64 star_id = 2; string type = 3; string title = 4; string content = 5; google.protobuf.Struct data = 6; } message CreateNotificationResponse { topfans.common.BaseResponse base = 1; int64 id = 2; } message GetNotificationsRequest { string type = 1; string tab = 2; int32 page = 3; int32 page_size = 4; } message GetNotificationsResponse { topfans.common.BaseResponse base = 1; repeated Notification items = 2; int64 total = 3; int32 page = 4; int32 page_size = 5; } message GetUnreadCountRequest {} message UnreadCount { int32 like = 1; int32 system = 2; int32 activity = 3; int32 total = 4; } message GetUnreadCountResponse { topfans.common.BaseResponse base = 1; UnreadCount counts = 2; } message MarkAsReadRequest { int64 id = 1; } message MarkAsReadResponse { topfans.common.BaseResponse base = 1; } message MarkAsReadByTargetRequest { int64 target_id = 1; } message MarkAsReadByTargetResponse { topfans.common.BaseResponse base = 1; int32 affected = 2; } message MarkAllAsReadRequest { string type = 1; } message MarkAllAsReadResponse { topfans.common.BaseResponse base = 1; int32 affected = 2; } message DeleteNotificationRequest { int64 id = 1; } message DeleteNotificationResponse { topfans.common.BaseResponse base = 1; } message DeleteByTargetRequest { int64 target_id = 1; } message DeleteByTargetResponse { topfans.common.BaseResponse base = 1; int32 affected = 2; } // ========== 设备注册消息 ========== // RegisterDeviceRequest 注册/更新推送设备。 // 行为:按 cid 主键 upsert。同 cid 已存在时更新归属(user/platform/version);不存在则插入。 message RegisterDeviceRequest { string cid = 1; string platform = 2; // ios / android / harmony string app_version = 3; string device_model = 4; } message RegisterDeviceResponse { topfans.common.BaseResponse base = 1; int64 id = 2; // user_devices.id(便于客户端排错/对账) } // UnregisterDeviceRequest 注销指定 cid 的推送。cid 为空时注销当前用户的所有设备。 message UnregisterDeviceRequest { string cid = 1; } message UnregisterDeviceResponse { topfans.common.BaseResponse base = 1; int32 affected = 2; // 受影响的行数 }