NutriScanModel
Este archivo define los esquemas de validación y tipos TypeScript para el módulo NutriScan usando zod. Estos esquemas se usan para validar entradas en endpoints del backend y formularios del frontend, y garantizan que los datos enviados para análisis nutricionales sean válidos, completos y seguros.
🔍 Ubicación
src/models/NutriScanModel.ts
🎯 Propósito
- Validar los datos enviados desde el frontend (evita errores y asegura integridad).
- Facilitar el tipado automático en TypeScript con
z.infer. - Estandarizar la estructura del objeto NutriScan para el backend.
🧩 Esquema completo (NutriScanSchema)
export const NutriScanSchema = z.object({
usuarioId: z.number().int().positive(),
esAlimento: z.boolean(),
consulta: z.string().min(1, "La consulta no puede estar vacía"),
respuesta: z.object({
mensaje: z.string(),
generadoPor: z.string(),
}),
tipoAnalisis: z.enum(["ocr-gpt-only", "ocr-openfoodfacts-gpt"]),
});
🔍 Campos
| Campo | Tipo | Descripción |
|---|---|---|
usuarioId | number | ID positivo del usuario. Solo se usa internamente en el backend. |
esAlimento | boolean | Si el análisis se refiere a un alimento. |
consulta | string | Texto OCR o nombre proporcionado del producto. No puede estar vacío. |
respuesta | object | Objeto con el mensaje generado y quién lo generó (GPT o simulado). |
tipoAnalisis | enum | Tipo de flujo usado: "ocr-gpt-only" o "ocr-openfoodfacts-gpt". |
isTest | boolean | Indica si el análisis fue generado en modo prueba o por un desarrollador. |
🧪 Esquema de entrada (NutriScanSchemaWithoutUserId)
export const NutriScanSchemaWithoutUserId = NutriScanSchema.omit({ usuarioId: true });
Este esquema se utiliza para validar entradas que vienen desde el frontend, ya que el
usuarioIdse infiere desde el token del usuario autenticado.
✏️ Esquema de actualización (NutriScanUpdateSchema)
export const NutriScanUpdateSchema = z.object({
consulta: z.string().min(1).optional(),
esAlimento: z.boolean().optional(),
tipoAnalisis: z.enum(["ocr-gpt-only", "ocr-openfoodfacts-gpt"]).optional(),
isTest: z.boolean().optional(),
respuesta: z.object({
mensaje: z.string(),
generadoPor: z.string(),
}).optional(),
});
Permite realizar actualizaciones parciales en los análisis ya existentes. Todos los campos son opcionales.
🧬 Tipos generados
export type NutriScanDTO = z.infer<typeof NutriScanSchema>;
export type NutriScanDTOInput = z.infer<typeof NutriScanSchemaWithoutUserId>;
export type NutriScanDTOUpdate = z.infer<typeof NutriScanUpdateSchema>;
| Tipo | Uso previsto |
|---|---|
NutriScanDTO | Backend: objeto completo con usuarioId. |
NutriScanDTOInput | Frontend: objeto enviado al crear. |
NutriScanDTOUpdate | Backend: para actualizaciones parciales. |
✅ Ventajas de usar Zod
- Validación robusta y personalizada con mensajes claros.
- Generación automática de tipos TypeScript.
- Esquemas reutilizables en múltiples capas del sistema.
🧾 Ejemplo de validación en backend
import { NutriScanSchema } from "../models/NutriScanModel";
try {
const datosValidados = NutriScanSchema.parse(req.body);
// datosValidados ahora es seguro para guardar en base de datos
} catch (error) {
res.status(400).json({ error: error.errors });
}
📌 Resumen
| Elemento | Descripción |
|---|---|
NutriScanSchema | Esquema completo, incluye usuarioId. |
NutriScanSchemaWithoutUserId | Entrada parcial sin usuarioId, desde el frontend. |
NutriScanUpdateSchema | Esquema para actualizaciones parciales de análisis. |
NutriScanDTO | Tipo completo del backend. |
NutriScanDTOInput | Tipo enviado desde el frontend. |
NutriScanDTOUpdate | Tipo usado al actualizar registros existentes. |