From 41abbe6136d99d82e12ffc98e3cfa39a377f37e7 Mon Sep 17 00:00:00 2001 From: ephraimduncan Date: Mon, 26 Jan 2026 11:08:05 +0000 Subject: [PATCH 1/2] fix: make hasReturningUrl public for form submission pages Form completion pages (/s/[formId]) need to check if a returnUrl exists, but were using protectedProcedure which caused sporadic UNAUTHORIZED errors for anonymous form submitters. --- packages/api/routers/form.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/api/routers/form.ts b/packages/api/routers/form.ts index 58bd247..60179c1 100644 --- a/packages/api/routers/form.ts +++ b/packages/api/routers/form.ts @@ -212,15 +212,18 @@ export const formRouter = createTRPCRouter({ }), ), - hasReturningUrl: protectedProcedure + hasReturningUrl: publicProcedure .input( z.object({ formId: z.string(), }), ) .query(async ({ ctx, input }) => { - const form = await assertFormOwnership(ctx, input.formId); - return { returnUrl: form.returnUrl }; + const form = await ctx.db.query.forms.findFirst({ + where: (table) => eq(table.id, input.formId), + columns: { returnUrl: true }, + }); + return { returnUrl: form?.returnUrl ?? null }; }), formSubmissions: protectedProcedure From 2d387c78d8f6e058174aae53a9dac4f7a2d32441 Mon Sep 17 00:00:00 2001 From: ephraimduncan Date: Mon, 26 Jan 2026 11:12:27 +0000 Subject: [PATCH 2/2] refactor: rename hasReturningUrl to getReturnUrl - "has" prefix implies boolean but returns actual URL value - Aligns with codebase convention for data fetching procedures --- apps/web/src/app/s/[formId]/page.tsx | 2 +- packages/api/routers/form.ts | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/web/src/app/s/[formId]/page.tsx b/apps/web/src/app/s/[formId]/page.tsx index f6a048b..47a0686 100644 --- a/apps/web/src/app/s/[formId]/page.tsx +++ b/apps/web/src/app/s/[formId]/page.tsx @@ -10,7 +10,7 @@ export default async function FormCompletedPage({ params: Promise<{ formId: string }>; }) { const { formId } = await params; - const form = await api.form.hasReturningUrl({ formId }); + const form = await api.form.getReturnUrl({ formId }); if (!form) { return ( diff --git a/packages/api/routers/form.ts b/packages/api/routers/form.ts index 60179c1..d819382 100644 --- a/packages/api/routers/form.ts +++ b/packages/api/routers/form.ts @@ -212,12 +212,8 @@ export const formRouter = createTRPCRouter({ }), ), - hasReturningUrl: publicProcedure - .input( - z.object({ - formId: z.string(), - }), - ) + getReturnUrl: publicProcedure + .input(z.object({ formId: z.string() })) .query(async ({ ctx, input }) => { const form = await ctx.db.query.forms.findFirst({ where: (table) => eq(table.id, input.formId),