fix: Bug #88 Extended - Use real Prisma IDs in execute endpoint

Main trade execution endpoint (TradingView signals) was creating synthetic
IDs (trade-${Date.now()}) instead of using real database IDs returned by
createTrade().

This caused identical failure pattern as smart-entry-timer:
- SL verification couldn't find trades in database
- Active recovery attempts failed (no record found)
- Emergency shutdown failed (no record found for update)
- Position left unprotected after system gave up

Fix in app/api/trading/execute/route.ts:
- Line 1044: Capture createTrade() return value as savedTrade
- Line 1127+: Update activeTrade.id = savedTrade.id (real Prisma ID)
- Added logging for database ID verification
- Added fallback handling for database save failures

Impact: All database operations (SL verification, recovery, emergency close)
now work correctly for TradingView signal trades.

Related: Bug #88 Phase 1 (smart-entry-timer fix, commit 674743c)
This commit is contained in:
mindesbunister
2025-12-16 20:34:27 +01:00
parent 674743c30f
commit c0ac9fda42

View File

@@ -1034,12 +1034,13 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
console.log('🔍 DEBUG: Exit orders section complete, about to calculate quality score...')
// Save trade to database FIRST (CRITICAL: Must succeed before Position Manager)
let savedTrade
try {
// Quality score already calculated earlier for adaptive leverage
console.log('🔍 DEBUG: Using quality score from earlier calculation:', qualityResult.score)
console.log('🔍 DEBUG: About to call createTrade()...')
await createTrade({
savedTrade = await createTrade({
positionId: openResult.transactionSignature!,
symbol: driftSymbol,
direction: body.direction,
@@ -1074,6 +1075,7 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
})
console.log('🔍 DEBUG: createTrade() completed successfully')
console.log(`💾 Execute: Trade saved to database (ID: ${savedTrade.id})`)
console.log(`💾 Trade saved with quality score: ${qualityResult.score}/100`)
console.log(`📊 Quality reasons: ${qualityResult.reasons.join(', ')}`)
@@ -1110,6 +1112,10 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
error: dbError instanceof Error ? dbError.message : 'Database save failed'
})
// Fallback: Create placeholder with synthetic ID (prevents crash)
savedTrade = { id: `trade-${Date.now()}` } as any
console.log('⚠️ Using synthetic ID as fallback after DB error')
// CRITICAL: If database save fails, we MUST NOT add to Position Manager
// Return error to user so they know to close manually
return NextResponse.json(
@@ -1122,6 +1128,10 @@ export async function POST(request: NextRequest): Promise<NextResponse<ExecuteTr
)
}
// BUG #88 FIX: Use real database ID for Position Manager tracking
activeTrade.id = savedTrade.id
console.log(`📊 ADDTRADE: Using real database ID: ${savedTrade.id}`)
// Add to position manager for monitoring ONLY AFTER database save succeeds
await positionManager.addTrade(activeTrade)