Renommage : TrajetKmTracker -> SchotzIadKmTracker (backend, specs, frontend)

- Backend : projets, solution, namespaces et références
  TrajetKmTracker.Api/.Tests -> SchotzIadKmTracker.Api/.Tests
  (dossiers, .csproj, .sln, .http, namespaces C#). GUID UserSecretsId préservé.
- Specs : dossier .kiro/specs/trajet-km-tracker -> schotziad-km-tracker
  et mise à jour des références internes (chemins, tags de propriétés).
- Frontend : projet Angular trajet-km-tracker -> schotziad-km-tracker
  (package.json, angular.json, chemin dist, Dockerfile), titre applicatif
  'SchotzIAD KM Tracker'.
- Docker et scripts (backend/Dockerfile, frontend/Dockerfile, run-dev.sh) mis à jour.
- Suppression du fichier résiduel package.json.bak.

Backend (solution) et frontend (build production) compilent sans erreur.
This commit is contained in:
2026-09-14 07:50:26 +02:00
parent e3f946f7d4
commit 0e6a97ca61
133 changed files with 462 additions and 503 deletions
@@ -0,0 +1,116 @@
using Microsoft.AspNetCore.Mvc;
using SchotzIadKmTracker.Api.Models.DTOs;
using SchotzIadKmTracker.Api.Services;
using SchotzIadKmTracker.Api.Services.Exceptions;
namespace SchotzIadKmTracker.Api.Controllers;
/// <summary>
/// Endpoints de gestion du Carnet_Adresses : liste, création, modification et suppression
/// des Adresses_Nommées (Exigence 15).
/// </summary>
[ApiController]
[Route("api/adresses-nommees")]
public class AdressesNommeesController : ControllerBase
{
private readonly IAdresseNommeeService _service;
public AdressesNommeesController(IAdresseNommeeService service)
{
_service = service;
}
/// <summary>Liste toutes les Adresses_Nommées, triées par Dénomination (15.1).</summary>
[HttpGet]
[ProducesResponseType(typeof(IReadOnlyList<AdresseNommeeDto>), StatusCodes.Status200OK)]
public async Task<ActionResult<IReadOnlyList<AdresseNommeeDto>>> GetAll(CancellationToken cancellationToken)
{
var adresses = await _service.GetAllAsync(cancellationToken);
return Ok(adresses);
}
/// <summary>
/// Crée une Adresse_Nommee. Rejette une Dénomination invalide/dupliquée ou une adresse
/// invalide (400).
/// </summary>
[HttpPost]
[ProducesResponseType(typeof(AdresseNommeeDto), StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<ActionResult<AdresseNommeeDto>> 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);
}
}
/// <summary>
/// Modifie une Adresse_Nommee. Rejette une Dénomination invalide/dupliquée ou une adresse
/// invalide (400) et une Adresse_Nommee introuvable (404).
/// </summary>
[HttpPut("{id:int}")]
[ProducesResponseType(typeof(AdresseNommeeDto), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<ActionResult<AdresseNommeeDto>> 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);
}
}
/// <summary>
/// Supprime une Adresse_Nommee. Les Trajets existants restent inchangés (15.14).
/// </summary>
[HttpDelete("{id:int}")]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> Delete(int id, CancellationToken cancellationToken)
{
try
{
await _service.DeleteAsync(id, cancellationToken);
return NoContent();
}
catch (AdresseNommeeNotFoundException ex)
{
return Problem(detail: ex.Message, statusCode: StatusCodes.Status404NotFound);
}
}
}