Spaces:
Build error
Build error
File size: 3,760 Bytes
333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 333c51a 21b315e 30ad7ef 333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 333c51a 30ad7ef a9c09de 21b315e 1eae852 21b315e 333c51a 1eae852 333c51a 1eae852 333c51a 1eae852 a9c09de 1eae852 333c51a 1eae852 333c51a 1eae852 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | 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 });
}
} |