syntax = "proto3"; // Указываем пакет для логической изоляции package notifications.v1; // Импортируем стандартные типы Google для работы с датами и произвольным JSON import "google/protobuf/timestamp.proto"; import "google/protobuf/struct.proto"; // Опции для генерации кода (особенно полезно для Go, если понадобится) option go_package = "git.lendry.ru/lendry-erp/proto.git/go;pb"; // ----------------------------------------------------------------------------- // Сервис Уведомлений // ----------------------------------------------------------------------------- service NotificationService { // --- Публичные методы (Вызываются из API Gateway от лица клиента) --- // Получить список уведомлений пользователя с пагинацией rpc GetUserNotifications (GetNotificationsRequest) returns (GetNotificationsResponse); // Получить количество непрочитанных уведомлений (для бейджика на иконке) rpc GetUnreadCount (GetUnreadCountRequest) returns (GetUnreadCountResponse); // Отметить конкретное уведомление как прочитанное rpc MarkAsRead (MarkAsReadRequest) returns (MarkAsReadResponse); // Отметить все уведомления пользователя как прочитанные rpc MarkAllAsRead (MarkAllAsReadRequest) returns (MarkAllAsReadResponse); // --- Внутренние методы (Вызываются другими микросервисами: CRM, ERP, Auth) --- // Отправить уведомление (CRM/ERP вызывает этот метод, а NestJS уже кидает в RabbitMQ) rpc SendNotification (SendNotificationRequest) returns (SendNotificationResponse); } // ----------------------------------------------------------------------------- // Базовые модели // ----------------------------------------------------------------------------- // Структура самого уведомления message Notification { string id = 1; string user_id = 2; string type = 3; // Например: "SYSTEM_ALERT", "NEW_MESSAGE", "TASK_ASSIGNED" string title = 4; // Заголовок (опционально) string text = 5; // Текст уведомления google.protobuf.Struct payload = 6; // Любая динамическая JSON-нагрузка (например, { "task_id": 123 }) bool is_read = 7; google.protobuf.Timestamp created_at = 8; } // ----------------------------------------------------------------------------- // Запросы и ответы (Requests / Responses) // ----------------------------------------------------------------------------- message GetNotificationsRequest { string user_id = 1; // ID пользователя запрашивающего данные (Gateway берет это из JWT) int32 limit = 2; // Для пагинации (например, 20) int32 offset = 3; // Для пагинации (например, 0) optional bool unread_only = 4; // Фильтр: получить только непрочитанные } message GetNotificationsResponse { repeated Notification notifications = 1; // Массив уведомлений int32 total_count = 2; // Общее количество (для UI пагинации) } message GetUnreadCountRequest { string user_id = 1; } message GetUnreadCountResponse { int32 count = 1; } message MarkAsReadRequest { string user_id = 1; string notification_id = 2; } message MarkAsReadResponse { bool success = 1; } message MarkAllAsReadRequest { string user_id = 1; } message MarkAllAsReadResponse { bool success = 1; int32 updated_count = 2; // Сколько уведомлений было обновлено } message SendNotificationRequest { string user_id = 1; // Кому отправляем (если пусто — можно сделать бродкаст, но лучше отдельный метод) string type = 2; string title = 3; string text = 4; google.protobuf.Struct payload = 5; // Метаданные для UI (ссылки, ID сущностей) } message SendNotificationResponse { bool success = 1; string notification_id = 2; // ID созданного уведомления в Postgres }