83 lines
2.6 KiB
C#
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);
|
|
}
|
|
} |