perf(gmail): batch CreateSuggestedJob N+1 + landing product preview #4

Merged
cesnimda merged 2 commits from feat/email-provider-migration into main 2026-07-05 21:34:34 +02:00
Showing only changes of commit 96b9489d49 - Show all commits
+7 -2
View File
@@ -641,12 +641,17 @@ public sealed class GmailController : ControllerBase
var threadMessages = await _gmail.ListThreadMessagesAsync(ownerUserId, request.ThreadId.Trim(), cancellationToken); var threadMessages = await _gmail.ListThreadMessagesAsync(ownerUserId, request.ThreadId.Trim(), cancellationToken);
var distinctMessageIds = threadMessages.Select(message => message.Id).Where(static id => !string.IsNullOrWhiteSpace(id)).Distinct(StringComparer.Ordinal).ToList(); var distinctMessageIds = threadMessages.Select(message => message.Id).Where(static id => !string.IsNullOrWhiteSpace(id)).Distinct(StringComparer.Ordinal).ToList();
// Batch the "already imported?" check with a single query instead of one
// AnyAsync per message (N+1), mirroring RelinkThread below.
var existingMessageIds = await _db.Correspondences
.Where(message => message.JobApplicationId == job.Id && message.ExternalMessageId != null && distinctMessageIds.Contains(message.ExternalMessageId))
.Select(message => message.ExternalMessageId!)
.ToListAsync(cancellationToken);
var imported = 0; var imported = 0;
var skipped = 0; var skipped = 0;
foreach (var messageId in distinctMessageIds) foreach (var messageId in distinctMessageIds)
{ {
var existing = await _db.Correspondences.AnyAsync(message => message.JobApplicationId == job.Id && message.ExternalMessageId == messageId, cancellationToken); if (existingMessageIds.Contains(messageId, StringComparer.Ordinal))
if (existing)
{ {
skipped++; skipped++;
continue; continue;