Fix MAX chat identity isolation

This commit is contained in:
sevenhill
2026-07-04 14:02:06 +03:00
parent b7241dd0df
commit a7524e7928
3 changed files with 294 additions and 79 deletions
+5
View File
@@ -165,6 +165,11 @@ static async Task EnsureCompatibilitySchemaAsync(QMaxDbContext db)
ON MessageAttachments (MessageId, ExternalId);
""");
await db.Database.ExecuteSqlRawAsync("""
CREATE INDEX IF NOT EXISTS IX_Messages_ChatId_ExternalId
ON Messages (ChatId, ExternalId);
""");
await db.Database.ExecuteSqlRawAsync("""
CREATE TABLE IF NOT EXISTS MessageReactions (
Id TEXT NOT NULL CONSTRAINT PK_MessageReactions PRIMARY KEY,
@@ -73,20 +73,14 @@ public sealed class MaxBridgeSyncService(
var createdMessages = new List<(Chat Chat, Message Message)>();
var updatedMessages = new List<(Chat Chat, Message Message)>();
var previewPushNotifications = new List<(Chat Chat, Message Message)>();
var trackedChatsByExternalId = new Dictionary<string, Chat>(StringComparer.Ordinal);
foreach (var update in updates)
{
var chat = await db.Chats
.FirstOrDefaultAsync(x => x.ExternalId == update.ExternalId, cancellationToken);
if (chat is null && update.ExternalId.StartsWith("dom:", StringComparison.OrdinalIgnoreCase))
if (!trackedChatsByExternalId.TryGetValue(update.ExternalId, out var chat))
{
chat = await db.Chats
.FirstOrDefaultAsync(
x => x.Title == update.Title &&
x.ExternalId != null &&
x.ExternalId.StartsWith("dom:"),
cancellationToken);
.FirstOrDefaultAsync(x => x.ExternalId == update.ExternalId, cancellationToken);
}
var chatWasCreated = chat is null;
@@ -103,6 +97,8 @@ public sealed class MaxBridgeSyncService(
changed++;
}
trackedChatsByExternalId[update.ExternalId] = chat;
var nextAvatarUrl = string.IsNullOrWhiteSpace(update.AvatarUrl)
? chat.AvatarUrl
: update.AvatarUrl;
@@ -156,7 +152,10 @@ public sealed class MaxBridgeSyncService(
var existing = await db.Messages
.Include(x => x.Attachments)
.FirstOrDefaultAsync(x => x.ExternalId == incoming.ExternalId, cancellationToken);
.FirstOrDefaultAsync(
x => x.ChatId == chat.Id &&
x.ExternalId == incoming.ExternalId,
cancellationToken);
if (existing is not null)
{
var merge = await MergeExistingMessageAsync(