mission-tab deletemission
This commit is contained in:
parent
96738a341f
commit
0a660bf7f9
377
MISSION_DELETION_IDS_EMPTY_ANALYSIS.md
Normal file
377
MISSION_DELETION_IDS_EMPTY_ANALYSIS.md
Normal file
@ -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
|
||||
|
||||
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user