Fix chat bulk delete URL resolution
This commit is contained in:
@@ -749,7 +749,24 @@ public sealed class ChatsController(
|
||||
return null;
|
||||
}
|
||||
|
||||
var result = await action(chat.ExternalId, chat.WebUrl);
|
||||
var chatUrl = chat.WebUrl;
|
||||
if (string.IsNullOrWhiteSpace(chatUrl))
|
||||
{
|
||||
chatUrl = await ResolveAndPersistChatUrlAsync(chat, cancellationToken);
|
||||
}
|
||||
|
||||
var result = await action(chat.ExternalId, chatUrl);
|
||||
if (!result.Success && IsChatOpenFailure(result.Error))
|
||||
{
|
||||
var previousUrl = chatUrl;
|
||||
chatUrl = await ResolveAndPersistChatUrlAsync(chat, cancellationToken);
|
||||
if (!string.IsNullOrWhiteSpace(chatUrl) &&
|
||||
!string.Equals(previousUrl, chatUrl, StringComparison.Ordinal))
|
||||
{
|
||||
result = await action(chat.ExternalId, chatUrl);
|
||||
}
|
||||
}
|
||||
|
||||
if (result.Success)
|
||||
{
|
||||
return null;
|
||||
@@ -760,6 +777,37 @@ public sealed class ChatsController(
|
||||
statusCode: StatusCodes.Status409Conflict);
|
||||
}
|
||||
|
||||
private async Task<string?> ResolveAndPersistChatUrlAsync(Chat chat, CancellationToken cancellationToken)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(chat.ExternalId))
|
||||
{
|
||||
return chat.WebUrl;
|
||||
}
|
||||
|
||||
var result = await maxBridge.ResolveChatUrlAsync(chat.ExternalId, cancellationToken);
|
||||
if (!result.Success || string.IsNullOrWhiteSpace(result.ChatUrl))
|
||||
{
|
||||
return chat.WebUrl;
|
||||
}
|
||||
|
||||
var nextWebUrl = result.ChatUrl.Trim();
|
||||
if (string.Equals(chat.WebUrl, nextWebUrl, StringComparison.Ordinal))
|
||||
{
|
||||
return chat.WebUrl;
|
||||
}
|
||||
|
||||
chat.WebUrl = nextWebUrl;
|
||||
chat.UpdatedAt = DateTimeOffset.UtcNow;
|
||||
await db.SaveChangesAsync(cancellationToken);
|
||||
await hubContext.Clients.All.SendAsync("ChatListInvalidated", cancellationToken);
|
||||
return chat.WebUrl;
|
||||
}
|
||||
|
||||
private static bool IsChatOpenFailure(string? error)
|
||||
{
|
||||
return error?.Contains("not found or did not open", StringComparison.OrdinalIgnoreCase) == true;
|
||||
}
|
||||
|
||||
private async Task<List<Chat>> LoadChatsWithAttachmentsAsync(IReadOnlyCollection<Guid> chatIds, CancellationToken cancellationToken)
|
||||
{
|
||||
return await db.Chats
|
||||
|
||||
@@ -9,6 +9,7 @@ public interface IMaxBridgeClient
|
||||
Task<IReadOnlyList<MaxChatUpdate>> FetchUpdatesAsync(CancellationToken cancellationToken);
|
||||
Task<MaxChatUpdate?> FetchChatHistoryAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken);
|
||||
Task<MaxChatPresence?> FetchChatPresenceAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken);
|
||||
Task<MaxChatUrlResult> ResolveChatUrlAsync(string externalChatId, CancellationToken cancellationToken);
|
||||
Task<MaxActionResult> ClearChatHistoryAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken);
|
||||
Task<MaxActionResult> DeleteChatAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken);
|
||||
Task<MaxSendResult> SendTextAsync(string externalChatId, string? chatUrl, string text, CancellationToken cancellationToken);
|
||||
|
||||
@@ -53,6 +53,8 @@ public sealed record MaxSendResult(bool Success, string? ExternalMessageId, stri
|
||||
|
||||
public sealed record MaxActionResult(bool Success, string? Error);
|
||||
|
||||
public sealed record MaxChatUrlResult(bool Success, string? ChatUrl, string? Error);
|
||||
|
||||
public sealed record MaxMediaDownload(
|
||||
Stream Stream,
|
||||
string ContentType,
|
||||
|
||||
@@ -56,6 +56,11 @@ public sealed class MockMaxBridgeClient : IMaxBridgeClient
|
||||
return Task.FromResult<MaxChatPresence?>(new MaxChatPresence(false, null, DateTimeOffset.UtcNow));
|
||||
}
|
||||
|
||||
public Task<MaxChatUrlResult> ResolveChatUrlAsync(string externalChatId, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult(new MaxChatUrlResult(true, MockChatUrl(externalChatId), null));
|
||||
}
|
||||
|
||||
public Task<MaxActionResult> ClearChatHistoryAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult(new MaxActionResult(true, null));
|
||||
|
||||
@@ -53,6 +53,12 @@ public sealed class WorkerMaxBridgeClient(
|
||||
return await SendAsync<MaxChatPresence>(HttpMethod.Post, "/chat/presence", new { externalChatId, chatUrl }, cancellationToken);
|
||||
}
|
||||
|
||||
public async Task<MaxChatUrlResult> ResolveChatUrlAsync(string externalChatId, CancellationToken cancellationToken)
|
||||
{
|
||||
return await SendAsync<MaxChatUrlResult>(HttpMethod.Post, "/chat/resolve-url", new { externalChatId }, cancellationToken)
|
||||
?? new MaxChatUrlResult(false, null, "Worker returned an empty chat URL result.");
|
||||
}
|
||||
|
||||
public async Task<MaxActionResult> ClearChatHistoryAsync(string externalChatId, string? chatUrl, CancellationToken cancellationToken)
|
||||
{
|
||||
return await SendAsync<MaxActionResult>(
|
||||
|
||||
Reference in New Issue
Block a user