3e09e74fc8
- Move inline DTOs to GmailDtos.cs, pure parse helpers to GmailParsing.cs - Batch per-message existence checks in CreateSuggestedJob/RefreshLinkedThreads - Remove redundant second pass in RelinkThread, reuse existing HashSet - Replace ToListAsync+scan with FirstOrDefaultAsync for GmailReviewDecisions lookups Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
77 lines
5.0 KiB
C#
77 lines
5.0 KiB
C#
using JobTrackerApi.Models;
|
|
|
|
namespace JobTrackerApi.Controllers;
|
|
|
|
// DTOs for GmailController, split out for readability (no behaviour change; these were
|
|
// previously nested inside the controller class).
|
|
public sealed record GmailImportResultDto(int Imported, int Skipped, string? ThreadId);
|
|
public sealed record GmailImportMessageResultDto(int Imported, int Skipped, string MessageId, string? ThreadId, Correspondence? Message);
|
|
public sealed record ImportGmailMessageRequest(int JobApplicationId, string MessageId);
|
|
public sealed record ImportGmailThreadRequest(int JobApplicationId, string ThreadId, string[] MessageIds);
|
|
public sealed record RefreshLinkedThreadsRequest(int JobApplicationId);
|
|
public sealed record GmailThreadRefreshThreadDto(string ThreadId, int Imported, int Skipped, int TotalMessages, string Status, DateTimeOffset? LatestMessageDate);
|
|
public sealed record GmailThreadRefreshResultDto(int JobApplicationId, int ThreadsChecked, int Imported, int Skipped, bool HasLinkedThreads, DateTimeOffset RefreshedAt, IReadOnlyList<GmailThreadRefreshThreadDto> Threads);
|
|
public sealed record GmailJobMatchReasonDto(string Label, string Value, int Points);
|
|
public sealed record GmailJobMatchedMessageDto(
|
|
string Id,
|
|
string ThreadId,
|
|
string Subject,
|
|
string From,
|
|
string To,
|
|
DateTimeOffset? Date,
|
|
string Snippet,
|
|
int Score,
|
|
string Confidence,
|
|
bool AlreadyImported,
|
|
IReadOnlyList<string> MatchedQueries,
|
|
IReadOnlyList<GmailJobMatchReasonDto> MatchReasons);
|
|
public sealed record GmailJobMatchedThreadDto(
|
|
string ThreadId,
|
|
string Subject,
|
|
int Score,
|
|
string Confidence,
|
|
bool HasImportedMessages,
|
|
int ImportedMessageCount,
|
|
int MessageCount,
|
|
DateTimeOffset? LatestDate,
|
|
IReadOnlyList<string> MatchedQueries,
|
|
IReadOnlyList<GmailJobMatchReasonDto> MatchReasons,
|
|
IReadOnlyList<GmailJobMatchedMessageDto> Messages);
|
|
public sealed record GmailJobMatchesResponseDto(
|
|
int JobApplicationId,
|
|
string JobTitle,
|
|
string CompanyName,
|
|
string? RecruiterName,
|
|
string? RecruiterEmail,
|
|
IReadOnlyList<string> Queries,
|
|
int CandidateMessageCount,
|
|
int CandidateThreadCount,
|
|
IReadOnlyList<GmailJobMatchedThreadDto> Threads);
|
|
|
|
public sealed record GmailReviewJobCandidateDto(int JobApplicationId, string JobTitle, string CompanyName, int Score, string Confidence, IReadOnlyList<GmailJobMatchReasonDto> Reasons);
|
|
public sealed record GmailReviewThreadDto(string ThreadId, string Subject, DateTimeOffset? LatestDate, int MessageCount, string Routing, bool HasImportedMessages, string? DecisionNote, IReadOnlyList<string> MatchedQueries, IReadOnlyList<GmailReviewJobCandidateDto> JobCandidates, IReadOnlyList<GmailJobMatchedMessageDto> Messages);
|
|
public sealed record GmailReviewQueueResponseDto(IReadOnlyList<string> Queries, int CandidateThreadCount, int AutoLinkThreadCount, int ReviewThreadCount, int UnmatchedThreadCount, IReadOnlyList<GmailReviewThreadDto> Threads);
|
|
public sealed record SaveGmailReviewDecisionRequest(string ThreadId, string Decision, int? JobApplicationId, string? Note);
|
|
public sealed record GmailManualSyncRequest(int? LookbackDays, int? MaxResultsPerQuery, bool? AutoImportHighConfidence, bool? IncludeSpamTrash);
|
|
public sealed record GmailManualSyncResultDto(int QueriesRun, int CandidateThreadCount, int AutoLinkedThreadCount, int ReviewThreadCount, int UnmatchedThreadCount, int ImportedMessages, int ImportedThreads, int SkippedMessages, int LookbackDays, bool IncludeSpamTrash, DateTimeOffset SyncedAt);
|
|
public sealed record GmailSuggestedJobCandidateDto(string ThreadId, string Subject, DateTimeOffset? LatestDate, string? CompanyName, string? RecruiterName, string? RecruiterEmail, string? SuggestedJobTitle, string Routing, IReadOnlyList<string> MatchedQueries, string Preview);
|
|
public sealed record GmailSuggestedJobsResponseDto(int Count, IReadOnlyList<GmailSuggestedJobCandidateDto> Items);
|
|
public sealed record CreateSuggestedGmailJobRequest(string ThreadId, string CompanyName, string JobTitle, string? RecruiterName, string? RecruiterEmail, string? Notes, string? Status);
|
|
public sealed record CreatedSuggestedGmailJobDto(int JobApplicationId, int CompanyId, string ThreadId, int Imported, int Skipped);
|
|
public sealed record RelinkGmailThreadRequest(int JobApplicationId, string ThreadId, bool RemoveFromOtherJobs, string? Note);
|
|
public sealed record GmailRelinkResultDto(string ThreadId, int JobApplicationId, int Imported, int Skipped, int UnlinkedMessages);
|
|
public sealed record UnlinkGmailThreadRequest(int JobApplicationId, string ThreadId, string? Note, string? NextDecision);
|
|
public sealed record GmailUnlinkResultDto(string ThreadId, int JobApplicationId, int RemovedMessages, string Decision);
|
|
|
|
public sealed record GmailConnectionStatusDto(
|
|
bool Connected,
|
|
string? GmailAddress,
|
|
DateTimeOffset? ConnectedAt,
|
|
DateTimeOffset? LastSyncedAt,
|
|
DateTimeOffset? LastSyncAttemptedAt,
|
|
DateTimeOffset? LastSyncSucceededAt,
|
|
string? LastSyncMode,
|
|
string? LastSyncSource,
|
|
string? LastSyncStatus,
|
|
string? LastSyncError);
|