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:
1 parent
a1800227a7
commit
c7d4dadbbb
1 file changed
+19
-22
+19
-22
@@ -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
|
||||||
|
|||||||
Reference in new issue
Block a user