From 07744f852e52358c00d6efae09920b635237bd44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Sat, 18 Apr 2026 11:09:45 +0300 Subject: [PATCH] feat: add new method for chat proto --- package.json | 2 +- proto/chat/chat.proto | 77 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/package.json b/package.json index 14ca6ba..5c41c80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@lendry-erp/contracts", - "version": "1.2.29", + "version": "1.2.30", "description": "Protobuf definitions and generated TypeScript types", "type": "commonjs", "main": "./dist/index.js", diff --git a/proto/chat/chat.proto b/proto/chat/chat.proto index ca9b552..188b5b7 100644 --- a/proto/chat/chat.proto +++ b/proto/chat/chat.proto @@ -5,15 +5,21 @@ package chat.v1; option go_package = "git.lendry.ru/lendry-erp/proto.git/go;pb"; service ChatService { - // Управление чатами + // Управление чатами (левая панель) rpc CreateChat(CreateChatRequest) returns (CreateChatResponse); rpc GetUserChats(GetUserChatsRequest) returns (GetUserChatsResponse); + rpc GetChatDetails(GetChatDetailsRequest) returns (GetChatDetailsResponse); // Открытие инфы о группе/собеседнике + + // Управление участниками группы rpc JoinChat(JoinChatRequest) returns (JoinChatResponse); rpc LeaveChat(LeaveChatRequest) returns (LeaveChatResponse); + rpc RemoveMember(RemoveMemberRequest) returns (RemoveMemberResponse); // Админ кикает пользователя + rpc MuteChat(MuteChatRequest) returns (MuteChatResponse); // Выключить/включить пуши для чата - // Управление сообщениями (история) + // Управление сообщениями (правое окно) rpc GetMessages(GetMessagesRequest) returns (GetMessagesResponse); - rpc SendMessage(SendMessageRequest) returns (MessageDto); // вызывается либо из Gateway (для фото/аудио), либо напрямую + rpc SendMessage(SendMessageRequest) returns (MessageDto); + rpc EditMessage(EditMessageRequest) returns (MessageDto); // Новое rpc DeleteMessage(DeleteMessageRequest) returns (DeleteMessageResponse); // Статусы @@ -26,30 +32,38 @@ message MessageDto { string id = 1; string chat_id = 2; string sender_id = 3; - string type = 4; // TEXT, VOICE, VIDEO_NOTE, STICKER - string content = 5; - string metadata = 6; // JSON string + string type = 4; // TEXT, VOICE, VIDEO_NOTE, STICKER, IMAGE + string content = 5; // Для текста - сам текст. Для медиа - URL S3! + string metadata = 6; // Ширина/высота картинки, длительность войса (JSON string) string reply_to_id = 7; bool is_edited = 8; string created_at = 9; } +message ChatMemberDto { + string account_id = 1; + string role = 2; // OWNER, ADMIN, MEMBER + bool is_muted = 3; + string joined_at = 4; +} + message ChatDto { string id = 1; string type = 2; // DIRECT, GROUP, CHANNEL string title = 3; string avatar_url = 4; int32 unread_count = 5; - MessageDto last_message = 6; // Нужно для рендера списка чатов слева! + MessageDto last_message = 6; + bool is_muted = 7; // Полезно для рендера иконки перечеркнутого колокольчика } // --- ЗАПРОСЫ / ОТВЕТЫ --- // message CreateChatRequest { - string creator_id = 1; // ID того кто создает - string type = 2; // GROUP, DIRECT, CHANNEL - string title = 3; // Имя (при type=GROUP|CHANNEL) - repeated string participant_ids = 4; // Кого сразу добавить (собеседник в личке или юзеры в группе) + string creator_id = 1; + string type = 2; + string title = 3; + repeated string participant_ids = 4; } message CreateChatResponse { ChatDto chat = 1; @@ -57,16 +71,27 @@ message CreateChatResponse { message GetUserChatsRequest { string user_id = 1; - int32 offset = 2; // для пагинации (бесконечный скролл в левой панели) + int32 offset = 2; int32 limit = 3; } message GetUserChatsResponse { repeated ChatDto chats = 1; } +// Получаем профили всех участников и ссылку-приглашение (join_hash) +message GetChatDetailsRequest { + string user_id = 1; + string chat_id = 2; +} +message GetChatDetailsResponse { + ChatDto chat = 1; + string join_hash = 2; // Для ссылки-приглашения (t.me/join/...) + repeated ChatMemberDto members = 3; +} + message JoinChatRequest { string user_id = 1; - string chat_id = 2; // либо join_hash + string chat_id = 2; // Передаем либо chat_id, либо вытаскиваем его из join_hash } message JoinChatResponse { bool success = 1; } @@ -76,11 +101,25 @@ message LeaveChatRequest { } message LeaveChatResponse { bool success = 1; } +message RemoveMemberRequest { + string admin_id = 1; // Кто кикает (нужно проверить права) + string target_user_id = 2; // Кого кикают + string chat_id = 3; +} +message RemoveMemberResponse { bool success = 1; } + +message MuteChatRequest { + string user_id = 1; + string chat_id = 2; + bool is_muted = 3; // true = выключить звук, false = включить +} +message MuteChatResponse { bool success = 1; } + message GetMessagesRequest { string user_id = 1; string chat_id = 2; int32 limit = 3; - string before_msg_id = 4; // курсорная пагинация, как в Telegram + string before_msg_id = 4; } message GetMessagesResponse { repeated MessageDto messages = 1; @@ -94,16 +133,22 @@ message SendMessageRequest { string reply_to_id = 5; } +message EditMessageRequest { + string user_id = 1; + string message_id = 2; + string new_content = 3; +} + message DeleteMessageRequest { string user_id = 1; string message_id = 2; - bool for_everyone = 3; // "Удалить для всех" + bool for_everyone = 3; // "Удалить только у себя" или "Удалить для всех" } message DeleteMessageResponse { bool success = 1; } message MarkAsReadRequest { string user_id = 1; string chat_id = 2; - string message_id = 3; + string message_id = 3; // ID последнего видимого сообщения } message MarkAsReadResponse { bool success = 1; }