sofia-cloud / src /app /api /characters /route.ts
Gmagl
fix: corregir ESLint v10→v9, bug de slug en Character, eliminar webhook duplicado, añadir páginas success/cancel, limpiar build.log
21b315e
Raw
History Blame Contribute Delete
3.76 kB
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 });
}
}