- Add password-reset Prisma schema for OTP tracking - Add API contract schemas (start, verify, resend) - Add password-reset service with OTP validation and email sending - Add frontend reset-password page with 2-step flow - Add InputOTP component usage for OTP input - Add link to reset-password in login page - Remove link to About in login - Center and resize login/reset password forms
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import { z } from 'zod'
|
|
|
|
export const userProfileSchema = z.object({
|
|
id: z.string(),
|
|
fullName: z.string(),
|
|
email: z.email().nullable(),
|
|
role: z.string(),
|
|
avatarUrl: z.url().nullable(),
|
|
createdAt: z.string(),
|
|
})
|
|
|
|
export type UserProfile = z.infer<typeof userProfileSchema>
|
|
export type UserProfileResponse = UserProfile
|
|
|
|
export const passwordResetStartSchema = z.object({
|
|
email: z.string().email('Ingresá un email válido.'),
|
|
})
|
|
|
|
export type PasswordResetStartInput = z.infer<typeof passwordResetStartSchema>
|
|
|
|
export const passwordResetVerifySchema = z.object({
|
|
requestId: z.string().uuid('Request ID inválido.'),
|
|
otp: z.string().length(6, 'El código debe tener 6 dígitos.'),
|
|
newPassword: z.string().min(6, 'La contraseña debe tener al menos 6 caracteres.'),
|
|
})
|
|
|
|
export type PasswordResetVerifyInput = z.infer<typeof passwordResetVerifySchema>
|
|
|
|
export const passwordResetResendSchema = z.object({
|
|
requestId: z.string().uuid('Request ID inválido.'),
|
|
})
|
|
|
|
export type PasswordResetResendInput = z.infer<typeof passwordResetResendSchema>
|
|
|
|
export type PasswordResetStartResponse = {
|
|
message: string;
|
|
requestId: string;
|
|
email: string;
|
|
expiresAt: string;
|
|
cooldownSeconds: number;
|
|
}
|
|
|
|
export type PasswordResetVerifyResponse = {
|
|
message: string;
|
|
}
|
|
|
|
export type PasswordResetResendResponse = {
|
|
message: string;
|
|
requestId: string;
|
|
email: string;
|
|
expiresAt: string;
|
|
cooldownSeconds: number;
|
|
}
|