Skip to main content

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

CampoTipoDescripción
usuarioIdnumberID positivo del usuario. Solo se usa internamente en el backend.
esAlimentobooleanSi el análisis se refiere a un alimento.
consultastringTexto OCR o nombre proporcionado del producto. No puede estar vacío.
respuestaobjectObjeto con el mensaje generado y quién lo generó (GPT o simulado).
tipoAnalisisenumTipo de flujo usado: "ocr-gpt-only" o "ocr-openfoodfacts-gpt".
isTestbooleanIndica 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 usuarioId se 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>;
TipoUso previsto
NutriScanDTOBackend: objeto completo con usuarioId.
NutriScanDTOInputFrontend: objeto enviado al crear.
NutriScanDTOUpdateBackend: 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

ElementoDescripción
NutriScanSchemaEsquema completo, incluye usuarioId.
NutriScanSchemaWithoutUserIdEntrada parcial sin usuarioId, desde el frontend.
NutriScanUpdateSchemaEsquema para actualizaciones parciales de análisis.
NutriScanDTOTipo completo del backend.
NutriScanDTOInputTipo enviado desde el frontend.
NutriScanDTOUpdateTipo usado al actualizar registros existentes.