using BoardOil.Data.Abstractions.DataAccess; using BoardOil.Data.Abstractions.Entities; namespace BoardOil.Data.Abstractions.Jobs; public interface IJobRepository : IRepositoryBase { Task> ListAsync(int offset, int limit, CancellationToken cancellationToken = default); Task CountAsync(CancellationToken cancellationToken = default); Task CountActiveAsync(CancellationToken cancellationToken = default); Task GetForUpdateAsync(int id, CancellationToken cancellationToken = default); Task GetWithLogsAsync(int id, CancellationToken cancellationToken = default); Task FindNextDueAsync(DateTime nowUtc, CancellationToken cancellationToken = default); Task> ListRunningForUpdateAsync(CancellationToken cancellationToken = default); Task ExistsByCorrelationIdAsync(string correlationId, CancellationToken cancellationToken = default); Task GetLatestActiveByCorrelationPrefixesAsync( string scheduledPrefix, string adHocPrefix, CancellationToken cancellationToken = default); Task GetLatestStartedByCorrelationPrefixesAsync( string scheduledPrefix, string adHocPrefix, CancellationToken cancellationToken = default); Task GetNextExpiredPurgeCandidateAsync( DateTime completedBeforeUtc, CancellationToken cancellationToken = default); Task DeleteEmptyExpiredAsync( int jobId, DateTime completedBeforeUtc, CancellationToken cancellationToken = default); } public sealed record JobPurgeCandidate(int Id, string Type, JobStatus Status, DateTime CompletedAtUtc);