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 });
  }
}