feat: pockets CRUD + liaison arrondi #22

Merged
RiasGFirst merged 10 commits from feat-pockets into m2-banking-management 2026-06-14 10:55:23 +00:00
Owner

Summary

  • Ajoute la ressource Pocket (sous-compte rattaché à un compte) : modèle Sequelize, associations, routes CRUD complètes scopées bank → account → pocket, validations en cascade.
  • Ajoute la liaison pocket ↔ arrondi du compte via PUT /api/banks/:id/accounts/:accountId avec le champ arrondi_pocket_uuid (UUID pour lier, null pour délier). Réservé aux comptes courant, pocket du même compte, devise identique.
  • DELETE pocket renvoie 409 si la pocket est liée à un arrondi actif.
  • Bug fix OIDC : PKCE state stocké en mémoire (Map TTL 10 min) au lieu de la session pour éviter le mismatch callback, et session.save() explicite avant la réponse du callback pour persister userId côté connect-pg-simple avant l'envoi du JSON.
  • API tester (test/index.html) : section Pockets ajoutée, champ arrondi_pocket_uuid dans le formulaire PUT compte, flow login passé en single-tab (Chrome partitionne les cookies quand le callback s'ouvre dans une tab ouverte via window.open depuis une autre origine).
  • Doc docs/endpoints.md mise à jour.

Test plan

  • Login PocketID → GET /api/accounts/me répond 200 avec le user
  • POST /api/banks/:id/accounts/:accountId/pockets crée une pocket (devise normalisée en majuscules)
  • GET /pockets et GET /pockets/:pocketId retournent la bonne donnée
  • PUT /pockets/:pocketId modifie name/description, refuse devise
  • DELETE /pockets/:pocketId409 si liée à un arrondi actif, 200 sinon
  • PUT /accounts/:accountId avec arrondi_pocket_uuid sur un courant lie la pocket, sur un livret/epargne renvoie 400
  • Pocket d'un autre compte refusée (404), pocket avec devise différente refusée (400)
  • arrondi_pocket_uuid: null délie correctement
  • Validations cascade : bank inexistante → 404, account inexistant → 404

Closes #11

## Summary - Ajoute la ressource **Pocket** (sous-compte rattaché à un compte) : modèle Sequelize, associations, routes CRUD complètes scopées `bank → account → pocket`, validations en cascade. - Ajoute la **liaison pocket ↔ arrondi du compte** via `PUT /api/banks/:id/accounts/:accountId` avec le champ `arrondi_pocket_uuid` (UUID pour lier, `null` pour délier). Réservé aux comptes `courant`, pocket du même compte, devise identique. - DELETE pocket renvoie `409` si la pocket est liée à un arrondi actif. - Bug fix OIDC : PKCE state stocké en mémoire (Map TTL 10 min) au lieu de la session pour éviter le mismatch callback, et `session.save()` explicite avant la réponse du callback pour persister `userId` côté connect-pg-simple avant l'envoi du JSON. - API tester (`test/index.html`) : section Pockets ajoutée, champ `arrondi_pocket_uuid` dans le formulaire PUT compte, flow login passé en single-tab (Chrome partitionne les cookies quand le callback s'ouvre dans une tab ouverte via `window.open` depuis une autre origine). - Doc `docs/endpoints.md` mise à jour. ## Test plan - [x] Login PocketID → `GET /api/accounts/me` répond `200` avec le user - [x] `POST /api/banks/:id/accounts/:accountId/pockets` crée une pocket (devise normalisée en majuscules) - [x] `GET /pockets` et `GET /pockets/:pocketId` retournent la bonne donnée - [x] `PUT /pockets/:pocketId` modifie name/description, refuse devise - [x] `DELETE /pockets/:pocketId` → `409` si liée à un arrondi actif, `200` sinon - [x] `PUT /accounts/:accountId` avec `arrondi_pocket_uuid` sur un courant lie la pocket, sur un livret/epargne renvoie `400` - [x] Pocket d'un autre compte refusée (`404`), pocket avec devise différente refusée (`400`) - [x] `arrondi_pocket_uuid: null` délie correctement - [x] Validations cascade : bank inexistante → `404`, account inexistant → `404` Closes #11
RiasGFirst merged commit 115b5f10ea into m2-banking-management 2026-06-14 10:55:23 +00:00
RiasGFirst deleted branch feat-pockets 2026-06-14 10:55:23 +00:00
Sign in to join this conversation.
No reviewers
No labels
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
RiasNetwork/riasbudget!22
No description provided.