using Microsoft.AspNetCore.Mvc;
using SchotzIadKmTracker.Api.Models.DTOs;
using SchotzIadKmTracker.Api.Services;
using SchotzIadKmTracker.Api.Services.Exceptions;
namespace SchotzIadKmTracker.Api.Controllers;
///
/// Endpoints de gestion du Carnet_Adresses : liste, création, modification et suppression
/// des Adresses_Nommées (Exigence 15).
///
[ApiController]
[Route("api/adresses-nommees")]
public class AdressesNommeesController : ControllerBase
{
private readonly IAdresseNommeeService _service;
public AdressesNommeesController(IAdresseNommeeService service)
{
_service = service;
}
/// Liste toutes les Adresses_Nommées, triées par Dénomination (15.1).
[HttpGet]
[ProducesResponseType(typeof(IReadOnlyList), StatusCodes.Status200OK)]
public async Task>> GetAll(CancellationToken cancellationToken)
{
var adresses = await _service.GetAllAsync(cancellationToken);
return Ok(adresses);
}
///
/// Crée une Adresse_Nommee. Rejette une Dénomination invalide/dupliquée ou une adresse
/// invalide (400).
///
[HttpPost]
[ProducesResponseType(typeof(AdresseNommeeDto), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task> Create(
[FromBody] SaveAdresseNommeeDto dto,
CancellationToken cancellationToken)
{
try
{
var cree = await _service.CreateAsync(dto, cancellationToken);
return CreatedAtAction(nameof(GetAll), null, cree);
}
catch (DenominationInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
catch (DenominationDupliqueeException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
catch (AdresseNommeeInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
}
///
/// Modifie une Adresse_Nommee. Rejette une Dénomination invalide/dupliquée ou une adresse
/// invalide (400) et une Adresse_Nommee introuvable (404).
///
[HttpPut("{id:int}")]
[ProducesResponseType(typeof(AdresseNommeeDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task> Update(
int id,
[FromBody] SaveAdresseNommeeDto dto,
CancellationToken cancellationToken)
{
try
{
var maj = await _service.UpdateAsync(id, dto, cancellationToken);
return Ok(maj);
}
catch (AdresseNommeeNotFoundException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status404NotFound);
}
catch (DenominationInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
catch (DenominationDupliqueeException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
catch (AdresseNommeeInvalideException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status400BadRequest);
}
}
///
/// Supprime une Adresse_Nommee. Les Trajets existants restent inchangés (15.14).
///
[HttpDelete("{id:int}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task Delete(int id, CancellationToken cancellationToken)
{
try
{
await _service.DeleteAsync(id, cancellationToken);
return NoContent();
}
catch (AdresseNommeeNotFoundException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status404NotFound);
}
}
}