From 0a660bf7f97c09b25b20efce8d6a8f18a2bd859a Mon Sep 17 00:00:00 2001 From: alma Date: Sun, 4 Jan 2026 16:25:38 +0100 Subject: [PATCH] mission-tab deletemission --- MISSION_DELETION_IDS_EMPTY_ANALYSIS.md | 377 +++++++++++++++++++++++++ lib/services/n8n-service.ts | 4 + 2 files changed, 381 insertions(+) create mode 100644 MISSION_DELETION_IDS_EMPTY_ANALYSIS.md diff --git a/MISSION_DELETION_IDS_EMPTY_ANALYSIS.md b/MISSION_DELETION_IDS_EMPTY_ANALYSIS.md new file mode 100644 index 00000000..6bf6b769 --- /dev/null +++ b/MISSION_DELETION_IDS_EMPTY_ANALYSIS.md @@ -0,0 +1,377 @@ +# Analyse : IDs Vides lors de la Suppression de Mission + +## 🔍 Problème + +Lors de la suppression d'une mission, N8N reçoit des IDs vides : + +```json +{ + "repoName": "", + "leantimeProjectId": 0, + "documentationCollectionId": "", + "rocketchatChannelId": "", + "giteaRepositoryUrl": null, + "outlineCollectionId": null, + "rocketChatChannelId": null +} +``` + +**Cela signifie que les IDs ne sont PAS sauvegardés en base lors de la création.** + +--- + +## 🔄 Flow de Création (Théorique) + +``` +1. POST /api/missions + ↓ +2. Crée mission en Prisma (sans IDs) + ↓ +3. Upload logo dans Minio + ↓ +4. POST N8N webhook (mission-created) + ↓ +5. N8N crée intégrations : + - Gitea → retourne html_url + - Leantime → retourne projectId + - Outline → retourne collectionId + - RocketChat → retourne channelId + ↓ +6. N8N → POST /mission-created (avec les IDs) + ↓ +7. Backend sauvegarde les IDs en base ✅ +``` + +--- + +## ❌ Problèmes Possibles + +### Problème 1: N8N n'appelle pas `/mission-created` + +**Symptôme** : Les IDs ne sont jamais sauvegardés + +**Vérification** : +- Vérifier les logs N8N : le node "Save Mission To API" est-il exécuté ? +- Vérifier les logs backend : y a-t-il des appels à `/mission-created` ? +- Vérifier les erreurs N8N : le workflow s'arrête-t-il avant "Save Mission To API" ? + +**Solution** : +- Vérifier que le node "Save Mission To API" est bien connecté dans le workflow +- Vérifier que l'URL est correcte : `{{ MISSION_API_URL }}/mission-created` +- Vérifier que l'API key est correcte dans les headers + +--- + +### Problème 2: N8N appelle `/mission-created` mais sans `missionId` + +**Symptôme** : L'endpoint ne trouve pas la mission + +**Vérification** : +- Vérifier les logs backend : + ``` + === Mission Created Webhook Received === + Looking up mission by ID: ... + Mission not found: ... + ``` +- Vérifier le body reçu par `/mission-created` : contient-il `missionId` ? + +**Solution** : +- Modifier le workflow N8N pour inclure `missionId` dans le body : + ```json + { + "missionId": "={{ $node['Process Mission Data'].json.missionId }}", + ... + } + ``` + +--- + +### Problème 3: N8N appelle `/mission-created` mais les IDs sont vides + +**Symptôme** : L'endpoint trouve la mission mais les IDs sont `null` ou vides + +**Vérification** : +- Vérifier les logs backend : + ``` + Received mission-created data: { + missionId: "...", + gitRepoUrl: null, // ❌ Vide + leantimeProjectId: null, // ❌ Vide + ... + } + ``` +- Vérifier les logs N8N : les nodes de création retournent-ils bien les IDs ? + +**Solution** : +- Vérifier que les nodes N8N (Create Git Repository, Create Leantime Project, etc.) retournent bien les IDs +- Vérifier que le node "Combine Results" combine correctement les IDs +- Vérifier que le node "Save Mission To API" utilise les bons chemins pour les IDs + +--- + +### Problème 4: Mapping incorrect des champs + +**Symptôme** : Les IDs sont envoyés mais avec des noms incorrects + +**Vérification** : +- Vérifier le body envoyé par N8N : + ```json + { + "gitRepoUrl": "...", // ✅ Correct + "leantimeProjectId": "...", // ✅ Correct + "documentationCollectionId": "...", // ✅ Correct + "rocketchatChannelId": "..." // ✅ Correct + } + ``` +- Vérifier le mapping dans `/mission-created` : + - `gitRepoUrl` → `giteaRepositoryUrl` ✅ + - `documentationCollectionId` → `outlineCollectionId` ✅ + - `rocketchatChannelId` → `rocketChatChannelId` ✅ + +**Solution** : +- Vérifier que les noms de champs correspondent exactement + +--- + +### Problème 5: API Key incorrecte + +**Symptôme** : L'endpoint retourne 401 Unauthorized + +**Vérification** : +- Vérifier les logs backend : + ``` + Invalid API key: { received: '...', expected: '...' } + ``` +- Vérifier que `N8N_API_KEY` est bien configuré dans l'environnement +- Vérifier que N8N envoie bien `x-api-key` dans les headers + +**Solution** : +- Vérifier la variable d'environnement `N8N_API_KEY` +- Vérifier que N8N utilise la bonne API key dans le header + +--- + +## 🔍 Points de Vérification + +### 1. Vérifier les Logs Backend + +**Lors de la création** : +``` +=== Starting N8N Workflow === +Sending to N8N: { missionId: "...", ... } +N8N Workflow Result: { success: true, ... } +``` + +**Lors de l'appel `/mission-created`** : +``` +=== Mission Created Webhook Received === +Received mission-created data: { ... } +Looking up mission by ID: ... +Found mission: { id: "...", ... } +Mission updated successfully: { ... } +``` + +**Si ces logs n'apparaissent pas** → N8N n'appelle pas `/mission-created` + +--- + +### 2. Vérifier les Logs N8N + +**Dans le workflow N8N** : +- Le node "Save Mission To API" est-il exécuté ? +- Y a-t-il des erreurs dans ce node ? +- Le body envoyé contient-il les IDs ? + +**Vérifier le body du node "Save Mission To API"** : +```json +{ + "missionId": "={{ $node['Process Mission Data'].json.missionId }}", + "gitRepoUrl": "={{ $node['Combine Results'].json.gitRepo?.html_url }}", + "leantimeProjectId": "={{ $node['Combine Results'].json.leantimeProject?.result?.[0] }}", + "documentationCollectionId": "={{ $node['Combine Results'].json.docCollection?.data?.id }}", + "rocketchatChannelId": "={{ $node['Combine Results'].json.rocketChatChannel?.channel?._id }}" +} +``` + +--- + +### 3. Vérifier la Base de Données + +**Requête SQL** : +```sql +SELECT + id, + name, + giteaRepositoryUrl, + leantimeProjectId, + outlineCollectionId, + rocketChatChannelId, + createdAt, + updatedAt +FROM Mission +WHERE name = 'Creation' +ORDER BY createdAt DESC +LIMIT 1; +``` + +**Résultat attendu** : +``` +id: cd0225cf-8dfd-4bf0-a20a-6aa9c04ebb42 +name: Creation +giteaRepositoryUrl: https://gite.slm-lab.net/alma/creation ✅ +leantimeProjectId: 123 ✅ +outlineCollectionId: collection-456 ✅ +rocketChatChannelId: channel-789 ✅ +``` + +**Si tous les IDs sont `null`** → Ils ne sont pas sauvegardés + +--- + +## 📋 Checklist de Diagnostic + +### Étape 1: Vérifier que N8N reçoit missionId + +- [ ] Les logs backend montrent `missionId` dans `n8nData` +- [ ] N8N reçoit bien `missionId` dans le webhook + +### Étape 2: Vérifier que N8N crée les intégrations + +- [ ] Les logs N8N montrent que les nodes de création sont exécutés +- [ ] Les nodes retournent bien les IDs (html_url, projectId, etc.) + +### Étape 3: Vérifier que N8N combine les résultats + +- [ ] Le node "Combine Results" contient les IDs +- [ ] Les IDs sont accessibles via les chemins corrects + +### Étape 4: Vérifier que N8N appelle `/mission-created` + +- [ ] Les logs backend montrent des appels à `/mission-created` +- [ ] Le node "Save Mission To API" est exécuté dans N8N +- [ ] Pas d'erreur 401 (API key) ou 404 (mission not found) + +### Étape 5: Vérifier que les IDs sont sauvegardés + +- [ ] Les logs backend montrent "Mission updated successfully" +- [ ] La base de données contient les IDs après création +- [ ] Les IDs sont correctement mappés + +--- + +## 🎯 Actions Recommandées (Sans Toucher au Code) + +### 1. Vérifier les Logs Backend + +```bash +# Chercher les appels à /mission-created +grep "Mission Created Webhook Received" logs.txt + +# Chercher les erreurs +grep "Mission not found" logs.txt +grep "Invalid API key" logs.txt +``` + +### 2. Vérifier le Workflow N8N + +1. Ouvrir le workflow `NeahMissionCreate` +2. Vérifier que le node "Save Mission To API" : + - Est bien connecté après "Combine Results" + - Contient `missionId` dans le body + - Utilise les bons chemins pour les IDs + - A l'URL correcte : `{{ MISSION_API_URL }}/mission-created` + - A l'API key correcte dans les headers + +### 3. Tester Manuellement + +**Appel manuel à `/mission-created`** : +```bash +curl -X POST https://hub.slm-lab.net/api/missions/mission-created \ + -H "Content-Type: application/json" \ + -H "x-api-key: YOUR_API_KEY" \ + -d '{ + "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" + }' +``` + +**Vérifier la réponse** : +- 200 OK → L'endpoint fonctionne +- 401 Unauthorized → Problème d'API key +- 404 Not Found → Problème de recherche de mission +- 400 Bad Request → Problème de validation + +### 4. Vérifier la Base de Données + +```sql +-- Vérifier une mission spécifique +SELECT * FROM Mission WHERE id = 'cd0225cf-8dfd-4bf0-a20a-6aa9c04ebb42'; + +-- Vérifier les missions récentes sans IDs +SELECT id, name, createdAt +FROM Mission +WHERE giteaRepositoryUrl IS NULL + AND leantimeProjectId IS NULL + AND outlineCollectionId IS NULL + AND rocketChatChannelId IS NULL +ORDER BY createdAt DESC +LIMIT 10; +``` + +--- + +## 🔧 Solutions Probables + +### Solution 1: Ajouter missionId dans N8N + +**Dans le node "Save Mission To API"** : +```json +{ + "missionId": "={{ $node['Process Mission Data'].json.missionId }}", + ... +} +``` + +### Solution 2: Vérifier les Chemins des IDs dans N8N + +**Vérifier que les chemins sont corrects** : +- `gitRepo.html_url` (pas `gitRepo.body.html_url`) +- `leantimeProject.result[0]` (array avec index 0) +- `docCollection.data.id` (pas `docCollection.id`) +- `rocketChatChannel.channel._id` (pas `rocketChatChannel._id`) + +### Solution 3: Vérifier l'API Key + +**Vérifier que** : +- `N8N_API_KEY` est configuré dans `.env` +- N8N utilise la même clé dans le header `x-api-key` + +--- + +## 📝 Résumé + +**Le problème est que les IDs ne sont pas sauvegardés en base.** + +**Causes possibles** : +1. ❌ N8N n'appelle pas `/mission-created` +2. ❌ N8N appelle mais sans `missionId` → mission non trouvée +3. ❌ N8N appelle mais les IDs sont vides dans le body +4. ❌ API key incorrecte → 401 Unauthorized +5. ❌ Mapping incorrect des champs + +**Action immédiate** : +1. Vérifier les logs backend pour voir si `/mission-created` est appelé +2. Vérifier le workflow N8N pour voir si `missionId` est inclus +3. Vérifier la base de données pour voir si les IDs sont sauvegardés + +--- + +**Date**: $(date) +**Status**: Analyse sans modification de code +**Action Requise**: Vérification des logs et du workflow N8N + diff --git a/lib/services/n8n-service.ts b/lib/services/n8n-service.ts index ac2ec552..66508fc7 100644 --- a/lib/services/n8n-service.ts +++ b/lib/services/n8n-service.ts @@ -110,6 +110,10 @@ export class N8nService { guardians: data.guardians || {}, volunteers: Array.isArray(data.volunteers) ? data.volunteers : [], creatorId: data.creatorId, + missionId: data.missionId, // ✅ Include missionId so N8N can use it + logoPath: data.logoPath, // Include logoPath if present + logoUrl: data.logoUrl, // Include logoUrl if present + logo: data.logo, // Include logo data if present config: { ...data.config, // Preserve original config N8N_API_KEY: this.apiKey,