using ScrapperAPI.Dtos; namespace ScrapperAPI.Interfaces; public interface IQueueRepository { Task EnqueueAsync(int sessionId, string url, CancellationToken ct); Task GetCountsAsync(int sessionId, CancellationToken ct); /// /// Pega 1 item pendente e faz "lease" atomico (Processing) para um worker. /// Retorna null se não houver itens disponíveis. /// Task TryDequeueAsync(int sessionId, string workerId, TimeSpan leaseFor, CancellationToken ct); /// /// Pega um lote de itens pendentes e faz "lease" atomico (Processing) para um worker. /// Itens com lease expirado também podem ser reprocessados. /// Task> LeaseBatchAsync(int sessionId, string workerId, int take, TimeSpan leaseFor, CancellationToken ct); /// /// Renova o lease de um item (se ele ainda pertence ao mesmo worker). /// Task RenewLeaseAsync(int queueId, string workerId, TimeSpan leaseFor, CancellationToken ct); Task MarkDoneAsync(int queueId, string workerId, CancellationToken ct); Task MarkFailedAsync(int queueId, string workerId, string error, CancellationToken ct); // Opcional: resetar stuck processing (se quiser depois) Task RequeueStuckProcessingAsync(int sessionId, TimeSpan olderThan, CancellationToken ct); Task RemovePendingByIdAsync(int sessionId, int queueId, CancellationToken ct); Task RemovePendingByUrlAsync(int sessionId, string url, CancellationToken ct); /// /// Lista IDs da fila por sessão e status (ex.: status=2 -> DONE). /// Task> ListQueueIdsAsync(int sessionId, IReadOnlyCollection? statuses, CancellationToken ct); }