./kaisetsu-app/src/app/api/analyze/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { after } from 'next/server';
import { randomUUID } from 'crypto';
import { processJob } from '@/lib/process-job';
import { storage } from '@/lib/storage';
export const dynamic = 'force-dynamic';
interface JobStatus {
status: 'processing' | 'completed' | 'error';
step: string;
progress: number;
error?: string;
createdAt: string;
updatedAt: string;
}
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { gcsUri, mimeType, generateNarration, tcOffset, genre } = body;
if (!gcsUri) {
return NextResponse.json({ error: 'gcsUri is required' }, { status: 400 });
}
const jobId = randomUUID();
console.log(`Creating job ${jobId} for ${gcsUri}`);
await storage.saveJobInput(jobId, {
gcsUri,
mimeType,
generateNarration,
tcOffset,
genre: genre || 'variety',
});
const now = new Date().toISOString();
const initialStatus: JobStatus = {
status: 'processing',
step: 'queued',
progress: 0,
createdAt: now,
updatedAt: now,
};
await storage.saveJobStatus(jobId, initialStatus);
after(async () => {
try {
console.log(`[${jobId}] Starting background processing...`);
await processJob(jobId);
} catch (err) {
console.error(`[${jobId}] Background processing failed:`, err);
}
});
return NextResponse.json({ jobId });
} catch (error) {
console.error('Job creation error:', error);
return NextResponse.json(
{ error: error instanceof Error ? error.message : 'Failed to create job' },
{ status: 500 }
);
}
}