Files
gruperly/packages/shared/src/schemas/waitlist.ts
Jose Selesan fc30927b8b feat: manage waitlist and remove group members
- Add group-waitlist module (list/promote/remove entries)
- Remove attendee with optional atomic promotion from waitlist
- Block removal when attendee has payments (attendee_has_payments)
- Waitlist detail modal matching members UI; optimistic add-to-waitlist
- Responsive tweaks for the members/waitlist tabs
2026-09-22 17:04:41 -03:00

70 lines
2.4 KiB
TypeScript

import { z } from 'zod';
import { createPageSchema, createPageSizeSchema, createPaginationSchema } from './pagination.js';
const isoDateTimeSchema = z.string().datetime();
const pageSchema = createPageSchema();
const pageSizeSchema = createPageSizeSchema(10);
const paginationSchema = createPaginationSchema();
export const waitlistStatusSchema = z.enum(['PENDING', 'INVITED', 'JOINED', 'DECLINED']);
export const WaitlistEntryDtoSchema = z.object({
id: z.string(),
email: z.string(),
name: z.string().nullable(),
status: waitlistStatusSchema,
createdAt: isoDateTimeSchema,
updatedAt: isoDateTimeSchema,
});
export type WaitlistEntryDto = z.output<typeof WaitlistEntryDtoSchema>;
export const WaitlistQuerySchema = z.object({
page: pageSchema,
pageSize: pageSizeSchema,
});
export type WaitlistQuery = z.output<typeof WaitlistQuerySchema>;
export const WaitlistListSchema = z.object({
data: z.array(WaitlistEntryDtoSchema),
pagination: paginationSchema,
});
export type WaitlistList = z.output<typeof WaitlistListSchema>;
export const GroupWaitlistEntryDtoSchema = z.object({
id: z.string(),
groupId: z.string(),
fullName: z.string(),
phone: z.string(),
email: z.string().nullable(),
notes: z.string().nullable(),
status: waitlistStatusSchema,
createdAt: isoDateTimeSchema,
updatedAt: isoDateTimeSchema,
});
export type GroupWaitlistEntryDto = z.output<typeof GroupWaitlistEntryDtoSchema>;
export const CreateGroupWaitlistEntrySchema = z.object({
firstName: z.string().trim().min(1, 'El nombre es obligatorio'),
lastName: z.string().trim().optional().default(''),
phone: z.string().trim().min(6, 'Ingresa un número de teléfono válido'),
email: z.string().trim().email('Email inválido').optional().or(z.literal('')),
notes: z.string().trim().optional(),
});
export type CreateGroupWaitlistEntry = z.output<typeof CreateGroupWaitlistEntrySchema>;
export const GroupWaitlistQuerySchema = z.object({
page: pageSchema,
pageSize: pageSizeSchema,
});
export type GroupWaitlistQuery = z.output<typeof GroupWaitlistQuerySchema>;
export const GroupWaitlistListSchema = z.object({
data: z.array(GroupWaitlistEntryDtoSchema),
pagination: paginationSchema,
});
export type GroupWaitlistList = z.output<typeof GroupWaitlistListSchema>;
export const RemoveGroupWaitlistEntryResultSchema = z.object({
deleted: z.boolean(),
});
export type RemoveGroupWaitlistEntryResult = z.output<typeof RemoveGroupWaitlistEntryResultSchema>;