refactor(validation): refactor createDonationSchema to use discriminatedUnion

Refactored the createDonationSchema from a combination of .object().and(z.union()) to a discriminatedUnion based on the "anonymous" field. This improves type safety and validation logic by explicitly handling anonymous and identified donations, ensuring customAmount is properly validated in both cases. The change maintains the same validation rules while simplifying the schema structure.
This commit is contained in:
Evandro Fonseca Junior committed 2025-10-26 23:11:21 -03:00
1 parent a1800227a7
commit c7d4dadbbb
1 file changed
+19 -22
+19 -22
View File
@@ -80,28 +80,25 @@ export const customAmountSchema = z
// Schema completo para criação de doação // Schema completo para criação de doação
export const createDonationSchema = z export const createDonationSchema = z
.object({ .discriminatedUnion("anonymous", [
tier: donationTierSchema, // Doação anônima
anonymous: z.boolean().optional().default(false), z.object({
customAmount: z.number().optional(), tier: donationTierSchema,
}) anonymous: z.literal(true),
.and( customAmount: z.number().optional(),
z.union([ }),
// Doação anônima - não precisa de dados pessoais // Doação identificada
z.object({ z.object({
anonymous: z.literal(true), tier: donationTierSchema,
}), anonymous: z.literal(false),
// Doação identificada - precisa de todos os dados donorName: nameSchema,
z.object({ donorEmail: emailSchema,
anonymous: z.literal(false), donorPhone: phoneSchema,
donorName: nameSchema, donorTaxId: documentSchema,
donorEmail: emailSchema, donorMessage: messageSchema,
donorPhone: phoneSchema, customAmount: z.number().optional(),
donorTaxId: documentSchema, }),
donorMessage: messageSchema, ])
}),
])
)
.refine( .refine(
(data) => { (data) => {
// Se tier for custom, customAmount é obrigatório // Se tier for custom, customAmount é obrigatório