import { NextRequest, NextResponse } from "next/server"; import { db } from "@/lib/db"; import ZAI from "z-ai-web-dev-sdk"; export async function GET(request: NextRequest) { try { const characters = await db.character.findMany({ orderBy: { createdAt: "desc" } }); return NextResponse.json({ success: true, characters, total: characters.length }); } catch { return NextResponse.json({ success: false, error: "Error" }, { status: 500 }); } } export async function POST(request: NextRequest) { try { const body = await request.json(); const { name, description, generateReference, traits } = body; if (!name) { return NextResponse.json({ success: false, error: "Nombre requerido" }, { status: 400 }); } // Generate a unique slug from the name const baseSlug = name .toLowerCase() .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") // Remove diacritics .replace(/[^a-z0-9]+/g, "-") .replace(/^-|-$/g, ""); let slug = baseSlug; let slugExists = await db.character.findUnique({ where: { slug } }); let attempt = 0; while (slugExists) { attempt++; slug = `${baseSlug}-${attempt}`; slugExists = await db.character.findUnique({ where: { slug } }); } let referenceImage: string | null = null; let characterTraits: string | null = null; if (generateReference) { try { const zai = await ZAI.create(); const response = await zai.images.generations.create({ prompt: "Character reference: " + name + ", " + (description || "original character"), size: "1024x1024" }); const imageBase64 = response.data[0]?.base64; if (imageBase64) { referenceImage = "generated_" + Date.now(); if (!traits) { characterTraits = JSON.stringify({ name, description }); } } } catch { } } const finalTraits = traits || characterTraits || JSON.stringify({ name }); const character = await db.character.create({ data: { name, slug, description: description ? String(description) : null, referenceImage: referenceImage ? String(referenceImage) : null, traits: String(finalTraits) } }); return NextResponse.json({ success: true, character }); } catch { return NextResponse.json({ success: false, error: "Error" }, { status: 500 }); } } export async function PUT(request: NextRequest) { try { const body = await request.json(); const { id, name, description, traits } = body; if (!id) return NextResponse.json({ success: false, error: "ID requerido" }, { status: 400 }); const data: { name?: string; description?: string | null; traits?: string } = {}; if (name) data.name = name; if (description !== undefined) data.description = description || null; if (traits) data.traits = traits; const character = await db.character.update({ where: { id }, data }); return NextResponse.json({ success: true, character }); } catch { return NextResponse.json({ success: false, error: "Error" }, { status: 500 }); } } export async function DELETE(request: NextRequest) { try { const { searchParams } = new URL(request.url); const id = searchParams.get("id"); if (!id) return NextResponse.json({ success: false, error: "ID requerido" }, { status: 400 }); await db.pet.deleteMany({ where: { characterId: id } }); await db.content.updateMany({ where: { characterId: id }, data: { characterId: null } }); await db.character.delete({ where: { id } }); return NextResponse.json({ success: true }); } catch { return NextResponse.json({ success: false, error: "Error" }, { status: 500 }); } }