Commit Graph
97 Commits
Author SHA1 Message Date
Johan LEROY 76fa90dfcb test(backend): exerce AlertSeverity comme enum plutot qu'une chaine dans les tests alerts
Backend / Lint, typage et tests (push) Successful in 1m8s
Le filtre severity passait par une chaine brute dans les tests, sans jamais
exercer le trajet reel AlertSeverity (enum) -> SQLAlchemy -> PostgreSQL.
2026-09-16 14:43:27 +02:00
Johan LEROY e13096c62a Fusionne dev dans feat/endpoint-alertes-predictives
Resout les conflits additifs entre les routes alerts, recommendations
et stats mergees sur dev (PR #79, PR #82) pendant le developpement de
cette branche : deps.py, router.py, openapi.py, openapi.json,
test_openapi.py et 20-backend.md conservent desormais les trois routes.
2026-09-16 14:25:49 +02:00
Johan LEROYandGitHub 3fb907d6f6 Merge pull request #82 from ineszang/feat/endpoint-recommandations
feat(backend): ajoute GET /recommendations et GET /recommendations/{r…
2026-09-16 14:21:08 +02:00
Dorian PESCE c7490d01b3 Merge remote-tracking branch 'origin/dev' into feat/endpoint-recommandations 2026-09-16 14:03:24 +02:00
Johan LEROYandGitHub 523b623dc1 Merge pull request #79 from ineszang/feat/stats-summary
feat(backend): expose GET /api/v1/stats/summary
2026-09-16 13:37:47 +02:00
Johan LEROY 61e031fc16 Fusionne dev dans feat/stats-summary
Resout les conflits de deps.py, router.py, repositories/site.py et
test_site.py entre l'ajout de stats et le merge de sites/openapi-contrat
sur dev. Generalise ROUTES_A_ROLE dans test_openapi.py et documente la
checklist d'ajout d'une route metier, absentes de dev au moment du fork.
2026-09-16 13:37:03 +02:00
Dorian PESCE 781644b28e feat(backend): ajoute GET /recommendations et GET /recommendations/{recommendation_id} 2026-09-16 13:30:51 +02:00
Johan LEROY 1654e4dd81 docs(backend): documente la checklist d'ajout d'une route metier
La generalisation de ROUTES_A_ROLE (commit precedent) avait deja ete
approuvee sur feat/openapi-contrat mais poussee apres la fermeture de
la PR #76 : elle n'a donc jamais atteint dev, et sa documentation non
plus. Complete ce qui manquait pour que le passage a l'echelle du
contrat OpenAPI soit reellement utilisable par la prochaine route.
2026-09-16 13:27:41 +02:00
Johan LEROY e50921c907 feat(backend): expose GET /api/v1/alerts
Consultation des alertes de consommation, filtrable par site_id et
severity a l'identique du contrat GET /alerts de l'API Mock. Reprend
le gabarit endpoints -> services -> repositories -> models pose par
sites, sur la table alert deja creee par la revision Alembic
e6d2026091501.

Generalise aussi le garde-fou OpenAPI du 403 (ROUTES_A_ROLE) au-dela
du seul tag users, pour que l'ajout d'alerts a la liste des routes
protegees par role soit reellement verifie.

Closes #59
2026-09-16 13:06:37 +02:00
PhyriosandGitHub 56f7211f0b Merge pull request #77 from ineszang/feat/frontend-make-dev
feat(build): branche le frontend sur make dev
2026-09-16 12:34:41 +02:00
Johan LEROY c83fd889b8 Fusionne dev dans feat/frontend-make-dev
Combine les cibles install-backend/install-frontend/dev-backend/dev-frontend
introduites ici avec la cible openapi ajoutee par PR #76 (merge de dev).
2026-09-16 12:21:20 +02:00
Johan LEROYandGitHub cf22b2ae55 Merge pull request #76 from ineszang/feat/openapi-contrat
feat(backend): documente et verse le contrat OpenAPI
2026-09-16 12:05:27 +02:00
Johan LEROY 12c5cf87ad Merge branch 'dev' into feat/openapi-contrat
Complète le contrat OpenAPI de GET /sites et GET /sites/{site_id} (merges depuis dev via #78) :
tag sites décrit, REPONSES_LECTEUR (401 + 403 mot de passe provisoire) posée au niveau du
routeur, 404 et 422 documentés sur la route detail. openapi.json régénéré.
2026-09-16 12:04:32 +02:00
Johan LEROYandGitHub 7b076171d2 Merge pull request #78 from ineszang/feat/endpoints-get-sites-et-get-site
feat/endpoints get sites et get site
2026-09-16 11:55:56 +02:00
Johan LEROY ad149db0cb fix(backend): corrige une assertion tautologique dans test_list_all_returns_the_sites_sorted_by_identifier
Backend / Lint, typage et tests (push) Successful in 1m7s
L'assertion comparait le résultat à lui-même trié, donc vraie quel que
soit l'ordre réellement renvoyé par SiteRepository.list_all(). Compare
désormais à des identifiants connus à l'avance.
2026-09-16 11:55:03 +02:00
Johan LEROY 50dcb4de32 feat(backend): expose GET /api/v1/stats/summary
Ajoute le resume instantane de consommation du parc attendu par le
frontend (deja developpe contre ce contrat en mode mock). Nouveaux
SiteRepository et ReadingRepository (derniere lecture par site via
DISTINCT ON), StatsService pour l'agregation et les cas de repli
(capacite nulle, absence de lecture, data_quality inconnue), et le
endpoint lecteur-seul correspondant. Documentation des routes et du
schema des couches mises a jour.
2026-09-16 11:45:58 +02:00
Dorian PESCE d25e544db6 fix(backend): contourne un bug de ruff format sur le except à deux types de health.py 2026-09-16 11:41:53 +02:00
Dorian PESCE 22ff1d93f4 fix(backend): type le retour de SiteRepository.get_by_id pour mypy strict 2026-09-16 11:29:18 +02:00
Johan LEROYandGitHub d632af57b8 Merge pull request #74 from ineszang/docs/coherence-40-data
docs(architecture): remet 40-data.md en accord avec le schema livre
2026-09-16 11:25:43 +02:00
Johan LEROY fabd073aaf fix(backend): documente le 403 CSRF de require_trusted_origin
Le contrat OpenAPI et 31-contrat-authentification.md passaient sous
silence le 403 leve par require_trusted_origin sur refresh, logout,
logout-all et password. Ajoute REPONSE_ORIGINE_REFUSEE, regenere
openapi.json et etend test_openapi.py pour verifier que ces quatre
routes le declarent.
2026-09-16 11:22:40 +02:00
Dorian PESCE 31a9cb109f fix(backend): corrige la syntaxe except invalide de la sonde /health/ready 2026-09-16 11:04:27 +02:00
Dorian PESCE 50dddf952b feat(backend): ajoute les endpoints GET /sites et GET /sites/{site_id} 2026-09-16 11:03:06 +02:00
Dorian PESCE fc6600aeaf Revert "feat(backend): ajoute les endpoints GET /sites et GET /sites/{site_id}"
This reverts commit 1325a75e9a.
2026-09-16 11:02:00 +02:00
Dorian PESCE 1325a75e9a feat(backend): ajoute les endpoints GET /sites et GET /sites/{site_id} 2026-09-16 11:01:13 +02:00
Johan LEROY 16a0cc4d3b fix(build): stabilise make dev pour le frontend
Desactive le prompt d'analytics Angular CLI (bloquait ng serve en
sous-processus non interactif) et affiche les URLs backend/frontend au
demarrage de make dev.
2026-09-16 10:36:31 +02:00
Johan LEROY 5e7cb005ac feat(build): branche le frontend sur make dev
Ajoute install-frontend/dev-frontend au Makefile, dev/install deviennent
composites (backend + frontend lances ensemble), et met a jour README et
docs/architecture en consequence.

Closes #75
2026-09-16 10:25:22 +02:00
Johan LEROY 3347fa5bdb docs(architecture): acte le contrat OpenAPI dans la vue backend
20-backend.md gagne une section qui dit où vit le schéma, comment on le
régénère, pourquoi il est versionné en plus d'être servi, et pourquoi servers,
license_info et contact restent absents. La table des routes gagne la colonne
des codes d'erreur déclarés.

31-contrat-authentification.md renvoyait le frontend vers /docs, donc vers une
API qui tourne. Il renvoie maintenant vers le fichier, lisible sans rien
lancer.
2026-09-16 10:14:19 +02:00
Johan LEROY da481d7485 feat(backend): verse le contrat OpenAPI au dépôt et le garde honnête
`make openapi` écrit apps/backend/openapi.json, et un test compare le fichier
versionné au schéma généré. Une route qui change son contrat public le montre
donc dans la diff d'une pull request, et une PR qui oublie de régénérer échoue
en CI : le fichier vit sous apps/backend, que le filtre de chemins de
backend.yml couvre.

Le schéma exporté ne lit ni le .env du poste ni les variables APP_ : tout ce
qui l'atteint est posé par settings_du_contrat(), sans quoi le fichier
changerait de machine en machine.

main() réclamait un mot de passe avant de lire la commande. Le branchement
passe devant, sinon l'export serait resté bloqué sur getpass.
2026-09-16 10:12:50 +02:00
Johan LEROY 344f82fcdd feat(backend): documente le contrat d'erreur dans l'OpenAPI
Le schéma ne déclarait aucun code d'erreur : ni 401, ni 403, ni 404, ni 409,
ni 429. Swagger affirmait que /auth/login ne pouvait répondre que 200 ou 422,
alors que 31-contrat-authentification.md décrit ces codes comme le contrat que
le frontend doit traiter.

Le 422 publié était pire qu'absent : le schéma exposait HTTPValidationError,
le modèle par défaut de FastAPI avec sa clé `loc`, quand
validation_error_handler renvoie {"detail": [{"champ", "type"}]}. Un client
codé sur la documentation lisait une clé qui n'arrive jamais.

Les métadonnées arrivent avec : description, résumé et une description par
tag. `servers`, `license_info` et `contact` restent absents, ils poseraient
des décisions qui ne sont pas prises.

Le cookie de rafraîchissement devient visible par un APIKeyCookie en
auto_error=False, purement documentaire : lit_le_cookie() reste seul maître du
401 de /auth/refresh.

Au passage, health.py posait son tag deux fois, une fois sur son APIRouter et
une fois à l'include_router.
2026-09-16 10:12:41 +02:00
Johan LEROYandGitHub 44468e85d7 Merge pull request #73 from ineszang/feat/dashboard-graph
Feat/dashboard graph
2026-09-16 09:42:55 +02:00
Johan LEROY 580da72eff docs(architecture): acte le tableau de bord dans les vues frontend
30-frontend.md decrivait encore un ng new intact : routes vides,
provideHttpClient absent, app.html par defaut, aucune bibliotheque de
graphiques. Les sections Arborescence et Flux HTTP passent de Cible a
realisees, et le diagramme de sequence montre ou l'intercepteur se place.

La section Securite affirmait que l'authentification n'existe pas cote API :
elle existe depuis la PR #70, c'est cote interface qu'il n'y a rien.

Ajout verifie sur le poste : l'Angular CLI refuse de demarrer en dessous de
Node 22.22.3, 24.15.0 ou 26.0.0.
2026-09-16 09:23:15 +02:00
Johan LEROY e85c83972a chore(frontend): sort le rapport JUnit du suivi git
La ligne /test-results ajoutee au .gitignore n'avait aucun effet : le fichier
etait deja suivi, et un .gitignore ne s'applique pas a un fichier indexe. Il
reapparaissait donc modifie dans le diff de chacun a chaque execution de ng
test, qui le regenere a l'emplacement fixe par angular.json.
2026-09-16 09:20:48 +02:00
Johan LEROY da97e6aa8b style(frontend): applique prettier aux fichiers du tableau de bord
Les onze fichiers non conformes au .prettierrc du projet etaient exactement
ceux introduits ou modifies par cette branche ; les vingt-deux autres du
frontend etaient deja propres.

Aucune modification de comportement : indentation, virgules finales et
longueur de ligne a 100 caracteres.
2026-09-16 09:20:40 +02:00
Johan LEROY 0259f66b62 fix(frontend): detruit les graphiques avec leur composant
Chart.js conserve chaque instance dans un registre lie au canvas et lui
attache un observateur de redimensionnement. Sans destroy, tout survit a la
destruction du composant, et une re-creation sur le meme canvas echoue avec
"Canvas is already in use".

Les doubles de test gagnent destroy : TestBed detruit les fixtures apres
chaque test, un mock sans cette methode fait tomber les specs existantes.
2026-09-16 09:20:17 +02:00
Johan LEROY 7b9406965e fix(frontend): maintient le rafraichissement du tableau de bord en cas d'erreur
Sans catchError, la premiere reponse en erreur terminait le flux du timer :
le rafraichissement ne repartait jamais et l'ecran restait fige sur des
chiffres perimes, sans rien signaler.

Le catchError porte sur l'observable interne du switchMap. Place sur le flux
externe il terminerait le timer tout autant. Un signal error alimente un
bandeau, efface des qu'une reponse valide revient.
2026-09-16 09:20:17 +02:00
Johan LEROY 881f503f1a Merge remote-tracking branch 'origin/dev' into feat/dashboard-graph 2026-09-16 09:15:26 +02:00
Johan LEROYandGitHub 918bd971da Merge pull request #71 from ineszang/feat/data-schema
feat(apps): ajoute le schéma de données EnerVision
2026-09-16 08:52:04 +02:00
Johan LEROY 6c1f86b4ce docs(architecture): remet 40-data.md en accord avec le schema livre
L'avertissement affirmait qu'aucune table applicative n'existait, vingt lignes
avant la liste des tables d'authentification. La section « Modèle métier »
décrivait un modèle candidat que la « Modélisation détaillée » contredit
depuis la livraison du schéma : elle disparaît, et le gabarit d'hypertable
s'appuie désormais sur la révision réelle.

Les conventions annonçaient une colonne de partitionnement nommée horodatage,
alors qu'elle s'appelle timestamp. Les six tables data prennent leur nom au
singulier, et les questions tranchées par le schéma sortent des questions
ouvertes.
2026-09-16 08:47:10 +02:00
Johan LEROY 3eb5a0e8dc style(backend): applique ruff format au modele data
Backend / Lint, typage et tests (push) Successful in 1m7s
La cible make check ne lance que ruff check ; la CI lance en plus
ruff format --check, qui refusait la contrainte unique repliee.
2026-09-16 08:43:12 +02:00
Johan LEROY c733ccfc62 refactor(backend): passe les tables data au singulier et clarifie alert_id
La convention de docs/architecture/40-data.md impose des noms de tables au
singulier, que les quatre tables d'authentification respectent déjà. Les six
tables data passent donc au singulier, avec leurs contraintes et leurs index.

La révision n'étant appliquée que sur des bases locales, elle est modifiée sur
place plutôt que doublée d'une migration de renommage.

alert_id désignait deux colonnes différentes : la clé métier text de l'API Mock
et la clé étrangère bigint de recommendation. La première devient
source_alert_id, la seconde pointe désormais vers alert.alert_id.
2026-09-16 08:41:48 +02:00
valentin cdef30736a Creation dashboard (graph chart.js) + tests 2026-09-15 16:48:55 +02:00
Johan LEROY e3e0e843d0 fix(backend): rebranche la revision data sur la tete d'authentification
Le merge de dev apporte trois revisions d'authentification qui partent de la
meme racine 5353c0e4f094 que la revision data. Git ne signale rien, mais
alembic upgrade head refuse de choisir entre deux tetes.

La revision data se greffe desormais sur 821f71be74c0, ce qui rend la chaine
lineaire.
2026-09-15 16:46:37 +02:00
Johan LEROY c3b7c818aa Merge remote-tracking branch 'origin/dev' into feat/data-schema
# Conflicts:
#	apps/backend/app/models/__init__.py
2026-09-15 16:46:16 +02:00
PhyriosandGitHub 935782bbca Merge pull request #70 from ineszang/feat/auth-backend
feat(backend): authentification et autorisation de bout en bout
2026-09-15 16:34:32 +02:00
Meryemel-gham c04ce9a9ae test(apps): verifie les contraintes du schema data 2026-09-15 16:16:40 +02:00
Meryemel-gham 128133761f feat(apps): cree les six tables data et l'hypertable readings 2026-09-15 16:16:18 +02:00
Meryemel-gham b032f084fc fix(apps): gere les caracteres encodes dans l'URL Alembic 2026-09-15 16:15:21 +02:00
Johan LEROYandGitHub 6c4684a4f6 Merge pull request #69 from ineszang/feat/data-ia-setup
docs: ajout du schéma de données et de sa description
2026-09-15 15:13:23 +02:00
Johan LEROY bfbd9ee2cc test(backend): couvre le changement de mot de passe
Backend / Lint, typage et tests (push) Successful in 1m7s
`AuthService.change_password` n'avait aucun test unitaire, alors qu'il
porte la promesse que l'appareil courant reste connecté pendant que tous
les autres tombent. Deux cas : le nominal, où une seule session est
rouverte après la révocation, et le refus quand le mot de passe actuel
est faux, qui ne doit rien révoquer.
2026-09-15 15:06:20 +02:00
Johan LEROY 3b7383697e docs: acte les décisions d'authentification et met à jour les vues
Trois ADR : le jeton d'accès et le rafraîchissement opaque, le RBAC avec
relecture du compte à chaque requête, et le journal d'audit en ajout
seul. Chacun porte ses alternatives écartées et son critère de bascule,
notamment celui vers OIDC.

`31-contrat-authentification.md` est destiné au frontend : endpoints,
codes d'erreur à traiter, et les quatre règles qui comptent. La
troisième, un seul rafraîchissement en vol, est une exigence et non une
optimisation : cinq rotations concurrentes seraient lues comme un rejeu
et révoqueraient la session à chaque chargement de page.

`owasp-traceabilite.md` remplace la revendication « couverture OWASP Top
10 et API Top 10 » de la NFR4, qui n'a pas de réponse honnête sur vingt
items en deux semaines. Un contrôle par ligne, l'item adressé, et une
section qui dit ce qui reste ouvert : portée par site, bornage des
lectures de séries, transport, et la consommation de l'API Mock.

Les vues 00, 20 et 40 suivent, comme l'impose leur propre règle de
maintenance. La question ouverte « quel mécanisme d'authentification »
est fermée ; trois autres la remplacent, dont la portée par site.
2026-09-15 15:05:28 +02:00