Validación ProductosModel
Este archivo define el esquema de validación para los productos utilizando Zod
, una biblioteca de validación de datos en tiempo de ejecución para TypeScript. Se asegura de que los datos enviados al sistema cumplan con el formato y las reglas requeridas antes de ser procesados.
🔍 Ubicación
src/model/ProductosModel.ts
🧩 Dependencias
import { z } from "zod";
🧪 Enumeraciones
export const estadoEnum = z.enum([
"DISPONIBLE",
"AGOTADO",
"RESERVADO",
"VENCIDO",
"ELIMINADO"
]);
Esta enumeración valida que el estado del producto sea uno de los siguientes:
DISPONIBLE
AGOTADO
RESERVADO
VENCIDO
ELIMINADO
✅ Esquema de validación
export const productoSchema = z.object({
codigoBarras: z.string().optional().nullable(),
codigoQR: z.string().optional().nullable(),
nombre: z.string().min(1).trim(),
descripcion: z.string().min(1).trim(),
categoria: z.string().optional(),
cantidad: z.number().int().nonnegative(),
precio: z.preprocess((val) => Number(val), z.number().nonnegative({
message: "El precio debe ser un número válido",
})),
fechaAdquisicion: z.string().refine((val) => !isNaN(Date.parse(val)), {
message: "fechaAdquisicion debe ser una fecha válida (ISO string)",
}),
fechaVencimiento: z.string().refine((val) => !isNaN(Date.parse(val)), {
message: "fechaVencimiento debe ser una fecha válida (ISO string)",
}),
usuarioId: z.number().optional(),
estado: estadoEnum,
imagen: z.string().trim().url({ message: "imagen debe ser una URL válida" }),
});
🧾 Descripción de campos
Campo | Tipo | Requerido | Descripción |
---|---|---|---|
codigoBarras | string | null | Opcional | Código de barras del producto |
codigoQR | string | null | Opcional | Código QR del producto |
nombre | string | Sí | Nombre del producto (mínimo 1 caracter, sin espacios vacíos) |
descripcion | string | Sí | Descripción del producto |
categoria | string | Opcional | Categoría del producto |
cantidad | number | Sí | Cantidad disponible, debe ser un número entero no negativo |
precio | number | Sí | Precio del producto, convertido previamente a número |
fechaAdquisicion | string | Sí | Fecha en formato ISO, debe ser una fecha válida |
fechaVencimiento | string | Sí | Fecha en formato ISO, debe ser una fecha válida |
usuarioId | number | Opcional | ID del usuario propietario del producto |
estado | enum | Sí | Estado del producto según estadoEnum |
imagen | string (URL) | Sí | URL de la imagen del producto |
📤 Tipo inferido
export type ProductoInput = z.infer<typeof productoSchema>;
Este tipo se usa para tipar los objetos validados automáticamente con base en el esquema productoSchema
.