61 lines
1.6 KiB
TypeScript
61 lines
1.6 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { generateOutline } from "@/lib/gemini";
|
|
import { saveZine, type StoredZine } from "@/lib/storage";
|
|
import { generateZineId } from "@/lib/utils";
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json();
|
|
const { topic, style = "mycelial", tone = "regenerative" } = body;
|
|
|
|
if (!topic || typeof topic !== "string" || topic.trim().length === 0) {
|
|
return NextResponse.json(
|
|
{ error: "Topic is required" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
// Generate the 8-page outline using Gemini
|
|
const pages = await generateOutline(topic.trim(), style, tone);
|
|
|
|
if (!pages || pages.length !== 8) {
|
|
return NextResponse.json(
|
|
{ error: "Failed to generate complete outline" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
// Create a new zine ID
|
|
const id = generateZineId();
|
|
const now = new Date().toISOString();
|
|
|
|
// Save initial zine metadata
|
|
const zine: StoredZine = {
|
|
id,
|
|
topic: topic.trim(),
|
|
style,
|
|
tone,
|
|
outline: pages,
|
|
pages: [], // Will be populated as images are generated
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
};
|
|
|
|
await saveZine(zine);
|
|
|
|
return NextResponse.json({
|
|
id,
|
|
topic: topic.trim(),
|
|
style,
|
|
tone,
|
|
outline: pages,
|
|
});
|
|
} catch (error) {
|
|
console.error("Outline generation error:", error);
|
|
return NextResponse.json(
|
|
{ error: error instanceof Error ? error.message : "Failed to generate outline" },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|