Complete S01 Gmail matching and import workflow
This commit is contained in:
@@ -18,6 +18,7 @@ public interface IGmailOAuthService
|
||||
Task<GmailConnection?> GetConnectionAsync(string ownerUserId, CancellationToken cancellationToken);
|
||||
Task DisconnectAsync(string ownerUserId, CancellationToken cancellationToken);
|
||||
Task<IReadOnlyList<GmailMessageSummary>> ListMessagesAsync(string ownerUserId, string? query, int maxResults, CancellationToken cancellationToken);
|
||||
Task<IReadOnlyList<GmailMessageSummary>> ListMessagesForQueriesAsync(string ownerUserId, IEnumerable<string> queries, int maxResultsPerQuery, CancellationToken cancellationToken);
|
||||
Task<GmailMessageDetail> GetMessageAsync(string ownerUserId, string messageId, CancellationToken cancellationToken);
|
||||
}
|
||||
|
||||
@@ -180,6 +181,33 @@ public sealed class GmailOAuthService : IGmailOAuthService
|
||||
return results;
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<GmailMessageSummary>> ListMessagesForQueriesAsync(string ownerUserId, IEnumerable<string> queries, int maxResultsPerQuery, CancellationToken cancellationToken)
|
||||
{
|
||||
maxResultsPerQuery = Math.Clamp(maxResultsPerQuery, 1, 25);
|
||||
var normalizedQueries = queries
|
||||
.Where(static query => !string.IsNullOrWhiteSpace(query))
|
||||
.Select(static query => query.Trim())
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToList();
|
||||
|
||||
if (normalizedQueries.Count == 0)
|
||||
{
|
||||
return Array.Empty<GmailMessageSummary>();
|
||||
}
|
||||
|
||||
var combined = new List<GmailMessageSummary>();
|
||||
foreach (var query in normalizedQueries)
|
||||
{
|
||||
var items = await ListMessagesAsync(ownerUserId, query, maxResultsPerQuery, cancellationToken);
|
||||
combined.AddRange(items);
|
||||
}
|
||||
|
||||
return combined
|
||||
.GroupBy(message => message.Id, StringComparer.Ordinal)
|
||||
.Select(group => group.First())
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public async Task<GmailMessageDetail> GetMessageAsync(string ownerUserId, string messageId, CancellationToken cancellationToken)
|
||||
{
|
||||
var accessToken = await GetValidAccessTokenAsync(ownerUserId, cancellationToken);
|
||||
|
||||
Reference in New Issue
Block a user