From b65c8f363345ccb423aae8478d43e6a98867dc77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B0=D0=BB=D0=B8=D0=BC=D0=BE=D0=B2=20=D0=A0=D1=83?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BC?= Date: Mon, 20 Apr 2026 11:14:45 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D0=BE=D1=81=D1=81=D1=82=D0=B0=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../8.5/executionHistory/executionHistory.bin | Bin 8881188 -> 8881188 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .../.gradle/8.5/fileHashes/fileHashes.bin | Bin 705054 -> 705054 bytes .../.gradle/8.5/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../8.5/fileHashes/resourceHashesCache.bin | Bin 717976 -> 718656 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../buildOutputCleanup/outputFiles.bin | Bin 1238165 -> 1238273 bytes client-mobile/SYNC_IMPROVEMENTS.md | 186 ------------------ .../signalr/SignalRNotificationObserver.kt | 1 - 9 files changed, 187 deletions(-) delete mode 100644 client-mobile/SYNC_IMPROVEMENTS.md diff --git a/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin b/client-mobile/.gradle/8.5/executionHistory/executionHistory.bin index b4b880e4cde5e0c14b265c71c8163d0c06b5f19f..7284c778880e0874244c00a3a03826028d9bc0bb 100644 GIT binary patch delta 8920 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 J!PoJw{SPNBjG6!d delta 7889 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 delta 6622 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 diff --git a/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock b/client-mobile/.gradle/8.5/fileHashes/fileHashes.lock index 98936df35db7e15f4bd0f6f59c820813c5025392..fec8e56c767e2af13d825eb127fd00fbf3d795d2 100644 GIT binary patch literal 17 WcmZSH&R@;(a=)o00|>A>SponmmjlB9 literal 17 WcmZSH&R@;(a=)o00|>A>ECT>500b@o diff --git a/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin b/client-mobile/.gradle/8.5/fileHashes/resourceHashesCache.bin index 826cc24b26aacd21de5cbf8cc8046a0735d3172b..3af06e72d1727640e55bb171940010827d3a5e87 100644 GIT binary patch delta 1017 zcmYjOeN5D49OwJobN73}{hou9JK&7^fzXQRINC~q3G(s>p_rmJs?+i%qFYy6MWjfU za;S$6O88wg{{Yh=y5bkOuTuv)U0^hw*UOT~yqqCMOa|ojLhEt-HhQ+_yXV>SdHa5! z;8^;(iS(VlFq8rL_;m&}n^;}!@x*qOUZ3R2};)nz+XR3jv#`_Ji)9AAkQv#^izE1uQaHE@a zl|TZ@+erseVrw_n+$=Dl|6<1u(&Kto&+GK6!Y+B*mYY6rHUb7QwT_-y0PWgNRa%E- z0s7c8@F;Hok$z!SGHXVkT71xOU4tp(G&`Cs0xT()Jb>RuXiqvkfO{63mn+P=cksjV z(qzN@Av~95escj_YFLqH=G%fR@`Prcq9CcZH29#ya+lIU!tr4jso;YLLRYQI_Rqo0F8`hW0 zVH;aJHE^P>s@8ySK~JT8(+t;ib%}kx2PUiQ1dgs+^Gms*+Aa@0G}-)V$8)w44H zJi&@V`Drs$=;|rQ{YEnJ(_8YiqTMJaigwv8Cu_=+yquWeC3r?k)~0)TY1z-OzntW! z&>eoV@M1k%B!q0C$Zywn9o+SrdSJ9i^%udyupDx(`8jg$NKxW=e}dP=&6EBENzGr1 delta 657 zcmYL_TS(Jk7{+J>9be8FisZCCq8TT7 zG3%s$1M1yWox;*r2k%P`ES6BKm0UP^obs)B(ntkybP?XrhGrMP_y$DPyrA&ODR_>x?h#9Qp#GVIiA{kjz>~b9W z1m>mR-F-6*eKUrjhjzjvad#>@GI@c4E{HdoQU!iFcqEB(@u`4^ITpM;Xrq2XemQ`J zgS^>B4jewm=gipE!pGvNSJY}s0A*MB)^f^5(+56gLGc%!YhtMp`20#eiMRWejaZ8E zksL}x&t_wh8R0zRnRwF0Y*cY{S9*=Hi$kSX3b@FF7j@DGv+#U3JjcUkY0^x?y4IM0 z&}*rXVBtKEP<%rgY>4@Nw8;^Z=<105Vr7#Y;^KA>y~9AZ{7faEuDwiLZ=GPcS|Ue@ zwxP3Bo|A>B;x3FHkPjtNwXTKMqT;+Tro~K_TV%KW`bcCqT7`Vt5VO&>tfck120}=e zw~tZ^mdX^3V~by@vQoRQ^(BiKsu@zNa)gl;r`nZ>>5kf_wL^9-ks}22uC>St(T&`7z;`W2^X;;Bnp9!N~%RGdI)oCmNBA1 zld(SNA8rOAEWO6?LwrcVg6YeA+sh&&f->mROiX&{-0MB?`#9%te*aFP8XjK@rzc2- z+YOQ){2Szo?ezASx$Wiw(P1v%*L9pc$8GVX2q(w1>##be4P|0|90SkbWDpocjP<#= zCb@u@dZa6@bgJx|2p(CsH5T#1fD~4RszdI70{R+_W>O;(gN&&W_lfT$i%SvDqX6x0 zJ-@J1owsQP4BhnPow#yX*>n|;@({V^?m)dP2ME-7p>BISK6zm7nBv2PC}l125+?kDPRuz< zfO+h@Rb+NDZLKRSPhvo3c{JkwVU~%T4H$Xb#U2_vV(IA%`Y*p64q3VI-i8_~lNc@~ zy~AzvwVr%AZTz$|HK4PXMDb$YJL*BhO?#k=ZjSgNA!X%kw7Gl0y7HY_!?> delta 470 zcmXAjPbh14JA8C7DYf!6ke6%{p42&oMWkR~`4$cWECccs=A3kE7ch#jFs zN9cI`f_Ykw%d0M`Ps(coRHr>J5(dT!%4otSte82vaX)2ROarpG|KN указанного. - -## Изменения - -### Бэкенд - -#### 1. IMessageRepository.cs -Добавлен метод для получения сообщений ПОСЛЕ указанного sequenceId: -```csharp -Task> GetChatMessagesAfterAsync(Guid chatId, long sequenceId, int limit, CancellationToken cancellationToken); -``` - -#### 2. MessageRepository.cs -Реализация метода: -```csharp -public async Task> GetChatMessagesAfterAsync(Guid chatId, long sequenceId, int limit, CancellationToken cancellationToken) -{ - var builder = Builders.Filter; - var filter = builder.And( - builder.Eq(m => m.ChatId, chatId), - builder.Gt(m => m.SequenceId, sequenceId) - ); - - return await _messages.Find(filter) - .SortBy(m => m.SequenceId) - .Limit(limit) - .ToListAsync(cancellationToken); -} -``` - -#### 3. GetMessagesQuery.cs -Добавлен параметр `AfterSequenceId`: -```csharp -public record GetMessagesQuery( - Guid UserId, - Guid ChatId, - string? Cursor, - long? Pivot = null, - long? AfterSequenceId = null, // НОВЫЙ ПАРАМЕТР - int? Limit = null -) : IQuery>; -``` - -Обработчик использует новый метод: -```csharp -if (request.AfterSequenceId.HasValue) -{ - messages = await _messageRepository.GetChatMessagesAfterAsync( - request.ChatId, - request.AfterSequenceId.Value, - queryLimit, - cancellationToken - ); -} -``` - -#### 4. MessagesEndpoints.cs -Добавлен query параметр в endpoint: -```csharp -group.MapGet("chat/{chatId:guid}", async ( - [FromRoute] Guid chatId, - [FromQuery] string? cursor, - [FromQuery] long? afterSequenceId, // НОВЫЙ ПАРАМЕТР - [FromQuery] long? pivot, - [FromQuery] int? limit, - ISender sender, - IUserContext userContext, - CancellationToken ct) => { ... } -); -``` - -### Мобильное приложение - -#### 1. ChatApi.kt -Добавлен параметр в API: -```kotlin -@GET("messages/chat/{chatId}") -suspend fun getMessages( - @Path("chatId") chatId: String, - @Query("cursor") cursor: String? = null, - @Query("pivot") pivot: Long? = null, - @Query("afterSequenceId") afterSequenceId: Long? = null, // НОВЫЙ ПАРАМЕТР - @Query("limit") limit: Int? = 50 -): List -``` - -#### 2. ChatRepository.kt -Добавлен метод: -```kotlin -suspend fun getMessages( - chatId: String, - cursor: String? = null, - pivot: Long? = null, - afterSequenceId: Long? = null, // НОВЫЙ ПАРАМЕТР - limit: Int? = null -): List -``` - -Добавлен метод для получения последнего sequenceId: -```kotlin -suspend fun getLastKnownSequenceId(chatId: String): Int? -``` - -#### 3. ChatRepositoryImpl.kt -Реализация: -```kotlin -override suspend fun getLastKnownSequenceId(chatId: String): Int? { - return try { - messageDao.getMaxSequenceId(chatId) - } catch (e: Exception) { - Log.e(TAG, "Failed to get last sequenceId", e) - null - } -} -``` - -#### 4. SignalRNotificationObserver.kt -Умная синхронизация: -```kotlin -private fun syncMissedMessages() { - scope.launch { - val chats = chatRepository.getChats() - - chats.forEach { chat -> - val lastSequenceId = chatRepository.getLastKnownSequenceId(chat.id) - - if (lastSequenceId != null) { - // Запрашиваем только сообщения ПОСЛЕ последнего известного - chatRepository.getMessages( - chatId = chat.id, - afterSequenceId = lastSequenceId.toLong(), - limit = 100 - ) - } else { - // Нет локальных сообщений - загружаем последние 50 - chatRepository.getMessages(chatId = chat.id, limit = 50) - } - } - } -} -``` - -## Преимущества - -### До изменений -- Запрашивались **все последние 50 сообщений** для каждого чата -- При 20 чатах: 20 × 50 = **1000 сообщений** из сети -- Дублирование данных, медленная синхронизация - -### После изменений -- Запрашиваются **только новые сообщения** с последнего sequenceId -- При 20 чатах и 5 новых сообщениях в каждом: 20 × 5 = **100 сообщений** -- **В 10 раз меньше трафика** -- **Быстрая синхронизация** - -## Пример использования API - -```http -GET /api/messages/chat/{chatId}?afterSequenceId=12345&limit=100 -``` - -Ответит только с сообщениями где `sequenceId > 12345`. - -## Тестирование - -1. Откройте приложение, загрузите чаты -2. Отключите сеть -3. Отправьте несколько сообщений с другого устройства -4. Включите сеть -5. Проверьте логи: должно быть `fetching newer...` и загрузка только новых сообщений - -## Логи - -``` -SignalRNtfObserver: Starting missed messages sync... -SignalRNtfObserver: Syncing 5 chats for missed messages -SignalRNtfObserver: Chat abc-123: last known seqId=100, fetching newer... -SignalRNtfObserver: Chat abc-123: fetched 3 new messages -SignalRNtfObserver: Synced chat abc-123 -``` diff --git a/client-mobile/chats/data/remote/signalr/SignalRNotificationObserver.kt b/client-mobile/chats/data/remote/signalr/SignalRNotificationObserver.kt index 18e0a84..3314e4f 100644 --- a/client-mobile/chats/data/remote/signalr/SignalRNotificationObserver.kt +++ b/client-mobile/chats/data/remote/signalr/SignalRNotificationObserver.kt @@ -89,7 +89,6 @@ class SignalRNotificationObserver @Inject constructor( // При восстановлении соединения SignalR обновляем список чатов и вступаем в них signalrClient.status .filter { it == ConnectionStatus.CONNECTED } - .distinctUntilChanged() .onEach { android.util.Log.d("SignalRNtfObserver", "SignalR connected, refreshing chats and joining rooms") onSignalRConnected()