import { NextRequest, NextResponse } from 'next/server'; import { getAuthService } from '@/lib/auth'; import { DemoFaceValidationAdapter, DemoAvatarGenerationAdapter, InMemoryAvatarGenerationRepository } from '@gridpilot/demo-infrastructure'; import { RequestAvatarGenerationUseCase } from '@gridpilot/media'; // Create singleton instances const faceValidation = new DemoFaceValidationAdapter(); const avatarGeneration = new DemoAvatarGenerationAdapter(); const avatarRepository = new InMemoryAvatarGenerationRepository(); const requestAvatarGenerationUseCase = new RequestAvatarGenerationUseCase( avatarRepository, faceValidation, avatarGeneration ); export async function POST(request: NextRequest) { try { const authService = getAuthService(); const session = await authService.getCurrentSession(); if (!session) { return NextResponse.json( { success: false, errorMessage: 'Not authenticated' }, { status: 401 } ); } const body = await request.json(); const { facePhotoData, suitColor } = body; if (!facePhotoData) { return NextResponse.json( { success: false, errorMessage: 'No face photo provided' }, { status: 400 } ); } if (!suitColor) { return NextResponse.json( { success: false, errorMessage: 'No suit color selected' }, { status: 400 } ); } // Extract base64 data if it's a data URL let base64Data = facePhotoData; if (facePhotoData.startsWith('data:')) { base64Data = facePhotoData.split(',')[1] || facePhotoData; } const result = await requestAvatarGenerationUseCase.execute({ userId: session.user.id, facePhotoData: base64Data, suitColor, }); if (result.status === 'failed') { return NextResponse.json({ success: false, errorMessage: result.errorMessage, }); } return NextResponse.json({ success: true, requestId: result.requestId, avatarUrls: result.avatarUrls, }); } catch (error) { console.error('Avatar generation error:', error); return NextResponse.json( { success: false, errorMessage: error instanceof Error ? error.message : 'Failed to generate avatars' }, { status: 500 } ); } }