Skip to content

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

  1. Une action "Supprimer" est disponible sur chaque dossier
  2. Une confirmation explicite est demandée
  3. La suppression d'un dossier entraîne la suppression de tous ses sous-dossiers et fichiers en cascade
  4. Les fichiers physiques sont supprimés sur S3
  5. Le dossier et son contenu disparaissent immédiatement de la liste admin
  6. 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

FichierRôle
back/src/api/folders/folder.controller.tsEndpoint DELETE /folders/:uuid/root (suppression racine définitive)
back/src/api/folders/folder.service.tsSuppression cascade dossiers/documents + suppression S3 best-effort + notification email tâche longue
back/src/api/folders/dto/folder.dto.tsDTO DeleteRootFolderRequestDto (validation folderName)
back/src/exceptions/folder.exceptions.tsException FolderDeleteConfirmationMismatchException
back/src/domains/s3Helper/deleteFiles.tsSuppression S3 batchée (1000 max), multi-bucket, retour simplifié { deleted, errors }
back/src/domains/sesHelper/sendEmail.tsEnvoi de notification SES pour suppression longue

Frontend

FichierRôle
front/src/pages/admin/folders/AdminFoldersPage.vueDialog de confirmation avec saisie du nom + blocage du bouton tant que mismatch
front/src/stores/folder-store.jsAppel API DELETE /folders/:uuid/root avec body { folderName }
front/src/components/ui/PopUpCard.vueSupport confirmDisabled pour bloquer la confirmation côté UI
front/src/components/ui/ActionMenuButton.vueMenu d’actions réutilisable (intégré aux listes dossiers/fichiers)
front/src/components/admin/FolderListItem.vueAction supprimer via composant d’actions réutilisable
front/src/components/documents/DocumentListItem.vueAction menu migrée vers composant réutilisable

4. Endpoints API (rappel)

MéthodeCheminDescription
DELETE/folders/:uuid/rootSuppression 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 Supprimer est 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 folderName dans la requête de suppression.
  • Le back lève une 400 si folderName ne 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
  • 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/root avec body { folderName }
  • front/src/__tests__/components/ui/PopUpCard.spec.js
    • confirmDisabled empêche l’emit confirm
  • front/src/__tests__/components/admin/FolderListItem.spec.js
    • actions via ActionMenuButton (renommer/supprimer)
  • front/src/__tests__/components/documents/DocumentListItem.spec.js
    • actions via ActionMenuButton (télécharger/copier lien)
  • 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.
  • deleteFiles conserve 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é.