project-standalo-note-to-app/app/api/apps/generate/route.ts

92 lines
2.6 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import prisma from '@/lib/prisma';
import { getCurrentUser } from '@/lib/auth';
import type { GenerateAppRequest, GenerateAppResponse, GenerateAppError400, GenerateAppError404 } from '@/types/api-types';
export async function POST(request: NextRequest) {
try {
const user = await getCurrentUser();
if (!user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const body: GenerateAppRequest = await request.json();
if (!body.recordingId) {
const error: GenerateAppError400 = { error: 'Recording ID is required' };
return NextResponse.json(error, { status: 400 });
}
// Find recording
const recording = await prisma.recording.findUnique({
where: { id: body.recordingId },
select: { userId: true, summary: true, title: true }
});
if (!recording) {
const error: GenerateAppError404 = { error: 'Recording not found' };
return NextResponse.json(error, { status: 404 });
}
// Check ownership
if (recording.userId !== user.id) {
return NextResponse.json({ error: 'Forbidden' }, { status: 403 });
}
// Check if summary exists
if (!recording.summary) {
const error: GenerateAppError400 = { error: 'Recording summary not available' };
return NextResponse.json(error, { status: 400 });
}
// TODO: Call AI to generate app from summary
// For now, create a placeholder app
const htmlContent = `
<!DOCTYPE html>
<html>
<head>
<title>Generated App</title>
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>Generated App</h1>
<p>This app was generated from: ${recording.title}</p>
<p>Summary: ${recording.summary}</p>
</body>
</html>
`.trim();
// Create generated app
const generatedApp = await prisma.generatedApp.create({
data: {
userId: user.id,
recordingId: body.recordingId,
title: `App from ${recording.title}`,
description: 'Auto-generated application',
htmlContent,
appType: 'generated',
status: 'completed',
},
select: {
id: true,
recordingId: true,
status: true,
}
});
const response: GenerateAppResponse = {
id: generatedApp.id,
recordingId: generatedApp.recordingId,
status: generatedApp.status,
};
return NextResponse.json(response, { status: 201 });
} catch (error) {
console.error('Generate app error:', error);
return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
}
}