NeahNew/MISSION_DELETION_FLOW_ANALYSIS.md
2026-01-09 11:19:32 +01:00

314 lines
7.9 KiB
Markdown

# Mission Deletion Flow - Complete Analysis from Logs
## 🔍 Analysis of Your Deletion Flow
Based on your logs, here's what's happening:
---
## ✅ What's Working
1. **Mission is fetched correctly**
```
SELECT "public"."Mission" WHERE "id" = '805c1d8c-1bd4-41e7-9cf1-d22631dae260'
```
2. **Attachments are fetched**
```
SELECT "public"."Attachment" WHERE "missionId" = '805c1d8c-1bd4-41e7-9cf1-d22631dae260'
```
3. **N8N deletion workflow is called**
```
Starting N8N deletion workflow
Triggering n8n mission deletion workflow
```
4. **N8N responds successfully**
```
Deletion webhook response { status: 200 }
Parsed deletion workflow result { success: true, hasError: false }
```
5. **Mission is deleted from database**
```
DELETE FROM "public"."Mission" WHERE "id" = '805c1d8c-1bd4-41e7-9cf1-d22631dae260'
Mission deleted successfully from database
```
---
## ❌ Critical Problems
### Problem 1: N8N_API_KEY Not Set
```
N8N_API_KEY is not set in environment variables
API key present { present: false }
```
**Impact**: N8N workflow runs but may not have proper authentication.
### Problem 2: All Integration IDs Are NULL/Empty
**What N8N Receives**:
```json
{
"missionId": "805c1d8c-1bd4-41e7-9cf1-d22631dae260",
"name": "libra",
"repoName": "", // ❌ EMPTY
"leantimeProjectId": 0, // ❌ ZERO
"documentationCollectionId": "", // ❌ EMPTY
"rocketchatChannelId": "", // ❌ EMPTY
"giteaRepositoryUrl": null, // ❌ NULL
"outlineCollectionId": null, // ❌ NULL
"rocketChatChannelId": null, // ❌ NULL
"penpotProjectId": null // ❌ NULL
}
```
**Root Cause**: The mission was created **without integration IDs being saved** because:
1. Mission was created in database ✅
2. N8N workflow was triggered ✅
3. N8N created integrations ✅
4. N8N tried to call `/api/missions/mission-created`
5. **Endpoint returned 500 error** (N8N_API_KEY not configured) ❌
6. **IDs were never saved to database**
### Problem 3: N8N Cannot Delete Integrations
Because N8N receives empty IDs:
- ❌ Cannot delete Gitea repository (no `repoName`)
- ❌ Cannot close Leantime project (no `leantimeProjectId`)
- ❌ Cannot delete Outline collection (no `documentationCollectionId`)
- ❌ Cannot close RocketChat channel (no `rocketchatChannelId`)
**Result**: External integrations remain orphaned even though mission is deleted.
---
## 🔄 Complete Flow Breakdown
### Step 1: Frontend Calls DELETE
```
DELETE /api/missions/805c1d8c-1bd4-41e7-9cf1-d22631dae260
```
### Step 2: Backend Fetches Mission
```sql
SELECT "Mission" WHERE "id" = '805c1d8c-1bd4-41e7-9cf1-d22631dae260'
```
**Result**: Mission found, but all integration IDs are `null`:
- `leantimeProjectId`: null
- `outlineCollectionId`: null
- `rocketChatChannelId`: null
- `giteaRepositoryUrl`: null
### Step 3: Backend Prepares Deletion Data
```javascript
{
repoName: "", // Extracted from null giteaRepositoryUrl
leantimeProjectId: 0, // null || 0 = 0
documentationCollectionId: "", // null || '' = ''
rocketchatChannelId: "" // null || '' = ''
}
```
### Step 4: N8N Workflow Called
```
POST https://brain.slm-lab.net/webhook-test/mission-delete
```
**Headers**:
- `x-api-key`: (empty - N8N_API_KEY not set)
**Body**: (with empty IDs as shown above)
### Step 5: N8N Workflow Executes
- ✅ Receives request
- ❌ Cannot delete integrations (no IDs)
- ✅ Returns success (but didn't actually delete anything)
### Step 6: Mission Deleted from Database
```sql
DELETE FROM "Mission" WHERE "id" = '805c1d8c-1bd4-41e7-9cf1-d22631dae260'
```
**CASCADE deletes**:
- ✅ MissionUsers
- ✅ Attachments
**But external integrations remain**:
- ❌ Gitea repository still exists
- ❌ Leantime project still exists
- ❌ Outline collection still exists
- ❌ RocketChat channel still exists
---
## 🎯 Root Cause Summary
### Why IDs Are NULL
1. **Mission Creation**:
- Mission created in database ✅
- N8N workflow triggered ✅
- N8N created integrations ✅
2. **N8N Callback Fails**:
- N8N tries to call `/api/missions/mission-created`
- Endpoint checks for `N8N_API_KEY` in environment
- `N8N_API_KEY` is not set ❌
- Endpoint returns 500: "Server configuration error" ❌
- **IDs are never saved** ❌
3. **Mission Deletion**:
- Mission has no integration IDs (all null)
- N8N receives empty IDs
- Cannot delete integrations
- **Integrations remain orphaned** ❌
---
## ✅ Solutions
### Solution 1: Fix N8N_API_KEY (IMMEDIATE)
**Add to environment variables**:
```env
N8N_API_KEY=LwgeE1ntADD20OuWC88S3pR0EaO7FtO4
```
**Then**:
1. Restart your application
2. Create a new mission
3. Verify IDs are saved to database
4. Delete mission - should work correctly
### Solution 2: Fix Existing Missions (MIGRATION)
For missions that already exist without IDs:
**Option A: Manual Update**
```sql
UPDATE "Mission"
SET
"giteaRepositoryUrl" = 'https://gite.slm-lab.net/alma/repo-name',
"leantimeProjectId" = '123',
"outlineCollectionId" = 'collection-id',
"rocketChatChannelId" = 'channel-id'
WHERE "id" = 'mission-id';
```
**Option B: Query External Services**
- Query Gitea API to find repositories
- Query Leantime API to find projects
- Query Outline API to find collections
- Query RocketChat API to find channels
- Update database with found IDs
**Option C: Re-create Missions**
- Delete missions without IDs
- Re-create them (with N8N_API_KEY fixed, IDs will be saved)
### Solution 3: Make N8N Callback More Resilient
**Modify `/api/missions/mission-created` endpoint** to handle missing API key more gracefully:
```typescript
// Instead of returning 500, log warning and continue
if (!expectedApiKey) {
logger.warn('N8N_API_KEY not configured, but continuing anyway', {
missionId: body.missionId
});
// Continue without API key validation (less secure but works)
// OR require API key but provide better error message
}
```
**Not recommended** for production (security risk), but could work for development.
---
## 📊 Current State vs Desired State
### Current State (Your Logs)
```
Mission in DB:
- leantimeProjectId: null
- outlineCollectionId: null
- rocketChatChannelId: null
- giteaRepositoryUrl: null
N8N Receives:
- repoName: ""
- leantimeProjectId: 0
- documentationCollectionId: ""
- rocketchatChannelId: ""
Result:
- Mission deleted ✅
- Integrations NOT deleted ❌
```
### Desired State
```
Mission in DB:
- leantimeProjectId: "123"
- outlineCollectionId: "collection-456"
- rocketChatChannelId: "channel-789"
- giteaRepositoryUrl: "https://gite.slm-lab.net/alma/repo-name"
N8N Receives:
- repoName: "repo-name"
- leantimeProjectId: 123
- documentationCollectionId: "collection-456"
- rocketchatChannelId: "channel-789"
Result:
- Mission deleted ✅
- Integrations deleted ✅
```
---
## 🔧 Immediate Actions Required
1. **✅ Add N8N_API_KEY to environment**
```env
N8N_API_KEY=LwgeE1ntADD20OuWC88S3pR0EaO7FtO4
```
2. **✅ Restart application**
3. **✅ Test mission creation**
- Create a new mission
- Check database - IDs should be saved
- Delete mission - should work correctly
4. **⚠️ Fix existing missions**
- Update existing missions with their integration IDs
- Or delete and re-create them
---
## 📝 Summary
**The deletion flow is working correctly**, but:
1. **N8N_API_KEY is missing** → Endpoint returns 500 error
2. **IDs are never saved** → Mission has null integration IDs
3. **N8N receives empty IDs** → Cannot delete integrations
4. **Integrations remain orphaned** → External resources not cleaned up
**Fix**: Add `N8N_API_KEY` to environment variables, then new missions will work correctly. Existing missions need manual update or re-creation.
---
**Document Created**: $(date)
**Status**: Deletion flow works, but integration cleanup fails due to missing IDs