using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; using ScrapperAPI.Dtos; using ScrapperAPI.Interfaces; namespace ScrapperAPI.Controllers; public sealed record AddUrlRequest( [Required, Url] string Url ); [ApiController] [Route("sessions")] public sealed class SessionsController : ControllerBase { private readonly ISessionRepository _sessions; private readonly IQueueRepository _queue; private readonly IScrapeCoordinator _coord; public SessionsController( ISessionRepository sessions, IQueueRepository queue, IScrapeCoordinator coord) { _sessions = sessions; _queue = queue; _coord = coord; } // ✅ Adicionar URL // POST /sessions/{sessionId}/queue [HttpPost("/{sessionId:int}/queue")] public async Task AddUrl(int sessionId, [FromBody] AddUrlRequest req, CancellationToken ct) { // (Opcional) valida se session existe var session = await _sessions.FindByNameAsync( name: (await _sessions.GetAllAsync(ct)).FirstOrDefault(s => s.Id == sessionId)?.Name ?? "", ct: ct ); // Melhor: crie um método GetByIdAsync no repo. Por enquanto: if (session is null) { // Se você não quiser validar aqui, pode remover esse bloco. // Eu recomendo validar. } var id = await _queue.EnqueueAsync(sessionId, req.Url, ct); return Created($"/sessions/{sessionId}/queue/{id}", new { id, sessionId, req.Url }); } // ✅ Remover por ID (seguro) // DELETE /sessions/{sessionId}/queue/{queueId} [HttpDelete("/{sessionId:int}/queue/{queueId:int}")] public async Task RemoveById(int sessionId, int queueId, CancellationToken ct) { var removed = await _queue.RemovePendingByIdAsync(sessionId, queueId, ct); return removed ? NoContent() : NotFound(new { message = "Queue item not found (or not pending)." }); } [HttpGet] public async Task GetAllSessions(CancellationToken ct) { var allSessions = await _sessions.GetAllAsync(ct); var result = new List(); foreach (var s in allSessions) { var counts = await _queue.GetCountsAsync(s.Id, ct); var runtime = _coord.GetRuntimeStatus(s.Id); result.Add(new SessionOverviewDto( SessionId: s.Id, Name: s.Name, IsRunning: runtime.IsRunning, StopRequested: runtime.StopRequested, Queue: counts )); } return Ok(result); } }