Appearance
BDD-43 — Suppression d’un sous-dossier
1. User Story
En tant que client externe (entreprise) ou super administrateur,
Je veux supprimer un sous-dossier,
Afin de nettoyer mon arborescence.
2. Critères d'acceptation
- Une action « Supprimer » est disponible sur chaque sous-dossier.
- Une confirmation explicite est demandée :
- affichage du nombre de fichiers et sous-dossiers enfants impactés,
- saisie du nom exact du sous-dossier.
- La suppression entraîne une suppression en cascade de tous les sous-dossiers enfants et des fichiers contenus.
- Les fichiers physiques sont supprimés sur S3.
- Le sous-dossier disparaît immédiatement de la vue détail après suppression complète.
- En cas d’erreur S3 partielle, les fichiers déjà supprimés restent supprimés, le dossier est conservé si son arbre n’est pas vide et l’utilisateur est notifié.
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/folders/folder.controller.ts | Endpoint DELETE /folders/:uuid pour suppression définitive d’un sous-dossier |
back/src/api/folders/folder.service.ts | Validation sous-dossier (parent_id != null), suppression arborescence + S3, résultat folderDeleted |
back/src/api/folders/dto/folder.dto.ts | DTO de suppression avec folderName |
back/src/exceptions/folder.exceptions.ts | FolderDeleteConfirmationMismatchException si nom incorrect |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/admin/folders/AdminFolderDetailPage.vue | Pop-up de confirmation (impact + saisie nom), gestion succès/partiel/erreur |
front/src/stores/folder-store.js | deleteFolder(uuid, folderName) avec body conditionnel et retour API |
front/src/components/ui/PopUpCard.vue | Support confirmDisabled utilisé pour bloquer la confirmation tant que nom invalide |
4. Endpoints API (rappel)
| Méthode | Chemin | Description |
|---|---|---|
DELETE | /folders/:uuid | Suppression définitive d’un sous-dossier + descendants + documents |
Body requis (front) :
json
{
"folderName": "Nom exact du sous-dossier"
}5. Règles métier implémentées
- La suppression est autorisée pour les profils habilités côté API (auth + règles d’accès existantes).
- La confirmation est doublée front + back (anti-contournement).
- Le backend ne traite que les sous-dossiers (
parent_idnon nul) sur ce flux. - Suppression S3 en mode best-effort :
- fichiers supprimés sur S3 => supprimés en base,
- fichiers en échec S3 => conservés en base,
- dossier supprimé seulement si plus aucun document restant dans l’arbre.
- Le front affiche :
- succès si
folderDeleted: true, - erreur métier explicite si
folderDeleted: false, - erreur générique si échec API.
- succès si
6. Points de vérification
- Le menu d’action des sous-dossiers propose bien Supprimer.
- La pop-up affiche le nom du sous-dossier + les compteurs (
fichiers,sous-dossiers). - Le bouton de confirmation reste désactivé tant que la saisie du nom est invalide.
- Le front envoie
folderNamedans le body deDELETE /folders/:uuid. - Le backend retourne une erreur si le nom ne correspond pas.
- Après suppression réussie, la liste des enfants est rafraîchie.
- En suppression partielle S3, le message “dossier conservé” est affiché côté UI.
7. Tests associés
Backend (unitaires)
back/src/api/folders/folder.service.spec.ts- mismatch nom confirmation sur
deleteFolder - suppression complète (
folderDeleted: true) et partielle (folderDeleted: false) sur les flux de suppression
- mismatch nom confirmation sur
Frontend (unitaires)
front/src/__tests__/stores/folder-store.spec.jsdeleteFoldersansfolderName(compat)deleteFolderavecfolderName(body envoyé)- propagation des erreurs API
front/src/__tests__/pages/admin/folders/AdminFolderDetailPage.spec.js- suppression sous-dossier avec confirmation nom valide
- blocage si nom invalide
- notification d’erreur en cas de suppression partielle
8. Notes d’implémentation
deleteFolderdu store reste rétro-compatible : sansfolderName, l’appelDELETEest envoyé sans body.- La confirmation explicite est maintenant alignée entre la page liste (
AdminFoldersPage) et la page détail (AdminFolderDetailPage). - La logique de suppression technique est factorisée côté backend dans une méthode réutilisable, appelée par les flux racine et sous-dossier.
