From 5962921bd7c674c52c91e092fe0299161a51ea18 Mon Sep 17 00:00:00 2001 From: BK2004 Date: Sun, 8 Sep 2024 13:10:48 -0500 Subject: [PATCH] Create API route returns event id; successful event creation redirects to event page; added protection against create event spam while redirecting --- src/app/manage/[clubId]/create/CreateEventForm.tsx | 8 ++++++-- src/server/api/routers/event.ts | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/app/manage/[clubId]/create/CreateEventForm.tsx b/src/app/manage/[clubId]/create/CreateEventForm.tsx index d2117976..95da69d6 100644 --- a/src/app/manage/[clubId]/create/CreateEventForm.tsx +++ b/src/app/manage/[clubId]/create/CreateEventForm.tsx @@ -29,6 +29,7 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub }); const router = useRouter(); const [watchDescription, watchStartTime] = watch(['description', 'startTime']); + const [redirecting, setRedirecting] = useState(false); const [eventPreview, setEventPreview] = useState({ name: "", clubId, @@ -65,11 +66,14 @@ const CreateEventForm = ({ clubId, officerClubs }: { clubId: string, officerClub }, [router, watch, officerClubs]); const createMutation = api.event.create.useMutation({ - onSuccess: () => { location.reload(); } + onSuccess: (data) => { if (data) { + setRedirecting(true); + router.push(`/event/${data}`); + } } }) const onSubmit = handleSubmit((data: z.infer) => { - if (!createMutation.isPending) { + if (!createMutation.isPending && !redirecting) { createMutation.mutate(data); } }); diff --git a/src/server/api/routers/event.ts b/src/server/api/routers/event.ts index e883f40e..454af6e4 100644 --- a/src/server/api/routers/event.ts +++ b/src/server/api/routers/event.ts @@ -262,7 +262,9 @@ export const eventRouter = createTRPCRouter({ throw new TRPCError({ code: 'UNAUTHORIZED' }); } - await ctx.db.insert(events).values({ ...input }); + const res = await ctx.db.insert(events).values({ ...input }).returning({ id: events.id }); + if (res.length == 0) throw "Failed to add event"; + return res[0]?.id; }), byName: publicProcedure.input(byNameSchema).query(async ({ input, ctx }) => { const { name, sortByDate } = input;