using Microsoft.AspNetCore.Mvc; using TrajetKmTracker.Api.Models.DTOs; using TrajetKmTracker.Api.Services; using TrajetKmTracker.Api.Services.Exceptions; namespace TrajetKmTracker.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); } } }