/** * Close Position API Endpoint * * Closes an existing position (partially or fully) */ import { NextRequest, NextResponse } from 'next/server' import { closePosition } from '@/lib/drift/orders' import { initializeDriftService } from '@/lib/drift/client' export const dynamic = 'force-dynamic' export const runtime = 'nodejs' interface CloseRequest { symbol: string // e.g., 'SOL-PERP' percentToClose?: number // 0-100, default 100 (close entire position) } export async function POST(request: NextRequest) { try { // Verify authorization const authHeader = request.headers.get('authorization') const expectedAuth = `Bearer ${process.env.API_SECRET_KEY}` if (!authHeader || authHeader !== expectedAuth) { return NextResponse.json( { success: false, error: 'Unauthorized' }, { status: 401 } ) } const body: CloseRequest = await request.json() const { symbol, percentToClose = 100 } = body if (!symbol) { return NextResponse.json( { success: false, error: 'Missing symbol' }, { status: 400 } ) } if (percentToClose < 0 || percentToClose > 100) { return NextResponse.json( { success: false, error: 'percentToClose must be between 0 and 100' }, { status: 400 } ) } console.log(`📊 Closing position: ${symbol} (${percentToClose}%)`) // Initialize Drift service if not already initialized await initializeDriftService() // Close position const result = await closePosition({ symbol, percentToClose, slippageTolerance: 1.0, }) if (!result.success) { return NextResponse.json( { success: false, error: 'Position close failed', message: result.error, }, { status: 500 } ) } return NextResponse.json({ success: true, transactionSignature: result.transactionSignature, symbol, closePrice: result.closePrice, closedSize: result.closedSize, realizedPnL: result.realizedPnL, percentClosed: percentToClose, }) } catch (error) { console.error('❌ Close position error:', error) return NextResponse.json( { success: false, error: 'Internal server error', message: error instanceof Error ? error.message : 'Unknown error', }, { status: 500 } ) } }