Soft-delete par défaut : aucune perte silencieuse
Toutes les entités métier sont restaurables, et seul le super-admin peut le faire.
Quand un utilisateur supprime un contact, un deal, une page ou un commentaire, deux choses ne doivent jamais arriver : (1) la donnée disparaît du disque sans recours, (2) la donnée reste visible dans les listings après suppression.
Jul6art applique le pattern soft-delete à toutes les entités métier :
- Le trait
SoftDeletableTraitajoute la colonnedeleted_atet les méthodessoftDelete()/restore(). - Un filtre Doctrine global
soft_deleteexclut automatiquement les lignesdeleted_at IS NOT NULLde toutes les requêtes — sauf pourROLE_SUPER_ADMINqui voit l'intégralité. - La route de restauration
/admin/.../{id}/restoreest gardée parROLE_SUPER_ADMIN: aucun admin tenant ne peut restaurer. - Sur les colonnes UNIQUE (email d'un Contact), la valeur est suffixée par
_DELETED_<timestamp>au moment du soft-delete pour libérer la contrainte tout en conservant la trace. - Les paires d'événements
BEFORE_SOFT_DELETED/AFTER_SOFT_DELETED+BEFORE_RESTORED/AFTER_RESTOREDsont dispatchés sur chaque opération, avec un contratabort()qui permet de bloquer la suppression depuis un listener.
Résultat : une suppression accidentelle est récupérable en deux clics côté super-admin, et aucune trace n'est jamais perdue.