diff --git a/common/src/input/pizza-flavor.ts b/common/src/input/pizza-flavor.ts new file mode 100644 index 00000000..2a565754 --- /dev/null +++ b/common/src/input/pizza-flavor.ts @@ -0,0 +1,21 @@ +import { z } from "zod/v4" +import { recordEntries } from "@/util/record-entries" + +export const pizzaFlavorSchema = z.enum(["nothing", "alternative", "margherita", "pepperoni"]) + +export type PizzaFlavor = z.output + +const PizzaFlavourMetadata: Record = { + nothing: { label: "Nothing" }, + alternative: { label: "Alternative" }, + margherita: { label: "Margherita" }, + pepperoni: { label: "Pepperoni" }, +} + +export const pizzaFlavourOptions = recordEntries(PizzaFlavourMetadata).map(([value, metadata]) => ({ + value, + label: metadata.label, +})) satisfies Array<{ + value: PizzaFlavor + label: string +}> diff --git a/common/src/types/application.ts b/common/src/types/application.ts index a39d249c..8b1d32a3 100644 --- a/common/src/types/application.ts +++ b/common/src/types/application.ts @@ -1,5 +1,6 @@ import type { DisciplineOfStudy } from "@/input/discipline-of-study" import type { DietaryRequirement } from "@/input/dietary-requirement" +import { PizzaFlavor } from "@/input/pizza-flavor"; export type { DisciplineOfStudy, DietaryRequirement } @@ -23,6 +24,7 @@ export type Application = { university: string | null graduationYear: number | null disciplinesOfStudy: null | DisciplineOfStudy[] + pizzaFlavors: null | PizzaFlavor[] levelOfStudy: | null | "secondary" diff --git a/server/src/routes/application/application-handlers.ts b/server/src/routes/application/application-handlers.ts index 2dbbc257..e91ee277 100644 --- a/server/src/routes/application/application-handlers.ts +++ b/server/src/routes/application/application-handlers.ts @@ -2,6 +2,7 @@ import assert from "node:assert/strict" import { parse as parsePath } from "node:path/posix" import { type DietaryRequirement, dietaryRequirementSchema } from "@durhack/durhack-common/input/dietary-requirement" import { type DisciplineOfStudy, disciplineOfStudySchema } from "@durhack/durhack-common/input/discipline-of-study" +import { type PizzaFlavor, pizzaFlavorSchema } from "@durhack/durhack-common/input/pizza-flavor" import type { Application } from "@durhack/durhack-common/types/application" import { ClientError, HttpStatus } from "@otterhttp/errors" import type { ContentType, ParsedFormFieldFile } from "@otterhttp/parsec" @@ -49,6 +50,13 @@ const personalFormSchema = z.object({ message: "Please select an ethnicity", }) .transform(adaptEthnicityToDatabase), + pizza: z + .array(pizzaFlavorSchema) + .min(1, { message: "Please select at least one pizza flavor." }) + .refine((list) => { + const mutuallyExclusivePreferences = list.filter((item) => item === "alternative" || item === "nothing") + return mutuallyExclusivePreferences.length <= 1 + }, "If you don't want pizza, please choose one of 'nothing' or 'alternative'."), }) const contactFormSchema = z.object({ @@ -154,6 +162,9 @@ class ApplicationHandlers { const dietaryRequirements = userFlags .filter((flag) => flag.flagName.startsWith("dietary-requirement:")) .map((flag) => flag.flagName.slice(20) as DietaryRequirement) + const pizzaFlavors = userFlags + .filter((flag) => flag.flagName.startsWith("pizza-flavor:")) + .map((flag) => flag.flagName.slice(13) as PizzaFlavor) const { phone_number, @@ -190,6 +201,7 @@ class ApplicationHandlers { disciplinesOfStudy: disciplinesOfStudy, tShirtSize: (userInfo?.tShirtSize?.trimEnd() as Application["tShirtSize"] | null | undefined) ?? null, dietaryRequirements: dietaryRequirements, + pizzaFlavors: pizzaFlavors, accessRequirements: userInfo?.accessRequirements ?? null, countryOfResidence: userInfo?.countryOfResidence ?? null, consents: userConsents.map((consent) => ({ name: consent.consentName, choice: consent.choice })), @@ -633,6 +645,16 @@ class ApplicationHandlers { response.sendStatus(200) } } + + @onlyKnownUsers() + patchPizza(): Middleware { + return async (request, _response) => { + const { user } = request + assert(user) + + // Do some magic here + } + } } const applicationHandlers = new ApplicationHandlers()