diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 42f10f3ec..df7618f1f 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,5 +1,6 @@ import { type ClassValue, clsx } from "clsx" import { twMerge } from "tailwind-merge" +import { z } from "zod" export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) @@ -16,3 +17,5 @@ export function getIsMembershipOpen() { return !isClosed } + +export const EmptyStringToNull = z.union([z.literal("").transform(() => null), z.string()]).nullish() diff --git a/src/server/api/routers/user.ts b/src/server/api/routers/user.ts index 22aa6bef1..4d63f33b4 100644 --- a/src/server/api/routers/user.ts +++ b/src/server/api/routers/user.ts @@ -9,6 +9,7 @@ import { updateEmail } from "~/app/actions" import { env } from "~/env" import { NAMED_ROLES } from "~/lib/constants" +import { EmptyStringToNull } from "~/lib/utils" import { adminProcedure, createTRPCRouter, @@ -60,10 +61,10 @@ export const userRouter = createTRPCRouter({ message: "Pronouns are required", }) .trim(), - student_number: z.string().trim().optional(), - uni: z.string().trim().optional(), - github: z.string().trim().optional(), - discord: z.string().trim().optional(), + student_number: EmptyStringToNull, + uni: EmptyStringToNull, + github: EmptyStringToNull, + discord: EmptyStringToNull, subscribe: z.boolean(), }), ) @@ -149,10 +150,10 @@ export const userRouter = createTRPCRouter({ message: "Pronouns are required", }) .trim(), - student_number: z.string().trim().optional(), - uni: z.string().trim().optional(), - github: z.string().trim().optional(), - discord: z.string().trim().optional(), + student_number: EmptyStringToNull, + uni: EmptyStringToNull, + github: EmptyStringToNull, + discord: EmptyStringToNull, subscribe: z.boolean(), }), ) @@ -338,8 +339,8 @@ export const userRouter = createTRPCRouter({ message: "Pronouns are required", }) .optional(), - student_number: z.string().nullish(), - uni: z.string().optional().nullish(), + student_number: EmptyStringToNull, + uni: EmptyStringToNull, }), ) .mutation(async ({ ctx, input }) => { @@ -370,8 +371,8 @@ export const userRouter = createTRPCRouter({ updateSocial: protectedRatedProcedure(Ratelimit.fixedWindow(4, "30s")) .input( z.object({ - github: z.string().optional().nullish(), - discord: z.string().optional().nullish(), + github: EmptyStringToNull, + discord: EmptyStringToNull, }), ) .mutation(async ({ ctx, input }) => {