1
0
voyager-api/ScrapperAPI/Controllers/SessionsController.cs

83 lines
2.6 KiB
C#

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<IActionResult> 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<IActionResult> 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<IActionResult> GetAllSessions(CancellationToken ct)
{
var allSessions = await _sessions.GetAllAsync(ct);
var result = new List<SessionOverviewDto>();
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);
}
}