File size: 7,707 Bytes
6dc5ac9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e6e6a0
30320f7
6a5b62e
eb74f92
bead622
6dc5ac9
 
 
 
 
eb74f92
6dc5ac9
 
 
 
eb74f92
 
 
 
bead622
6dc5ac9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3e6e6a0
30320f7
6a5b62e
eb74f92
bead622
6dc5ac9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bead622
 
 
 
 
 
 
 
 
 
 
 
98bf1ef
 
 
09dd636
98bf1ef
 
 
 
 
 
 
 
4a81627
98bf1ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4889299
98bf1ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4889299
98bf1ef
 
 
 
 
 
 
 
fd0df2b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
"""Modelos Pydantic para validación de datos"""

from pydantic import BaseModel, EmailStr, Field
from typing import Optional
from datetime import datetime


class RegistroRequest(BaseModel):
    """Modelo para crear un nuevo registro"""
    uid: str = Field(..., max_length=255, description="UID de Firestore")
    display_name: str = Field(..., min_length=1, max_length=255, description="Nombre a mostrar")
    pais: str = Field(..., min_length=1, max_length=255, description="País del usuario")
    correo: EmailStr = Field(..., description="Email del usuario")
    fecha_registro: Optional[datetime] = Field(None, description="Fecha de registro")
    usos: Optional[int] = Field(0, ge=0, description="Cantidad de usos")
    prompt: Optional[str] = Field(None, max_length=255, description="Prompt utilizado")
    prompt_type: Optional[str] = Field(None, max_length=255, description="Tipo de prompt")
    prompt_eval: Optional[str] = Field(None, max_length=255, description="Evaluación del prompt")
    estilo: Optional[str] = Field(None, max_length=255, description="Estilo para la generación")
    estilo_agregado: Optional[str] = Field(None, max_length=255, description="Estilo adicional")
    calificacion: Optional[int] = Field(None, ge=0, description="Calificación numérica")
    proveedor: Optional[str] = Field(None, max_length=255, description="Proveedor del servicio")
    seed: Optional[int] = Field(None, description="Seed para generación")

    class Config:
        example = {
            "uid": "usuario123",
            "display_name": "Juan Pérez",
            "pais": "España",
            "correo": "juan@example.com",
            "prompt": "crear imagen de perro",
            "prompt_type": "imagen",
            "prompt_eval": "muy buena calidad",
            "estilo": "realista",
            "estilo_agregado": "alto detalle",
            "calificacion": 9,
            "proveedor": "openai",
            "seed": 12345
        }


class RegistroResponse(BaseModel):
    """Modelo para respuesta de registro"""
    id: int = Field(..., description="ID único del registro (auto-incremental)")
    uid: str = Field(..., description="UID de Firestore")
    display_name: str
    pais: str
    correo: str
    fecha_registro: Optional[datetime]
    usos: int
    prompt: Optional[str]
    prompt_type: Optional[str]
    prompt_eval: Optional[str]
    estilo: Optional[str]
    estilo_agregado: Optional[str]
    calificacion: Optional[int]
    proveedor: Optional[str]
    seed: Optional[int]
    created_at: datetime

    class Config:
        example = {
            "id": "550e8400-e29b-41d4-a716-446655440000",
            "display_name": "Juan Pérez",
            "pais": "España",
            "correo": "juan@example.com",
            "fecha_registro": "2025-01-13T10:30:00",
            "usos": 0,
            "prompt": "crear imagen de perro",
            "proveedor": "openai",
            "seed": 12345,
            "created_at": "2025-01-13T10:30:00"
        }


class CalificacionRequest(BaseModel):
    """Modelo para actualizar calificación de un registro"""
    id: int = Field(..., gt=0, description="ID del registro a calificar")
    calificacion: int = Field(..., ge=0, description="Calificación numérica")

    class Config:
        example = {
            "id": 1,
            "calificacion": 8
        }


class ActionRequest(BaseModel):
    """Modelo para crear/actualizar un registro en la tabla action_call"""
    usuario: str = Field(..., max_length=255, description="Nombre de usuario único")
    uid: Optional[str] = Field(None, max_length=255, description="UID de Firestore")
    displayName: Optional[str] = Field(None, max_length=255, description="Nombre a mostrar")
    email: Optional[str] = Field(None, description="Email del usuario")
    action_call: Optional[bool] = Field(None, description="Llamada a acción")
    trigger_action: Optional[str] = Field(None, max_length=255, description="Trigger de acción")
    country_header: Optional[str] = Field(None, max_length=10, description="País del header")
    country_ip: Optional[str] = Field(None, max_length=10, description="País de la IP")
    creditos: Optional[int] = Field(None, description="Créditos disponibles")
    esta_hora: Optional[int] = Field(None, ge=0, description="Usos esta hora")
    explicit_counter: Optional[int] = Field(None, ge=0, description="Contador explícito")
    fecha_registro: Optional[datetime] = Field(None, description="Fecha de registro")
    gaClient: Optional[str] = Field(None, max_length=255, description="Cliente de Google Analytics")
    open_use: Optional[bool] = Field(None, description="Uso abierto")
    ritmo: Optional[float] = Field(None, description="Ritmo de uso")
    streak: Optional[int] = Field(None, ge=0, description="Racha de usos")
    ultima_generacion_hora: Optional[datetime] = Field(None, description="Última generación esta hora")
    ultimo_uso: Optional[datetime] = Field(None, description="Último uso")
    usos: Optional[int] = Field(None, ge=0, description="Total de usos")

    class Config:
        example = {
            "usuario": "moibe",
            "uid": "uTHjWOudaUYXDgTDE3zlvlr5QU63",
            "displayName": "Moisés Briseño Estrello",
            "email": "moi.estrello@gmail.com",
            "action_call": True,
            "trigger_action": "generacion_imagen",
            "country_header": "BR",
            "country_ip": "BR",
            "creditos": 0,
            "esta_hora": 2,
            "explicit_counter": 14,
            "usos": 201
        }


class ActionResponse(BaseModel):
    """Modelo para respuesta de acciones"""
    id: int
    usuario: str
    uid: Optional[str]
    displayName: Optional[str]
    email: Optional[str]
    action_call: Optional[bool]
    trigger_action: Optional[str]
    country_header: Optional[str]
    country_ip: Optional[str]
    creditos: Optional[int]
    esta_hora: Optional[int]
    explicit_counter: Optional[int]
    fecha_registro: Optional[datetime]
    gaClient: Optional[str]
    open_use: Optional[bool]
    ritmo: Optional[float]
    streak: Optional[int]
    ultima_generacion_hora: Optional[datetime]
    ultimo_uso: Optional[datetime]
    usos: Optional[int]
    created_at: datetime
    updated_at: datetime

    class Config:
        example = {
            "id": 1,
            "usuario": "moibe",
            "uid": "uTHjWOudaUYXDgTDE3zlvlr5QU63",
            "displayName": "Moisés Briseño Estrello",
            "email": "moi.estrello@gmail.com",
            "usos": 201,
            "created_at": "2025-01-13T10:30:00",
            "updated_at": "2025-02-06T15:45:00"
        }


class FunelCompraRequest(BaseModel):
    """Modelo para crear/registrar un evento en el funel de compra"""
    usuario: str = Field(..., max_length=255, description="Nombre de usuario")
    mail: str = Field(..., description="Email del usuario")
    accion: str = Field(..., max_length=255, description="Acción realizada en el funel (ej: inicio, visualizacion, intento_compra, compra_exitosa)")

    class Config:
        example = {
            "usuario": "moibe",
            "mail": "moi.estrello@gmail.com",
            "accion": "compra_exitosa"
        }


class FunelCompraResponse(BaseModel):
    """Modelo para respuesta de registros del funel de compra"""
    id: int = Field(..., description="ID único del registro")
    usuario: str
    mail: str
    accion: str
    created_at: datetime

    class Config:
        example = {
            "id": 1,
            "usuario": "moibe",
            "mail": "moi.estrello@gmail.com",
            "accion": "compra_exitosa",
            "created_at": "2026-02-11T10:30:00"
        }