84 lines
2.3 KiB
TypeScript
84 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { getAuthService } from '@/lib/auth';
|
|
import {
|
|
DemoFaceValidationAdapter,
|
|
DemoAvatarGenerationAdapter,
|
|
InMemoryAvatarGenerationRepository
|
|
} from '@gridpilot/testing-support';
|
|
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 }
|
|
);
|
|
}
|
|
} |