using CampusWorkshops.Api.Dtos;
using CampusWorkshops.Api.Models;
using CampusWorkshops.Api.Repositories;
using FluentValidation;
using Microsoft.AspNetCore.Mvc;
using Workshop10_API.Validation;
namespace CampusWorkshops.Api.Controllers;
[ApiController]
[Route("api/[controller]")]
public class WorkshopsController : ControllerBase
{
private readonly IWorkshopRepository _repo;
public WorkshopsController(IWorkshopRepository repo) => _repo = repo;
/// Lista workshops com filtros opcionais.
[HttpGet]
public async Task GetAll([FromQuery] DateTimeOffset? from, [FromQuery] DateTimeOffset? to, [FromQuery] string? q, CancellationToken ct)
{
var workshops = await _repo.GetAllAsync(from, to, q, ct);
if (!workshops.Any())
return NoContent();
var workshopDTOs = workshops.Select(w => ConvertToWorkshopResponseDTO(w)).ToList();
return Ok(workshopDTOs);
}
[HttpGet("{id:guid}")]
public async Task GetById(Guid id, CancellationToken ct)
{
var workshop = await _repo.GetByIdAsync(id, ct);
if (workshop == null)
return NoContent();
return Ok(ConvertToWorkshopResponseDTO(workshop));
}
[HttpPost]
public async Task Create([FromBody] CreateWorkshopRequestDTO workshopDTO, CancellationToken ct)
{
var dtoValidator = new WorkshopRequestDTOValidator();
var validationResult = await dtoValidator.ValidateAsync(workshopDTO);
if (!validationResult.IsValid)
{
var erros = validationResult.Errors.Select(e => new { e.PropertyName, e.ErrorMessage });
return BadRequest(erros);
}
Workshop workshop = new Workshop
{
Capacity = workshopDTO.Capacity,
Description = workshopDTO.Description,
EndAt = workshopDTO.EndAt,
IsOnline = workshopDTO.IsOnline,
Location = workshopDTO.Location,
StartAt = workshopDTO.StartAt,
Title = workshopDTO.Title
};
var result = await _repo.AddAsync(workshop, ct);
if (result != null)
return CreatedAtAction(nameof(GetById), new { workshopDTO });
return BadRequest();
}
[HttpDelete]
public async Task Delete(Guid id, CancellationToken ct)
{
var result = await _repo.DeleteAsync(id, ct);
if(result)
return NoContent();
return NotFound();
}
private WorkshopResponseDTO ConvertToWorkshopResponseDTO(Workshop workshop)
{
return new WorkshopResponseDTO(
workshop.Id,
workshop.Title,
workshop.Description,
workshop.StartAt,
workshop.EndAt,
workshop.Location,
workshop.Capacity,
workshop.IsOnline
);
}
}