Spaces:
Build error
Build error
| import { NextRequest, NextResponse } from "next/server"; | |
| import { db } from "@/lib/db"; | |
| import ZAI from "z-ai-web-dev-sdk"; | |
| // ================================ | |
| // GET - Listar personajes | |
| // ================================ | |
| export async function GET() { | |
| try { | |
| const characters = await db.character.findMany({ | |
| include: { | |
| contents: { | |
| take: 5, | |
| orderBy: { createdAt: "desc" }, | |
| }, | |
| }, | |
| orderBy: { createdAt: "desc" }, | |
| }); | |
| return NextResponse.json({ | |
| success: true, | |
| characters, | |
| total: characters.length, | |
| }); | |
| } catch (error) { | |
| console.error("Error fetching characters:", error); | |
| return NextResponse.json( | |
| { success: false, error: "Error al obtener personajes" }, | |
| { status: 500 } | |
| ); | |
| } | |
| } | |
| // ================================ | |
| // POST - Crear personaje | |
| // ================================ | |
| export async function POST(request: NextRequest) { | |
| try { | |
| const body = await request.json(); | |
| const { | |
| name, | |
| description, | |
| generateReference = false, | |
| traits, | |
| } = body; | |
| if (!name) { | |
| return NextResponse.json( | |
| { success: false, error: "El nombre del personaje es requerido" }, | |
| { status: 400 } | |
| ); | |
| } | |
| let referenceImage: string | null = null; | |
| let characterTraits: string | null = null; | |
| // ================================= | |
| // Generar imagen de referencia | |
| // ================================= | |
| if (generateReference) { | |
| try { | |
| const zai = await ZAI.create(); | |
| const characterPrompt = `Character reference sheet: ${name}. ${ | |
| description || "Original character" | |
| }. Full body view, multiple angles (front, side, back), consistent character design, neutral pose, white background, professional character sheet.`; | |
| const response: any = await zai.images.generations.create({ | |
| prompt: characterPrompt, | |
| size: "1344x768", | |
| }); | |
| const imageBase64 = | |
| response?.data?.[0]?.base64 || null; | |
| if (imageBase64) { | |
| referenceImage = `data:image/png;base64,${imageBase64}`; | |
| } | |
| // ================================= | |
| // Extraer traits con IA | |
| // ================================= | |
| if (!traits) { | |
| const traitsResponse: any = | |
| await zai.chat.completions.create({ | |
| messages: [ | |
| { | |
| role: "system", | |
| content: | |
| 'Eres experto en diseño de personajes. Responde SOLO JSON: { "face": "", "body": "", "hair": "", "clothing": "", "colors": "", "distinctive": "" }', | |
| }, | |
| { | |
| role: "user", | |
| content: `Personaje: ${name}. Descripción: ${ | |
| description || "Original character" | |
| }`, | |
| }, | |
| ], | |
| }); | |
| const traitsText = | |
| traitsResponse?.choices?.[0]?.message?.content || ""; | |
| const jsonMatch = traitsText.match(/\{[\s\S]*\}/); | |
| if (jsonMatch) { | |
| characterTraits = jsonMatch[0]; | |
| } else { | |
| characterTraits = JSON.stringify({ | |
| description: description || "Original character", | |
| }); | |
| } | |
| } | |
| } catch (genError) { | |
| console.error("Error generando referencia:", genError); | |
| } | |
| } | |
| // Traits desde request | |
| if (traits) { | |
| characterTraits = | |
| typeof traits === "string" | |
| ? traits | |
| : JSON.stringify(traits); | |
| } | |
| // ================================= | |
| // Crear personaje en BD | |
| // ================================= | |
| const character = await db.character.create({ | |
| data: { | |
| name, | |
| description: description || null, | |
| referenceImage, | |
| traits: | |
| characterTraits || | |
| JSON.stringify({ name, description }), | |
| }, | |
| }); | |
| return NextResponse.json({ | |
| success: true, | |
| character, | |
| message: `Personaje "${name}" creado exitosamente`, | |
| }); | |
| } catch (error) { | |
| console.error("Error creating character:", error); | |
| return NextResponse.json( | |
| { success: false, error: "Error al crear personaje" }, | |
| { status: 500 } | |
| ); | |
| } | |
| } | |
| // ================================ | |
| // PUT - Actualizar personaje | |
| // ================================ | |
| 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 del personaje requerido" }, | |
| { status: 400 } | |
| ); | |
| } | |
| const character = await db.character.update({ | |
| where: { id }, | |
| data: { | |
| name: name || undefined, | |
| description: description || undefined, | |
| traits: traits || undefined, | |
| }, | |
| }); | |
| return NextResponse.json({ | |
| success: true, | |
| character, | |
| }); | |
| } catch (error) { | |
| console.error("Error updating character:", error); | |
| return NextResponse.json( | |
| { success: false, error: "Error al actualizar personaje" }, | |
| { status: 500 } | |
| ); | |
| } | |
| } | |
| // ================================ | |
| // DELETE - Eliminar personaje | |
| // ================================ | |
| 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.character.delete({ | |
| where: { id }, | |
| }); | |
| return NextResponse.json({ | |
| success: true, | |
| message: "Personaje eliminado", | |
| }); | |
| } catch (error) { | |
| console.error("Error deleting character:", error); | |
| return NextResponse.json( | |
| { success: false, error: "Error al eliminar personaje" }, | |
| { status: 500 } | |
| ); | |
| } | |
| } | |