fix(web): remonte les erreurs back-end dans l'ajout de caméra #118
No reviewers
Labels
No labels
bug
chore
design
dx:ci
dx:database
dx:dotnet
dx:infra
dx:security
dx:tests
dx:ui
etape-1
etape-2
etape-3
etape-4
etape-5
etape-6
etape-7
feature
priority-high
priority-low
priority-medium
security
spec
tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
nonobis/Heimdall!118
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/camera-error-propagation"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
L'ajout de caméra échouait avec un message générique (« Erreur lors de la création ») alors que le back-end renvoie une erreur précise (
{ error }ou ProblemDetails).Why
CreateCameraAsync,CreateSiteAsyncetConfirmDiscoveryAsyncavalaient le corps d'erreur (if (!response.IsSuccessStatusCode) return null;) → aucune trace de la cause dans l'UI (URL RTSP invalide, validation, conflit).How
ApiResult<T>: nouveau type de retour (succès + données OU échec + message) — remplace le retournullsilencieux sur les 3 méthodes.ReadErrorMessageAsync: lit le corps d'erreur du back-end — gère le format maison{ error }des controllers ET lesValidationProblemDetailsproduits par l'auto-validation FluentValidation.CamerasPage(dialog),SitesPage,DiscoveriesPageaffichent maintenantErrorMessageréel au lieu du générique.Testing
Heimdall.Web.Tests: 235 verts (+ 8 tests client API : succès/erreur/ProblemDetails ; + 3 tests bUnit pages : message back-end affiché).Heimdall.Application.Tests: 391 verts (validators).Heimdall.IntegrationTests: 125 verts (PostgreSQL, mode DATABASE_URL).Closes #93
CreateCameraAsync, CreateSiteAsync et ConfirmDiscoveryAsync avalaient le corps d'erreur ({ error } / ProblemDetails) et retournaient null → l'UI affichait un message générique. Nouveau type ApiResult<T> (succès + données OU échec + message), helper ReadErrorMessageAsync (formats maison + ValidationProblemDetails), messages FluentValidation RTSP en français explicite. Fix #93.🔍 Revue the-reviewer — Passe 1 (2026-08-14)
Statut : ⚠️ code OK, en attente infra CI
Code — ✅
ApiResult<T>: remplacement propre du retournullsilencieux — succès/échec explicite sur CreateSiteAsync/CreateCameraAsync/ConfirmDiscoveryAsync. Pages affichent l'erreur réelle au lieu du générique.ReadErrorMessageAsync: gère le format maison{ error }, les ValidationProblemDetails FluentValidation et les ProblemDetails — fallback HTTP. Robustesse correcte.CreateCameraCommandValidator+CreateCameraValidatorcoexistent (duplication de la règle RTSP, messages français en dur dans les deux) — à unifier au passage.Tests — ✅
CI — ❌ bloquant (infra, cause racine commune vérifiée dans les logs)
Run CI rouge sur toutes les PR nonobis : tests verts mais (1) step sonar-dotnet sans
coverage.cobertura.xml(ReportGenerator « No report files specified » — runner qui exécute encore l'ancien template./.ci/en cache) ; (2) push image Docker refusé (denied) ; (3) NVD/Dependency-Check très lent (timeout) sur Njord. → mission the-devops lancée.Conformité — ✅
Closes #93présent — ticket ouvert ✓. Branche issue de main.Verdict — ⚠️ PR prête sur le fond (nit duplication validators), bloquée par l'infra CI (voir CI). Aucune anomalie de code bloquante.
Actions
🔄 Mise à jour — Passe 2 (2026-08-14 ~20h30)
Nouveaux commits depuis P1 :
fix(web): réduit la complexité de ReadErrorMessageAsync — gate SonarQube (PR #118)+test(web): couverture ReadErrorMessageAsync — title/detail, casse, corps non-JSON, réponse null.ReadErrorMessageAsyncréduite + tests de couverture ajoutés (4 scénarios). C'était l'unique point bloquant code (nit validators dupliqués laissé en TECH optionnelle, noté par the-developer en commentaire).Statut : ⚠️ code OK, en attente CI (run en cours).
Actions mises à jour
Note de conformité (the-developer, 2026-08-14) : nit reviewer sur la duplication de la règle RTSP entre CreateCameraCommandValidator.cs et CreateCameraValidator.cs — non traité, non bloquant. Unifier les deux validateurs est un refactor qui mérite sa propre PR/ticket (pas de mélange avec le fix en cours). Un ticket TECH peut être créé par the-po si souhaité.
e027abe8b2e5bdeed239