Skip to content

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

  1. Une action « Supprimer » est disponible sur chaque sous-dossier.
  2. Une confirmation explicite est demandée :
    • affichage du nombre de fichiers et sous-dossiers enfants impactés,
    • saisie du nom exact du sous-dossier.
  3. La suppression entraîne une suppression en cascade de tous les sous-dossiers enfants et des fichiers contenus.
  4. Les fichiers physiques sont supprimés sur S3.
  5. Le sous-dossier disparaît immédiatement de la vue détail après suppression complète.
  6. 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

FichierRôle
back/src/api/folders/folder.controller.tsEndpoint DELETE /folders/:uuid pour suppression définitive d’un sous-dossier
back/src/api/folders/folder.service.tsValidation sous-dossier (parent_id != null), suppression arborescence + S3, résultat folderDeleted
back/src/api/folders/dto/folder.dto.tsDTO de suppression avec folderName
back/src/exceptions/folder.exceptions.tsFolderDeleteConfirmationMismatchException si nom incorrect

Frontend

FichierRôle
front/src/pages/admin/folders/AdminFolderDetailPage.vuePop-up de confirmation (impact + saisie nom), gestion succès/partiel/erreur
front/src/stores/folder-store.jsdeleteFolder(uuid, folderName) avec body conditionnel et retour API
front/src/components/ui/PopUpCard.vueSupport confirmDisabled utilisé pour bloquer la confirmation tant que nom invalide

4. Endpoints API (rappel)

MéthodeCheminDescription
DELETE/folders/:uuidSuppression 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_id non 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.

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 folderName dans le body de DELETE /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

Frontend (unitaires)

  • front/src/__tests__/stores/folder-store.spec.js
    • deleteFolder sans folderName (compat)
    • deleteFolder avec folderName (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

  • deleteFolder du store reste rétro-compatible : sans folderName, l’appel DELETE est 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.