feat(user) : soft-delete (archivage) des utilisateurs + UI archivage/désarchivage #30

Merged
matthieu merged 2 commits from fix/user-soft-delete-orphan-references into develop 2026-06-27 09:34:26 +00:00
Owner

Contexte

La suppression d'un utilisateur faisait un hard delete, ce qui orphelinait toutes les références (tâches, time entries, notifications…) et cassait leur sérialisation. On passe à un archivage (soft delete) et on ajoute l'interface d'administration correspondante.

Backend

  • DELETE /api/users/{id} → archive l'utilisateur (UserArchiveProcessor) au lieu de le supprimer : la ligne est conservée pour l'intégrité référentielle, l'apiToken est effacé.
  • Impossible d'archiver son propre compte (403).
  • Un utilisateur archivé ne peut plus se connecter (ArchivedUserChecker) et est masqué de GET /api/users (ExcludeArchivedUserExtension) ; un admin peut le lister via ?archived=true.
  • Restauration via PATCH /api/users/{id} { archived: false }.
  • Commande app:restore-missing-users pour réparer les références orphelines héritées (prod).
  • Migration + tests fonctionnels et unitaires.

Frontend (admin)

  • Badge « Archivé » + libellé barré dans la liste des utilisateurs.
  • Popup de confirmation avant archivage (précise que l'action est réversible et que les données sont conservées).
  • Bouton de restauration pour les utilisateurs archivés.
  • Case « Afficher les utilisateurs archivés » (filtre ?archived=true).
  • L'action d'archivage est masquée sur son propre compte (évite le 403).
  • Service users : getArchived / restore, toast de suppression repassé sur users.archived.
  • Traductions FR (archived / restored / badge / confirmation).
## Contexte La suppression d'un utilisateur faisait un hard delete, ce qui orphelinait toutes les références (tâches, time entries, notifications…) et cassait leur sérialisation. On passe à un **archivage** (soft delete) et on ajoute l'interface d'administration correspondante. ## Backend - `DELETE /api/users/{id}` → archive l'utilisateur (`UserArchiveProcessor`) au lieu de le supprimer : la ligne est conservée pour l'intégrité référentielle, l'`apiToken` est effacé. - Impossible d'archiver son propre compte (403). - Un utilisateur archivé ne peut plus se connecter (`ArchivedUserChecker`) et est masqué de `GET /api/users` (`ExcludeArchivedUserExtension`) ; un admin peut le lister via `?archived=true`. - Restauration via `PATCH /api/users/{id}` `{ archived: false }`. - Commande `app:restore-missing-users` pour réparer les références orphelines héritées (prod). - Migration + tests fonctionnels et unitaires. ## Frontend (admin) - Badge « Archivé » + libellé barré dans la liste des utilisateurs. - **Popup de confirmation** avant archivage (précise que l'action est réversible et que les données sont conservées). - **Bouton de restauration** pour les utilisateurs archivés. - Case « Afficher les utilisateurs archivés » (filtre `?archived=true`). - L'action d'archivage est masquée sur son propre compte (évite le 403). - Service `users` : `getArchived` / `restore`, toast de suppression repassé sur `users.archived`. - Traductions FR (archived / restored / badge / confirmation).
matthieu added 1 commit 2026-06-26 15:09:00 +00:00
feat(user) : UI archivage/désarchivage des utilisateurs côté admin
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m18s
Pull Request — Quality gate / Frontend (build) (pull_request) Successful in 1m29s
89ce523019
- badge « Archivé » et libellé barré dans la liste admin
- popup de confirmation avant archivage (rappelle que c'est réversible)
- bouton de restauration (PATCH archived:false) pour les archivés
- case « Afficher les utilisateurs archivés » (filtre ?archived=true)
- masque l'action d'archivage sur son propre compte (évite le 403)
- service users : getArchived/restore, toast remove -> users.archived
- i18n FR : clés archived/restored/badge/confirmation
matthieu added 1 commit 2026-06-27 09:32:20 +00:00
Merge branch 'develop' into fix/user-soft-delete-orphan-references
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 1m12s
Pull Request — Quality gate / Frontend (build) (pull_request) Successful in 1m23s
edf5fcc5f5
matthieu merged commit d56381b4b8 into develop 2026-06-27 09:34:26 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MALIO-DEV/Lesstime#30