Refine workspaces and event publishing; harden uploads and email delivery

This commit is contained in:
2026-09-09 15:44:00 -04:00
parent f5702caaea
commit 574f29a68e
93 changed files with 2885 additions and 535 deletions
+46
View File
@@ -91,11 +91,35 @@ export const createEventInputSchema = z.object({
inviteCode: z.string().trim().max(80).optional(),
});
export const publishingPolicySchema = z.enum(["automatic", "approved", "never"]);
export type EmailPayload = { to: string; from: string; subject: string; html: string; text: string; referenceId: string; attachments?: { filename: string; content: string; contentId: string }[] };
export const checkEventSlugInputSchema = z.object({ eventId: z.string().uuid(), slug: eventSlugSchema });
export const generateEventSlugInputSchema = z.object({ eventId: z.string().uuid(), title: z.string().trim().min(1).max(120) });
export type PublishingPolicy = z.infer<typeof publishingPolicySchema>;
export const moderateNoteInputSchema = z.object({ eventId: z.string().uuid(), guestId: z.string().uuid(), approved: z.boolean() });
export const updateEventInputSchema = z.object({
publishAt: z.coerce.date().nullable().optional(),
submissionsOpenAt: z.coerce.date().nullable().optional(),
submissionsCloseAt: z.coerce.date().nullable().optional(),
galleryVisibleAt: z.coerce.date().nullable().optional(),
notesVisibleAt: z.coerce.date().nullable().optional(),
notesPolicy: publishingPolicySchema.optional(),
galleryPolicy: publishingPolicySchema.optional(),
showPhotoStats: z.boolean().optional(),
showSubmitterStats: z.boolean().optional(),
showNoteStats: z.boolean().optional(),
eventId: z.string().uuid(),
title: z.string().trim().min(1).max(120).optional(),
slug: eventSlugSchema.optional(),
description: z.string().trim().max(2000).nullable().optional(),
location: z.string().trim().max(300).nullable().optional(),
locationCoordinates: z.object({
latitude: z.number().min(-90).max(90),
longitude: z.number().min(-180).max(180),
}).nullable().optional(),
bannerPhotoId: z.string().uuid().nullable().optional(),
customBannerId: z.string().uuid().nullable().optional(),
startsAt: z.coerce.date().nullable().optional(),
endsAt: z.coerce.date().nullable().optional(),
status: eventStatusSchema.optional(),
@@ -103,6 +127,18 @@ export const updateEventInputSchema = z.object({
uploadEnabled: z.boolean().optional(),
});
export const locationSearchInputSchema = z.object({
eventId: z.string().uuid(),
query: z.string().trim().min(3).max(300),
});
export const locationSuggestionSchema = z.object({
address: z.string(),
latitude: z.number().min(-90).max(90),
longitude: z.number().min(-180).max(180),
});
export type LocationSuggestion = z.infer<typeof locationSuggestionSchema>;
export const ensureGuestInputSchema = z.object({
eventSlug: eventSlugSchema,
displayName: contributorNameSchema,
@@ -136,6 +172,16 @@ export const completePhotoInputSchema = z.object({
photoId: z.string().uuid(),
});
export const createBannerInputSchema = z.object({
eventId: z.string().uuid(),
contentType: allowedImageTypeSchema,
byteSize: z.number().int().positive().max(MAX_PHOTO_BYTES),
});
export const bannerInputSchema = z.object({
eventId: z.string().uuid(),
bannerId: z.string().uuid(),
});
export const moderatePhotoInputSchema = z.object({
photoId: z.string().uuid(),
visibility: photoVisibilitySchema,