Fix MAX chat identity isolation
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user