378 lines
9.9 KiB
Markdown
378 lines
9.9 KiB
Markdown
# 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
|
|
|