Appearance
BDD-116 — Renommage et suppression d'une connexion API
1. User Story
En tant qu'administrateur,
je veux pouvoir renommer et supprimer une connexion API enregistrée,
afin de maintenir à jour la liste des accès vers les applications externes (Formulaires, etc.).
2. Critères d'acceptation
| # | Critère | Statut |
|---|---|---|
| 1 | Une action « Supprimer » est disponible sur chaque connexion de la liste | ✅ |
| 2 | Une confirmation explicite est demandée avant suppression | ✅ |
| 3 | En cas de confirmation, la connexion est supprimée et disparaît de la liste | ✅ |
| 4 | En cas d'erreur lors de la suppression, un message explicite est affiché et la connexion est conservée | ✅ |
| 5 | Une action « Renommer » est disponible sur chaque connexion | ✅ |
| 6 | L'utilisateur peut modifier le nom via un champ éditable inline | ✅ |
| 7 | Le nom respecte les règles de validation (non vide, longueur max 255) | ✅ |
| 8 | En cas de succès, le nouveau nom est enregistré et affiché immédiatement | ✅ |
| 9 | En cas d'erreur (nom invalide ou problème technique), un message explicite est affiché et la modification est annulée | ✅ |
Détail fonctionnel des critères
Menu d'actions
- Sur chaque ligne de
/connections, unActionMenuButton(même principe que les sources / sous-dossiers). - Entrées : Renommer (
edit) puis Supprimer (delete, séparateur avant l'entrée). aria-label: « Actions de la connexion ».
- Sur chaque ligne de
Suppression
- Clic Supprimer →
PopUpCardtypedelete, titre « Supprimer la connexion », mention du nom et caractère irréversible. - Confirmation →
DELETE /connections/:uuidpuis rafraîchissement de la liste paginée. - Succès → notification avec
messageAPI ou fallback « Connexion supprimée avec succès. » - Si dernière connexion de la page courante → retour à la page précédente (comportement aligné sur
AdminSourcesPage). - Erreur API →
Impossible de supprimer la connexion, la ligne reste visible (modale peut rester ouverte).
- Clic Supprimer →
Renommage
- Clic Renommer → le libellé de la ligne devient un
q-inputinline (Enter = valider, Escape = annuler). - Validation front : nom trimé non vide,
maxlength255, bouton ✓ désactivé si invalide. - Succès →
PATCH /connections/:uuidavec{ name }, mise à jour optimiste dans le store + notification « Connexion renommée ». - Erreur API → message
response.data.message(ou fallback), mode édition fermé (annulation UI).
- Clic Renommer → le libellé de la ligne devient un
Suppression technique
- Hard delete : la ligne est supprimée définitivement en base (
DELETEPrisma). - Pas de re-test
/connection-checkau renommage (seul le libellé change ; URL et clé inchangées).
- Hard delete : la ligne est supprimée définitivement en base (
3. Périmètre fonctionnel
Backend
| Fichier | Rôle |
|---|---|
back/src/api/connections/connections.controller.ts | PATCH /connections/:uuid, DELETE /connections/:uuid |
back/src/api/connections/connections.service.ts | updateConnection, deleteConnection (périmètre entreprise / super-admin) |
back/src/api/connections/dto/connection.dto.ts | DTO UpdateConnectionDto (name, @MaxLength(255)) |
back/src/exceptions/api-connection.exceptions.ts | ApiConnectionNotFoundException (404 si UUID inconnu ou hors périmètre) |
Frontend
| Fichier | Rôle |
|---|---|
front/src/pages/connections/ConnectionsPage.vue | Menu actions, édition inline, modale suppression |
front/src/stores/connections-store.js | updateConnection, deleteConnection, états renamingConnectionUuid / deletingConnectionUuid |
front/src/components/ui/ActionMenuButton.vue | Menu contextuel (réutilisé) |
front/src/components/ui/PopUpCard.vue | Confirmation suppression (réutilisé) |
Dépendances ticket parent
- Table
api_connectionset module connexions : voir BDD-114. - Aucune migration SQL supplémentaire pour ce ticket.
4. Endpoints API (Outil BDD)
| Méthode | Chemin | Guards | Description |
|---|---|---|---|
PATCH | /connections/:uuid | AuthGuard, AdminGuard | Renomme une connexion (name uniquement) |
DELETE | /connections/:uuid | AuthGuard, AdminGuard | Suppression définitive (hard delete) |
Corps PATCH /connections/:uuid
json
{
"name": "API Formulaires recette"
}Réponse PATCH (200)
Même forme que ConnectionResponseDto (sans secrets) — voir BDD-114.
Réponse DELETE (200)
json
{
"message": "Connexion supprimée avec succès."
}Erreurs courantes
| Code | Cas |
|---|---|
400 | Body invalide (nom vide, > 255 caractères) |
401 | Jeton absent / invalide |
403 | Rôle non admin |
404 | Connexion introuvable ou autre entreprise (admin non super-admin) |
5. Règles métier implémentées
- Périmètre entreprise (identique à BDD-114)
administrateur: renommage / suppression limités aux connexions de sonenterprise_id.super-admin: toutes les connexions.
- Renommage
- Seul le champ
nameest modifiable ;base_urlet clé chiffrée restent inchangés. - Trim du nom côté service avant persistance.
- Seul le champ
- Suppression
- Hard delete : la ligne est retirée de la table ; pas d'appel à Formulaires ni suppression de données synchronisées (hors périmètre).
- La connexion n'apparaît plus dans
GET /connectionsniGET /connections/:uuid.
6. Points de vérification
- Chaque ligne de la liste
/connectionsaffiche le menu ⋯ avec Renommer et Supprimer. - Renommer : édition inline, validation vide / trop long, message de succès, nom mis à jour sans rechargement complet de page (mise à jour store).
- Renommer : erreur API (ex. 400) → toast d'erreur, retour à l'affichage lecture seule avec l'ancien nom.
- Supprimer : modale avec le nom de la connexion, boutons Annuler / Supprimer.
- Supprimer : succès → toast, ligne absente, compteur « X connexion(s) » décrémenté.
- Supprimer : erreur réseau / 500 → toast « Impossible de supprimer la connexion », connexion toujours listée.
- Pagination : suppression du dernier élément d'une page > 1 ramène à la page précédente.
- Accès réservé admin / super-admin (inchangé vs BDD-114).
7. Tests associés
Backend (unitaires)
back/src/api/connections/connections.service.spec.tsupdateConnection: mise à jour duname(trim), retour presenter, filtre entreprise.updateConnection:ApiConnectionNotFoundExceptionsi introuvable.deleteConnection: hard delete (suppression en base), message de succès.deleteConnection:ApiConnectionNotFoundExceptionsi introuvable.
Backend (e2e)
- À compléter dans
back/test/e2e/connections-controller.e2e-spec.ts(même gabarit queDELETE /sources/:uuid) :PATCH /connections/:uuid: 401, 403, 400 body, 404, 200.DELETE /connections/:uuid: 401, 403, 400 UUID, 404, 200 + absence auGETliste.
Frontend (unitaires)
front/src/__tests__/stores/connections-store.spec.jsupdateConnection:PATCH, mise à jour locale du tableauconnections.deleteConnection:DELETE, reset dedeletingConnectionUuid.
front/src/__tests__/pages/connections/ConnectionsPage.spec.js- présence du menu actions sur une ligne ;
- ouverture du mode édition au clic Renommer.
Frontend (e2e Playwright)
front/e2e/pages/connections/connections.spec.js- menu : libellés Renommer / Supprimer et captions ;
- renommage happy path (PATCH mocké, notification, nouveau nom visible) ;
- renommage erreur API (message, nom d'origine conservé) ;
- suppression après confirmation (DELETE mocké, liste vide) ;
- suppression erreur (message, connexion conservée dans la liste).
8. Notes d'implémentation
- UX calquée sur
AdminSourcesPage(suppression) etAdminFolderDetailPage(renommage inline des sous-dossiers). - Le renommage ne déclenche pas un nouveau test
connection-check: évolution possible dans un ticket dédié (re-validation manuelle, rotation de clé, etc.). - La suppression est définitive (hard delete) — pas d'UI de restauration.
- Ticket parent BDD-114 : retirer « édition / suppression » des évolutions possibles une fois ce ticket livré.
9. Hors périmètre (explicitement)
- Modification de l'URL de base ou de la clé API sur une connexion existante.
- Re-test automatique de la connexion après renommage.
- Restauration d'une connexion supprimée (corbeille).
- Impact sur des jobs / sync Formulaires déjà branchés sur
getDecryptedApiKey(aucun consommateur métier à ce stade).
