Toutes les modifications notables sont listées ici. Le format suit Keep a Changelog et le paquet adhère au versionnement sémantique.
IncidentDto— timestamps Robotalp — l'API Robotalp renvoiestarted_atetended_atsous forme d'entier Unix en millisecondes (ex :1779140556104). La v0.1.3 passait cette valeur brute àCarbon::parse(), ce qui levaitFailed to parse time string. Le DTO normalise désormais toute valeur numérique vers une chaîne ISO 8601 (gmdate('c', …)), avec division automatique ms → s. Les chaînes ISO déjà valides passent inchangées.
- Endpoints Robotalp réels — les chemins de l'API utilisés par
RobotalpProviderretournaient tous des 404 contre l'API publique de Robotalp. Mapping corrigé :buildOverview:workspace/{id}/robots/status/→robot/status/{id}/listMonitors:workspace/{id}/robots/→robot/?workspace_id={id}getMonitor:robot/{id}/→robot/{id}(sans slash final pour éviter le 301 qui perd l'en-têteAuthorization)getActiveIncidents:workspace/{id}/incident/active/→incident/?workspace_id={id}&status_id=0getMonitorDashboard:robot/{id}/→robot/{id}/dashboard
- Schéma d'authentification — l'en-tête
Authorization: Token <clef>est remplacé parAuthorization: ApiKey <clef>, le schéma réellement attendu par l'API Robotalp.
- Test Pest dédié vérifiant que l'en-tête
Authorization: ApiKey ...est bien envoyé. - Test Pest dédié vérifiant le bon endpoint et les paramètres
workspace_id+status_id=0pour les incidents actifs.
composer update memora/statutAucune variable d'environnement à modifier. La clef API Robotalp continue de se définir via STATUT_ROBOTALP_API_KEY.
- Régression v0.1.1 — vues namespacées — le regex de validation de
STATUT_LAYOUTintroduit en v0.1.1 rejetait à tort les vues namespacées Laravel (paquet::vue.name), syntaxe Blade standard utilisée par les modules nwidart, Filament, Jetstream et tout paquet publiant un layout. Le caractère:est désormais autorisé. La validation reste safe (pas de/,\, espace ni..).
- Rate-limit
throttle:60,1par défaut sur la route/statutpour protéger l'API distante des rafales. - Defaults brand à
nullpour éviter une fuite involontaire de la marque MEMORA solutions si l'intégrateur oublie ses variables d'environnement. IncidentDto::monitorIddevient?intau lieu d'un fallback à0(valeur d'ID invalide).incident-card:role="article"au lieu derole="alert"sur chaque carte (corrige un anti-pattern WCAG).Carbon::parse('')protégé contre les chaînes vides qui retournaient silencieusementnow().RobotalpProvider: garde explicite siapi_keyouworkspace_idmanquent — message d'erreur en français sans fuite du corps Robotalp.StatutController: validation regex dulayoutet de lasection(defense in depth).- Code mort retiré :
MonitorStatus::label(), fichierslang/{fr,en}/status.php. - Clef de config
locale_defaultretirée (app.localeLaravel est l'autorité unique).
composer.json: retrait deguzzlehttp/guzzleredondant (le code utilise la façadeHttp), ajout d'illuminate/httpexplicite, ajout du blocsupport(issues, source).- Vues : bloc brand entièrement omis si
nameetlogoabsents, footer rend la marque uniquement sinameest défini,rel="noopener noreferrer"sur tous les liens externes. - README : documentation de la dépendance au
<html lang>du layout hôte.
- Page publique
/statut(route configurable) qui s'intègre dans le layout Blade du site hôte. - Contrat
MonitoringProvider+ implémentationRobotalpProvider(façadeHttpLaravel +Cache::remember60 s). - Indicateur global (tous opérationnels, incident en cours, maintenance) avec compteurs total / up / down / paused / incidents.
- Cartes de moniteurs avec statut, dernier check, temps de réponse, barres uptime 24 h / 7 j / 30 j / 90 j.
- Liste des incidents actifs.
- Internationalisation FR (par défaut) + EN, traductions publiables.
- Mode sombre automatique via
prefers-color-scheme. - Accessibilité WCAG 2.2 AA (contrastes ≥ 4.5:1, focus visibles, rôles ARIA, cibles tactiles ≥ 44 × 44).
- Auto-refresh 60 s côté client, cache 60 s côté serveur.
- Aucune dépendance JavaScript ni Tailwind requise.
- Vues, configuration et traductions entièrement publiables.
- Tests Pest unitaires et fonctionnels via Http::fake() + Orchestra Testbench.
- CI GitHub Actions sur matrice PHP 8.2 / 8.3 / 8.4 × Laravel 10 / 11 / 12.