Appearance
BDD-38 — Suppression de dossier client
1. User Story
En tant que super administrateur, Je veux supprimer un dossier client, Afin de nettoyer les dossiers obsolètes.
2. Critères d'acceptation
- Une action "Supprimer" est disponible sur chaque dossier
- Une confirmation explicite est demandée
- La suppression d'un dossier entraîne la suppression de tous ses sous-dossiers et fichiers en cascade
- Les fichiers physiques sont supprimés sur S3
- Le dossier et son contenu disparaissent immédiatement de la liste admin
- En cas d’erreur, notifier, mais ne pas faire de rollback, s’assurer que les fichiers supprimés le soit bien. (Si + de 1000 fichiers, prévoir une notification par email, si la tâche est trop longue)
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/folders/folder.controller.ts | Endpoint DELETE /folders/:uuid/root (suppression racine définitive) |
back/src/api/folders/folder.service.ts | Suppression cascade dossiers/documents + suppression S3 best-effort + notification email tâche longue |
back/src/api/folders/dto/folder.dto.ts | DTO DeleteRootFolderRequestDto (validation folderName) |
back/src/exceptions/folder.exceptions.ts | Exception FolderDeleteConfirmationMismatchException |
back/src/domains/s3Helper/deleteFiles.ts | Suppression S3 batchée (1000 max), multi-bucket, retour simplifié { deleted, errors } |
back/src/domains/sesHelper/sendEmail.ts | Envoi de notification SES pour suppression longue |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/admin/folders/AdminFoldersPage.vue | Dialog de confirmation avec saisie du nom + blocage du bouton tant que mismatch |
front/src/stores/folder-store.js | Appel API DELETE /folders/:uuid/root avec body { folderName } |
front/src/components/ui/PopUpCard.vue | Support confirmDisabled pour bloquer la confirmation côté UI |
front/src/components/ui/ActionMenuButton.vue | Menu d’actions réutilisable (intégré aux listes dossiers/fichiers) |
front/src/components/admin/FolderListItem.vue | Action supprimer via composant d’actions réutilisable |
front/src/components/documents/DocumentListItem.vue | Action menu migrée vers composant réutilisable |
4. Endpoints API (rappel)
| Méthode | Chemin | Description |
|---|---|---|
DELETE | /folders/:uuid/root | Suppression définitive d’un dossier racine + sous-dossiers + documents |
Body requis :
json
{
"folderName": "Nom exact du dossier"
}5. Règles métier implémentées
- La suppression est réservée au super-admin.
- La confirmation front exige la saisie exacte du nom du dossier.
- Le backend vérifie également
folderName(sécurité anti-contournement). - Les suppressions S3 sont best-effort :
- les documents supprimés sur S3 sont supprimés en base,
- les documents en échec restent en base,
- le dossier est supprimé uniquement si l’arbre est vide après traitement.
- En cas d’échec partiel S3 : notification utilisateur, pas de rollback global.
- Si volume important + durée longue : notification email (SES) au user initiateur.
6. Points de vérification
- Le bouton
Supprimerest présent dans les actions dossier. - Le dialog affiche le nom attendu et un champ de confirmation.
- Le bouton de confirmation est désactivé tant que la saisie ne correspond pas.
- Le front envoie bien
folderNamedans la requête de suppression. - Le back lève une
400sifolderNamene correspond pas au dossier cible. - Le dossier disparaît de la liste uniquement si l’arbre est effectivement supprimé.
- Les erreurs de suppression partielle sont notifiées sans rollback complet.
7. Tests associés
Backend (unitaires)
back/src/api/folders/folder.service.spec.ts- suppression complète (
folderDeleted: true) - suppression partielle S3 (
folderDeleted: false) - mismatch nom confirmation =>
FolderDeleteConfirmationMismatchException
- suppression complète (
back/src/domains/s3Helper/deleteFiles.spec.ts- cas vide, succès, erreurs objet, erreurs techniques, batching 1000+
back/src/domains/sesHelper/sendEmail.spec.ts- envoi raw SES
- erreur si variables AWS SES manquantes
Frontend (unitaires)
front/src/__tests__/pages/admin/folders/AdminFoldersPage.spec.js- blocage confirmation si nom invalide
- appel
deleteRootFolder(uuid, folderName)si nom valide
front/src/__tests__/stores/folder-store.spec.js- appel
DELETE /folders/:uuid/rootavec body{ folderName }
- appel
front/src/__tests__/components/ui/PopUpCard.spec.jsconfirmDisabledempêche l’emitconfirm
front/src/__tests__/components/admin/FolderListItem.spec.js- actions via
ActionMenuButton(renommer/supprimer)
- actions via
front/src/__tests__/components/documents/DocumentListItem.spec.js- actions via
ActionMenuButton(télécharger/copier lien)
- actions via
front/src/__tests__/components/ui/ActionMenuButton.spec.js- rendu actions/captions, emit action-click, action disabled
Frontend (e2e)
front/e2e/pages/admin/admin-folders.spec.js- ouverture menu actions dossier, libellés/captions
front/e2e/pages/admin/admin-folder-detail.spec.js- ouverture menu actions document, libellés attendus
8. Notes d’implémentation
- La route finale est
/root(remplacement de l’ancienne/permanent). - Le helper S3 retourne un format d’erreur unifié et simple.
deleteFilesconserve l’idempotence S3 : un objet inexistant peut être considéré supprimé par S3.- Le contrôle de confirmation est doublé front + back pour fiabilité et sécurité.
