From 301eba0bdf1bd773c367ccb33be405e105c0cc9a Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 09:38:32 -0400 Subject: [PATCH 01/10] updatePasswordSchema: fix validations --- src/lib/validations/updatePasswordSchema.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib/validations/updatePasswordSchema.ts b/src/lib/validations/updatePasswordSchema.ts index a9e64c8..26dfec9 100644 --- a/src/lib/validations/updatePasswordSchema.ts +++ b/src/lib/validations/updatePasswordSchema.ts @@ -2,22 +2,21 @@ import { z } from 'zod'; export const updatePasswordSchema = z .object({ - password: z.string().nonempty('La contraseña es obligatoria'), + password: z.string().nonempty('La contraseña actual es obligatoria'), newPassword: z .string() - .min(8, 'La confirmación debe tener al menos 8 caracteres') + .nonempty('La contraseña es obligatoria') + .min(8, 'La contraseña debe tener al menos 8 caracteres') .regex(/[A-Z]/, 'Debe tener al menos una letra mayúscula') .regex(/[a-z]/, 'Debe tener al menos una letra minúscula') .regex(/\d/, 'Debe tener al menos un número') - .regex(/[!@#$%^&*]/, 'Debe tener al menos un símbolo especial (!@#$%^&*)') - .nonempty('La confirmación de contraseña es obligatoria'), + .regex( + /[!@#$%^&*]/, + 'Debe tener al menos un símbolo especial (!@#$%^&*)', + ), + confirmPassword: z .string() - .min(8, 'La confirmación debe tener al menos 8 caracteres') - .regex(/[A-Z]/, 'Debe tener al menos una letra mayúscula') - .regex(/[a-z]/, 'Debe tener al menos una letra minúscula') - .regex(/\d/, 'Debe tener al menos un número') - .regex(/[!@#$%^&*]/, 'Debe tener al menos un símbolo especial (!@#$%^&*)') .nonempty('La confirmación de contraseña es obligatoria'), }) .refine((data) => data.newPassword === data.confirmPassword, { From be2edbe0e6688396369b26f8f29f448fb79ec228 Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 10:51:43 -0400 Subject: [PATCH 02/10] registerSchema: phoneNumber no longer requires '+' --- src/lib/validations/registerSchema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/validations/registerSchema.ts b/src/lib/validations/registerSchema.ts index 88fbdf4..59bd9ff 100644 --- a/src/lib/validations/registerSchema.ts +++ b/src/lib/validations/registerSchema.ts @@ -27,8 +27,8 @@ export const registerSchema = z .transform((value) => (value?.trim() === '' ? null : value)) .nullable() .refine( - (value) => value === null || /^\+\d{8,15}$/.test(value), - 'El teléfono debe iniciar con + y tener entre 8 y 15 dígitos', + (value) => value === null || /^\d{8,15}$/.test(value), + 'El teléfono debe tener entre 8 y 15 dígitos numéricos', ), fechaNacimiento: z .string() From cf3db8a187bab29d35b160d7b2f771cb85aa817b Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 11:13:08 -0400 Subject: [PATCH 03/10] newPresentationSchema: description required --- src/lib/validations/newPresentationSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/validations/newPresentationSchema.ts b/src/lib/validations/newPresentationSchema.ts index 7601b71..c2ef24f 100644 --- a/src/lib/validations/newPresentationSchema.ts +++ b/src/lib/validations/newPresentationSchema.ts @@ -2,7 +2,7 @@ import { z } from 'zod'; export const newPresentationSchema = z.object({ name: z.string().min(1, 'El nombre de la presentación es requerido'), - description: z.string().optional(), // o .min(1, 'Descripción requerida') si es obligatoria + description: z.string().min(1, 'Descripción requerida'), quantity: z .string() .min(1, 'La cantidad es requerida') From 50cf41fd861ce4f88320da161c88b1424a9ff922 Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 11:43:28 -0400 Subject: [PATCH 04/10] loginSchema: password length between 8 and 255 --- src/lib/validations/loginSchema.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/validations/loginSchema.ts b/src/lib/validations/loginSchema.ts index de6ea89..b6eef90 100644 --- a/src/lib/validations/loginSchema.ts +++ b/src/lib/validations/loginSchema.ts @@ -8,5 +8,6 @@ export const loginSchema = z.object({ password: z .string() .nonempty('La contraseña es obligatoria') - .min(6, 'La contraseña debe tener al menos 6 caracteres'), + .min(6, 'La contraseña debe tener al menos 6 caracteres') + .max(255, 'La contraseña no puede exceder los 255 caracteres'), }); From 37f421868fc065607e16fdd6014773b5d15b3d12 Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 11:52:46 -0400 Subject: [PATCH 05/10] editProfileSchema: phone number no longer requires '+' --- src/lib/validations/editProfileSchema.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/validations/editProfileSchema.ts b/src/lib/validations/editProfileSchema.ts index befc761..fdd50af 100644 --- a/src/lib/validations/editProfileSchema.ts +++ b/src/lib/validations/editProfileSchema.ts @@ -24,8 +24,8 @@ export const editProfileSchema = z .string() .optional() .refine( - (value) => value === undefined || /^\+\d{8,15}$/.test(value), - 'El teléfono debe iniciar con + y tener entre 8 y 15 dígitos', + (value) => value === undefined || /^\d{8,15}$/.test(value), + 'El teléfono debe tener entre 8 y 15 dígitos numéricos', ), birthDate: z .string() From 2fe96d4c9fbb4d9c4588af9d1a3e0bb6aca34553 Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 12:15:10 -0400 Subject: [PATCH 06/10] categorySchema: fix description max length message --- src/lib/validations/categorySchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/validations/categorySchema.ts b/src/lib/validations/categorySchema.ts index a83b8ae..f183c99 100644 --- a/src/lib/validations/categorySchema.ts +++ b/src/lib/validations/categorySchema.ts @@ -8,7 +8,7 @@ export const categorySchema = z.object({ description: z .string() .min(1, 'La descripción es requerida') - .max(255, 'La descripción no puede exceder 500 caracteres'), + .max(255, 'La descripción no puede exceder 255 caracteres'), }); export type CategoryFormValues = z.infer; From 958364b8bf4ce8c7ac93c3a269e02856bd685efe Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 12:26:09 -0400 Subject: [PATCH 07/10] updatePasswordSchema: fix passwords inputs min/max length --- src/lib/validations/updatePasswordSchema.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/lib/validations/updatePasswordSchema.ts b/src/lib/validations/updatePasswordSchema.ts index 26dfec9..ecbff31 100644 --- a/src/lib/validations/updatePasswordSchema.ts +++ b/src/lib/validations/updatePasswordSchema.ts @@ -2,22 +2,23 @@ import { z } from 'zod'; export const updatePasswordSchema = z .object({ - password: z.string().nonempty('La contraseña actual es obligatoria'), + password: z + .string() + .nonempty('La contraseña actual es obligatoria') + .min(8, 'La contraseña debe tener al menos 8 caracteres') + .max(255, 'La contraseña no puede exceder 255 caracteres'), + newPassword: z .string() .nonempty('La contraseña es obligatoria') .min(8, 'La contraseña debe tener al menos 8 caracteres') - .regex(/[A-Z]/, 'Debe tener al menos una letra mayúscula') - .regex(/[a-z]/, 'Debe tener al menos una letra minúscula') - .regex(/\d/, 'Debe tener al menos un número') - .regex( - /[!@#$%^&*]/, - 'Debe tener al menos un símbolo especial (!@#$%^&*)', - ), + .max(255, 'La contraseña no puede exceder 255 caracteres'), confirmPassword: z .string() - .nonempty('La confirmación de contraseña es obligatoria'), + .nonempty('La confirmación de contraseña es obligatoria') + .min(8, 'La contraseña debe tener al menos 8 caracteres') + .max(255, 'La contraseña no puede exceder 255 caracteres'), }) .refine((data) => data.newPassword === data.confirmPassword, { message: 'Las contraseñas no coinciden', From 50bf8a23b8d2776011dc3f0c92bba09c66ced0fb Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 12:45:35 -0400 Subject: [PATCH 08/10] registerSchema: rename fields, fix password validation --- src/lib/validations/registerSchema.ts | 31 ++++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/lib/validations/registerSchema.ts b/src/lib/validations/registerSchema.ts index 59bd9ff..ced98b0 100644 --- a/src/lib/validations/registerSchema.ts +++ b/src/lib/validations/registerSchema.ts @@ -2,27 +2,27 @@ import { z } from 'zod'; export const registerSchema = z .object({ - nombre: z + firstName: z .string() + .nonempty('El nombre es obligatorio') .min(2, 'El nombre debe tener al menos 2 caracteres') .max(50, 'El nombre no puede exceder los 50 caracteres') - .regex(/^[a-zA-Z\s]+$/, 'El nombre solo puede contener letras') - .nonempty('El nombre es obligatorio'), - apellido: z + .regex(/^[a-zA-Z\s]+$/, 'El nombre solo puede contener letras'), + lastName: z .string() + .nonempty('El apellido es obligatorio') .min(2, 'El apellido debe tener al menos 2 caracteres') .max(50, 'El apellido no puede exceder los 50 caracteres') - .regex(/^[a-zA-Z\s]+$/, 'El apellido solo puede contener letras') - .nonempty('El apellido es obligatorio'), + .regex(/^[a-zA-Z\s]+$/, 'El apellido solo puede contener letras'), email: z .string() .nonempty('El email es obligatorio') .email('Formato de email inválido'), - cedula: z + documentId: z .string() .nonempty('La cédula es obligatoria') .regex(/^\d+$/, 'La cédula debe contener solo números'), - telefono: z + phoneNumber: z .string() .transform((value) => (value?.trim() === '' ? null : value)) .nullable() @@ -30,7 +30,7 @@ export const registerSchema = z (value) => value === null || /^\d{8,15}$/.test(value), 'El teléfono debe tener entre 8 y 15 dígitos numéricos', ), - fechaNacimiento: z + birthDate: z .string() .nonempty('La fecha de nacimiento es obligatoria') .regex( @@ -54,7 +54,7 @@ export const registerSchema = z message: 'Debes tener al menos 14 años', }, ), - genero: z + gender: z .string() .transform((value) => (value?.trim() === '' ? null : value)) .nullable() @@ -67,12 +67,13 @@ export const registerSchema = z password: z .string() .min(8, 'La contraseña debe tener al menos 8 caracteres') - .regex(/[A-Z]/, 'Debe tener al menos una letra mayúscula') - .regex(/[a-z]/, 'Debe tener al menos una letra minúscula') - .regex(/\d/, 'Debe tener al menos un número') - .regex(/[!@#$%^&*]/, 'Debe tener al menos un símbolo especial (!@#$%^&*)') + .max(255, 'La contraseña no puede exceder los 255 caracteres') + .optional(), + confirmPassword: z + .string() + .min(8, 'La contraseña debe tener al menos 8 caracteres') + .max(255, 'La contraseña no puede exceder los 255 caracteres') .optional(), - confirmPassword: z.string().optional(), }) .refine( (data) => { From 7f67d250dbb7d2ba007b7da832a75be06c2a8eab Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 13:28:56 -0400 Subject: [PATCH 09/10] new/edit users: update schema usage --- src/app/(dashboard)/users/[id]/edit/page.tsx | 24 ++++++++++---------- src/app/(dashboard)/users/new/page.tsx | 24 ++++++++++---------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/app/(dashboard)/users/[id]/edit/page.tsx b/src/app/(dashboard)/users/[id]/edit/page.tsx index a34a408..c3fe644 100644 --- a/src/app/(dashboard)/users/[id]/edit/page.tsx +++ b/src/app/(dashboard)/users/[id]/edit/page.tsx @@ -90,25 +90,25 @@ export default function EditUserPage() { const genero = gender === UserGender.MALE ? 'hombre' : 'mujer'; const result = registerSchema.safeParse({ - nombre: firstName, - apellido: lastName, + firstName: firstName, + lastName: lastName, email, - cedula: documentId, - telefono: phoneNumber, - fechaNacimiento: birthDate ? convertSlashDateToIso(birthDate) : null, - genero, + documentId: documentId, + phoneNumber: phoneNumber, + birthDate: birthDate ? convertSlashDateToIso(birthDate) : null, + gender: genero, }); if (!result.success) { const fieldErrors = result.error.flatten().fieldErrors; setErrors({ - firstName: fieldErrors.nombre?.[0] || '', - lastName: fieldErrors.apellido?.[0] || '', + firstName: fieldErrors.firstName?.[0] || '', + lastName: fieldErrors.lastName?.[0] || '', email: fieldErrors.email?.[0] || '', - documentId: fieldErrors.cedula?.[0] || '', - phoneNumber: fieldErrors.telefono?.[0] || '', - birthDate: fieldErrors.fechaNacimiento?.[0] || '', - gender: fieldErrors.genero?.[0] || '', + documentId: fieldErrors.documentId?.[0] || '', + phoneNumber: fieldErrors.phoneNumber?.[0] || '', + birthDate: fieldErrors.birthDate?.[0] || '', + gender: fieldErrors.gender?.[0] || '', }); toast.error('Por favor, revisa los errores en el formulario'); return; diff --git a/src/app/(dashboard)/users/new/page.tsx b/src/app/(dashboard)/users/new/page.tsx index 1f3de52..7f397ef 100644 --- a/src/app/(dashboard)/users/new/page.tsx +++ b/src/app/(dashboard)/users/new/page.tsx @@ -81,25 +81,25 @@ export default function NewUserPage() { // Prepara los datos para la validación usando el schema const result = registerSchema.safeParse({ - nombre: firstName, - apellido: lastName, + firstName: firstName, + lastName: lastName, email, - cedula: documentId, - telefono: phoneNumber, - fechaNacimiento: convertSlashDateToIso(birthDate), // Se espera formato yyyy-mm-dd - genero, + documentId: documentId, + phoneNumber: phoneNumber, + birthDate: convertSlashDateToIso(birthDate), // Se espera formato yyyy-mm-dd + gender: genero, }); if (!result.success) { const { fieldErrors } = result.error.flatten(); setErrors({ - firstName: fieldErrors.nombre?.[0] || '', - lastName: fieldErrors.apellido?.[0] || '', + firstName: fieldErrors.firstName?.[0] || '', + lastName: fieldErrors.lastName?.[0] || '', email: fieldErrors.email?.[0] || '', - documentId: fieldErrors.cedula?.[0] || '', - phoneNumber: fieldErrors.telefono?.[0] || '', - birthDate: fieldErrors.fechaNacimiento?.[0] || '', - gender: fieldErrors.genero?.[0] || '', + documentId: fieldErrors.documentId?.[0] || '', + phoneNumber: fieldErrors.phoneNumber?.[0] || '', + birthDate: fieldErrors.birthDate?.[0] || '', + gender: fieldErrors.gender?.[0] || '', }); toast.error('Por favor, revisa los errores en el formulario'); return; From 26aee11c8004a53550ef986a89083481e32b6b57 Mon Sep 17 00:00:00 2001 From: Gustavo <1001.29587789.ucla@gmail.com> Date: Sun, 18 May 2025 13:36:47 -0400 Subject: [PATCH 10/10] loginSchema: password min length to 8 --- src/lib/validations/loginSchema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/validations/loginSchema.ts b/src/lib/validations/loginSchema.ts index b6eef90..442cd4a 100644 --- a/src/lib/validations/loginSchema.ts +++ b/src/lib/validations/loginSchema.ts @@ -8,6 +8,6 @@ export const loginSchema = z.object({ password: z .string() .nonempty('La contraseña es obligatoria') - .min(6, 'La contraseña debe tener al menos 6 caracteres') + .min(8, 'La contraseña debe tener al menos 8 caracteres') .max(255, 'La contraseña no puede exceder los 255 caracteres'), });