fix(web): remonte les erreurs back-end dans l'ajout de caméra #118

Merged
nonobis merged 3 commits from fix/camera-error-propagation into main 2026-08-14 21:07:30 +02:00
Owner

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, CreateSiteAsync et ConfirmDiscoveryAsync avalaient 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 retour null silencieux sur les 3 méthodes.
  • ReadErrorMessageAsync : lit le corps d'erreur du back-end — gère le format maison { error } des controllers ET les ValidationProblemDetails produits par l'auto-validation FluentValidation.
  • Pages : CamerasPage (dialog), SitesPage, DiscoveriesPage affichent maintenant ErrorMessage réel au lieu du générique.
  • Validators : message RTSP en français explicite (« L'URL RTSP doit être une URI absolue valide (ex. rtsp://192.168.1.100:554/stream1) »).

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).
  • Build solution complet 0 erreur (TreatWarningsAsErrors).

Closes #93

## 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`, `CreateSiteAsync` et `ConfirmDiscoveryAsync` avalaient 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 retour `null` silencieux sur les 3 méthodes. - **`ReadErrorMessageAsync`** : lit le corps d'erreur du back-end — gère le format maison `{ error }` des controllers ET les `ValidationProblemDetails` produits par l'auto-validation FluentValidation. - **Pages** : `CamerasPage` (dialog), `SitesPage`, `DiscoveriesPage` affichent maintenant `ErrorMessage` réel au lieu du générique. - **Validators** : message RTSP en français explicite (« L'URL RTSP doit être une URI absolue valide (ex. rtsp://192.168.1.100:554/stream1) »). ## 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). - Build solution complet 0 erreur (TreatWarningsAsErrors). Closes #93
fix(web): remonte les erreurs back-end dans l'ajout de caméra
Some checks failed
CI / ci (pull_request) Failing after 6m2s
6b51e5bab7
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.
ci: re-trigger — sonar-dotnet exclut E2E (cdbb92f)
Some checks failed
CI / ci (pull_request) Failing after 8m54s
329aca3abb
ci: re-trigger — gate SonarQube avec contexte PR (47f6fdc)
Some checks failed
CI / ci (pull_request) Failing after 16m55s
6a782d5e80
Author
Owner

🔍 Revue the-reviewer — Passe 1 (2026-08-14)

Statut : ⚠️ code OK, en attente infra CI

Code — ✅

  • ApiResult<T> : remplacement propre du retour null silencieux — 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.
  • ⚠️ Nit : CreateCameraCommandValidator + CreateCameraValidator coexistent (duplication de la règle RTSP, messages français en dur dans les deux) — à unifier au passage.

Tests — ✅

  • 8 tests client API (succès/erreur/ProblemDetails) + 3 tests bUnit pages. Annoncé 235 verts Web.

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 #93 présent — ticket ouvert ✓. Branche issue de main.
  • Nit : format du body What/Why/How (≠ template unifié Contexte/Tickets/Tests/CVE) — cohérent avec les autres PR Heimdall, toléré.

Verdict — ⚠️ PR prête sur le fond (nit duplication validators), bloquée par l'infra CI (voir CI). Aucune anomalie de code bloquante.

Actions

  1. the-devops : réparer l'infra CI (blocage commun à toutes les PR).
  2. the-developer : nit unification des 2 validators (optionnel, peut être une PR TECH séparée).

🔄 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.

  • ✅ Gate SonarQube traité : complexité de ReadErrorMessageAsync ré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).
  • ⚠️ Run CI 2185 en cours au moment de la revue — statut à confirmer.

Statut : ⚠️ code OK, en attente CI (run en cours).

Actions mises à jour

  1. Attendre le run 2185 (et l'infra the-devops si rouge).
  2. Nit validators dupliqués : toujours optionnel (TECH séparée).
## 🔍 Revue the-reviewer — Passe 1 (2026-08-14) **Statut : ⚠️ code OK, en attente infra CI** ### Code — ✅ - `ApiResult<T>` : remplacement propre du retour `null` silencieux — 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. - ⚠️ Nit : `CreateCameraCommandValidator` + `CreateCameraValidator` coexistent (duplication de la règle RTSP, messages français en dur dans les deux) — à unifier au passage. ### Tests — ✅ - 8 tests client API (succès/erreur/ProblemDetails) + 3 tests bUnit pages. Annoncé 235 verts Web. ### 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 #93` présent — ticket ouvert ✓. Branche issue de main. - Nit : format du body What/Why/How (≠ template unifié Contexte/Tickets/Tests/CVE) — cohérent avec les autres PR Heimdall, toléré. ### Verdict — ⚠️ PR prête sur le fond (nit duplication validators), bloquée par l'infra CI (voir CI). Aucune anomalie de code bloquante. ### Actions 1. the-devops : réparer l'infra CI (blocage commun à toutes les PR). 2. the-developer : nit unification des 2 validators (optionnel, peut être une PR TECH séparée). --- ## 🔄 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`. - ✅ **Gate SonarQube traité** : complexité de `ReadErrorMessageAsync` ré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). - ⚠️ Run CI **2185 en cours** au moment de la revue — statut à confirmer. **Statut : ⚠️ code OK, en attente CI (run en cours).** ### Actions mises à jour 1. Attendre le run 2185 (et l'infra the-devops si rouge). 2. Nit validators dupliqués : toujours optionnel (TECH séparée).
6 tests supplémentaires (HeimdallApiClientTests) pour couvrir les chemins
manquants de la gestion d'erreurs API : ProblemDetails title/detail seuls,
FindStringProperty insensible à la casse, corps non-JSON (fallback HTTP),
réponse 'null' (Réponse du serveur invalide). Objectif : relever la
couverture du nouveau code sous le gate SonarQube de la PR.
Author
Owner

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é.

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é.
Violations Sonar new code : S3776 (complexité cognitive 39 > 15) et
S3267 (boucle → Select). Extraction de ExtractValidationMessages et
FallbackErrorMessage, early-return sur non-object. 30 tests verts.
ci: re-run post infra fix
Some checks failed
CI / ci (pull_request) Has been cancelled
ec066c22bd
ci: re-run post infra fix
Some checks failed
CI / ci (pull_request) Failing after 25m11s
e027abe8b2
nonobis force-pushed fix/camera-error-propagation from e027abe8b2
Some checks failed
CI / ci (pull_request) Failing after 25m11s
to e5bdeed239
Some checks failed
CI / ci (pull_request) Failing after 21m54s
2026-08-14 20:12:42 +02:00
Compare
nonobis deleted branch fix/camera-error-propagation 2026-08-14 21:07:37 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
nonobis/Heimdall!118
No description provided.