6.1 KiB
Fix: IDs d'Intégration Vides lors de la Suppression
🔍 Problème Identifié
Lors de la suppression d'une mission, N8N reçoit des IDs vides :
{
"missionId": "cd0225cf-8dfd-4bf0-a20a-6aa9c04ebb42",
"name": "Creation",
"repoName": "",
"leantimeProjectId": 0,
"documentationCollectionId": "",
"rocketchatChannelId": "",
"giteaRepositoryUrl": null,
"outlineCollectionId": null,
"rocketChatChannelId": null
}
Cause : Les IDs retournés par N8N lors de la création ne sont pas sauvegardés en base.
🔍 Analyse du Problème
Flow Actuel
1. POST /api/missions → Crée mission en Prisma
2. Upload logo dans Minio
3. POST N8N webhook → N8N crée intégrations
4. N8N → POST /mission-created (avec IDs)
5. ❌ Endpoint cherche mission par name + creatorId (peut échouer)
6. ❌ IDs jamais sauvegardés
7. ❌ Lors de suppression → IDs vides
Problèmes Identifiés
-
Recherche de mission fragile : L'endpoint
/mission-createdcherche parname+creatorId, ce qui peut échouer si :- Plusieurs missions ont le même nom
- Le nom a changé
- Le creatorId ne correspond pas exactement
-
missionId non envoyé : On n'envoie pas le
missionIdà N8N, donc N8N ne peut pas le renvoyer -
N8N ne renvoie peut-être pas missionId : Même si on l'envoie, N8N doit le renvoyer dans
/mission-created
✅ Solutions Implémentées
1. Envoyer missionId à N8N
Fichier : app/api/missions/route.ts
const n8nData = {
...body,
missionId: mission.id, // ✅ Send missionId so N8N can return it
creatorId: userId,
logoPath: logoPath,
logoUrl: logoUrl,
config: { ... }
};
Avantage : N8N peut maintenant renvoyer le missionId dans /mission-created
2. Améliorer la Recherche de Mission
Fichier : app/api/missions/mission-created/route.ts
// Prefer missionId if provided, otherwise use name + creatorId
let mission;
if (body.missionId) {
// ✅ Use missionId if provided (more reliable)
mission = await prisma.mission.findUnique({
where: { id: body.missionId }
});
} else if (body.name && body.creatorId) {
// Fallback to name + creatorId (for backward compatibility)
mission = await prisma.mission.findFirst({
where: {
name: body.name,
creatorId: body.creatorId
},
orderBy: { createdAt: 'desc' }
});
}
Avantages :
- ✅ Recherche par
missionId(plus fiable) - ✅ Fallback vers
name+creatorId(rétrocompatibilité) - ✅ Gestion d'erreurs améliorée
📋 Format de Requête N8N → /mission-created
Format Recommandé (avec missionId)
{
"missionId": "cd0225cf-8dfd-4bf0-a20a-6aa9c04ebb42",
"name": "Creation",
"creatorId": "user-id",
"gitRepoUrl": "https://gite.slm-lab.net/alma/creation",
"leantimeProjectId": "123",
"documentationCollectionId": "collection-456",
"rocketchatChannelId": "channel-789"
}
Format de Fallback (sans missionId)
{
"name": "Creation",
"creatorId": "user-id",
"gitRepoUrl": "https://gite.slm-lab.net/alma/creation",
"leantimeProjectId": "123",
"documentationCollectionId": "collection-456",
"rocketchatChannelId": "channel-789"
}
🔧 Action Requise dans N8N
Modifier le Node "Save Mission To API"
Le node N8N doit inclure missionId dans le body :
Avant :
{
"name": "{{ name }}",
"creatorId": "{{ creatorId }}",
"gitRepoUrl": "{{ gitRepo.html_url }}",
...
}
Après :
{
"missionId": "{{ missionId }}", // ✅ Ajouter missionId
"name": "{{ name }}",
"creatorId": "{{ creatorId }}",
"gitRepoUrl": "{{ gitRepo.html_url }}",
"leantimeProjectId": "{{ leantimeProject.result[0] }}",
"documentationCollectionId": "{{ docCollection.data.id }}",
"rocketchatChannelId": "{{ rocketChatChannel.channel._id }}",
...
}
Où trouver missionId dans N8N :
- Il est dans les données initiales :
{{ $node['Process Mission Data'].json.missionId }} - Ou dans le body original :
{{ $json.missionId }}
🧪 Tests
Test 1: Vérifier missionId est envoyé à N8N
- Créer une mission
- Vérifier les logs :
Sending to N8N: { missionId: "...", ... } - ✅
missionIddoit être présent
Test 2: Vérifier N8N renvoie missionId
- Vérifier les logs N8N
- Vérifier que le node "Save Mission To API" inclut
missionId - ✅
missionIddoit être dans le body envoyé à/mission-created
Test 3: Vérifier IDs sont sauvegardés
- Créer une mission
- Vérifier les logs :
=== Mission Created Webhook Received === Looking up mission by ID: ... Mission updated successfully: { ... } - Vérifier en base :
SELECT id, name, giteaRepositoryUrl, leantimeProjectId, outlineCollectionId, rocketChatChannelId FROM Mission WHERE id = '...'; - ✅ Les IDs doivent être présents
Test 4: Vérifier Suppression
- Supprimer une mission avec IDs sauvegardés
- Vérifier les logs :
Sending deletion data to N8N: { repoName: "creation", leantimeProjectId: 123, ... } - ✅ Les IDs doivent être présents (pas vides)
📝 Checklist
- Envoyer
missionIdà N8N lors de la création - Améliorer recherche de mission dans
/mission-created - Modifier N8N workflow pour inclure
missionIddans/mission-created - Tester création avec
missionId - Tester sauvegarde des IDs
- Tester suppression avec IDs sauvegardés
⚠️ Action Immédiate Requise
Modifier le workflow N8N pour inclure missionId dans le node "Save Mission To API" :
- Ouvrir le workflow N8N
NeahMissionCreate - Trouver le node "Save Mission To API"
- Ajouter
missionIddans le body :{ "missionId": "={{ $node['Process Mission Data'].json.missionId }}", ... } - Sauvegarder et activer le workflow
Date: $(date) Version: 1.1 Fichiers Modifiés:
app/api/missions/route.ts(ajout missionId dans n8nData)app/api/missions/mission-created/route.ts(recherche par missionId)