teqo-backup/src/lib/schemas/campaignPassword.ts
Cursor Agent 7484aab28a
RS+ Fase 1+3: auth read leve, password fields e login state
- authenticateCampaignToken usa depth:0 + select mínimo (sem join media)
- getCampaignUserWithAvatar para layout/perfil; hasCampaignSession em rotas públicas
- CampaignPasswordFields reutilizado em reset, perfil e convite
- LoginForm migra para CampaignFormActionState + mapCampaignFormActionError
- invite login schema unifica refineMatchingPasswords

Co-authored-by: Francisco Solla <fsolla@users.noreply.github.com>
2026-08-01 06:07:28 +00:00

52 lines
1.6 KiB
TypeScript

import type { RefinementCtx } from 'zod'
import { z } from 'zod'
export const CAMPAIGN_PASSWORD_RESET_TOKEN_MIN_LENGTH = 20
/** THE campaign password rule (P3-K — the invite schema copied it). */
export const campaignPasswordSchema = z
.string()
.min(8, 'A senha deve ter pelo menos 8 caracteres.')
.max(128, 'A senha deve ter no máximo 128 caracteres.')
export const refineMatchingPasswords = (
data: { password: string; passwordConfirmation: string },
context: RefinementCtx,
) => {
if (data.password !== data.passwordConfirmation) {
context.addIssue({
code: 'custom',
message: 'As senhas não coincidem.',
path: ['passwordConfirmation'],
})
}
}
export const campaignPasswordResetRequestSchema = z.object({
email: z.email('Informe um e-mail válido.').trim(),
})
export const campaignPasswordResetSchema = z
.object({
token: z.string().min(CAMPAIGN_PASSWORD_RESET_TOKEN_MIN_LENGTH).max(256),
password: campaignPasswordSchema,
passwordConfirmation: campaignPasswordSchema,
})
.superRefine(refineMatchingPasswords)
export const campaignChangePasswordSchema = z
.object({
currentPassword: z.string().min(1, 'Informe a senha atual.'),
password: campaignPasswordSchema,
passwordConfirmation: campaignPasswordSchema,
})
.superRefine((data, context) => {
refineMatchingPasswords(data, context)
if (data.currentPassword === data.password) {
context.addIssue({
code: 'custom',
message: 'A nova senha deve ser diferente da atual.',
path: ['password'],
})
}
})