Skip to content

Commit

Permalink
refactor: generalized formYear to be formStructureId so that forms ca…
Browse files Browse the repository at this point in the history
…n also be created outside hackathons
  • Loading branch information
fvcci committed Oct 2, 2024
1 parent 35ec63b commit e4264b0
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@
CREATE TABLE "FormSubmission" (
"submissionTime" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"status" "Status" NOT NULL DEFAULT 'IN_REVIEW',
"formYear" INT4 NOT NULL,
"formStructureId" STRING NOT NULL,
"submitterId" STRING NOT NULL,

CONSTRAINT "FormSubmission_pkey" PRIMARY KEY ("formYear","submitterId")
CONSTRAINT "FormSubmission_pkey" PRIMARY KEY ("formStructureId","submitterId")
);

-- CreateTable
CREATE TABLE "FormStructureQuestion" (
"formYear" INT4 NOT NULL,
"formStructureId" STRING NOT NULL,
"questionId" STRING NOT NULL,
"displayPriority" INT4 NOT NULL,
"categoryId" STRING NOT NULL,

CONSTRAINT "FormStructureQuestion_pkey" PRIMARY KEY ("formYear","questionId")
CONSTRAINT "FormStructureQuestion_pkey" PRIMARY KEY ("formStructureId","questionId")
);

-- CreateTable
CREATE TABLE "FormStructure" (
"year" INT4 NOT NULL,
"id" STRING NOT NULL,

CONSTRAINT "FormStructure_pkey" PRIMARY KEY ("year")
CONSTRAINT "FormStructure_pkey" PRIMARY KEY ("id")
);

-- CreateTable
Expand Down Expand Up @@ -58,16 +58,16 @@ CREATE TABLE "FormQuestionCategory" (
);

-- CreateIndex
CREATE UNIQUE INDEX "FormStructureQuestion_displayPriority_formYear_key" ON "FormStructureQuestion"("displayPriority", "formYear");
CREATE UNIQUE INDEX "FormStructureQuestion_displayPriority_formStructureId_key" ON "FormStructureQuestion"("displayPriority", "formStructureId");

-- AddForeignKey
ALTER TABLE "FormSubmission" ADD CONSTRAINT "FormSubmission_formYear_fkey" FOREIGN KEY ("formYear") REFERENCES "FormStructure"("year") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "FormSubmission" ADD CONSTRAINT "FormSubmission_formStructureId_fkey" FOREIGN KEY ("formStructureId") REFERENCES "FormStructure"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "FormSubmission" ADD CONSTRAINT "FormSubmission_submitterId_fkey" FOREIGN KEY ("submitterId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "FormStructureQuestion" ADD CONSTRAINT "FormStructureQuestion_formYear_fkey" FOREIGN KEY ("formYear") REFERENCES "FormStructure"("year") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "FormStructureQuestion" ADD CONSTRAINT "FormStructureQuestion_formStructureId_fkey" FOREIGN KEY ("formStructureId") REFERENCES "FormStructure"("id") ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "FormStructureQuestion" ADD CONSTRAINT "FormStructureQuestion_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "Question"("id") ON DELETE CASCADE ON UPDATE CASCADE;
Expand Down
16 changes: 8 additions & 8 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -168,18 +168,18 @@ model FormSubmission {
submissionTime DateTime @default(now())
status Status @default(IN_REVIEW)
formStructure FormStructure @relation(fields: [formYear], references: [year], onDelete: Cascade)
formYear Int
formStructure FormStructure @relation(fields: [formStructureId], references: [id], onDelete: Cascade)
formStructureId String
submitter User @relation(fields: [submitterId], references: [id])
submitterId String
@@id([formYear, submitterId])
@@id([formStructureId, submitterId])
}

model FormStructureQuestion {
formStructure FormStructure @relation(fields: [formYear], references: [year], onDelete: Cascade)
formYear Int
formStructure FormStructure @relation(fields: [formStructureId], references: [id], onDelete: Cascade)
formStructureId String
question Question @relation(fields: [questionId], references: [id], onDelete: Cascade)
questionId String
Expand All @@ -188,12 +188,12 @@ model FormStructureQuestion {
formQuestionCategory FormQuestionCategory @relation(fields: [categoryId], references: [name], onDelete: Cascade)
categoryId String
@@id([formYear, questionId])
@@unique([displayPriority, formYear])
@@id([formStructureId, questionId])
@@unique([displayPriority, formStructureId])
}

model FormStructure {
year Int @id
id String @id @default(cuid())
submissions FormSubmission[]
questionStructures FormStructureQuestion[]
}
Expand Down
86 changes: 42 additions & 44 deletions prisma/seed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -239,37 +239,6 @@ interface FormStructureQuestion {
categoryId: FormQuestionCategoryId;
}

const createFormStructure = async (
year: number,
formStructureQuestions: FormStructureQuestion[]
) => {
await prisma.formStructure.upsert({
where: { year },
update: { year },
create: { year },
});

await Promise.all(
formStructureQuestions.map(async (formQuestionOld, i) => {
const formQuestion = {
...formQuestionOld,
formYear: year,
displayPriority: i,
};
await prisma.formStructureQuestion.upsert({
where: {
formYear_questionId: {
formYear: formQuestion.formYear,
questionId: formQuestion.questionId,
},
},
update: formQuestion,
create: formQuestion,
});
})
);
};

const createDeltahacksXForm = async () => {
const DELTAHACKS_X_FORM_STRUCTURE_QUESTIONS: FormStructureQuestion[] = [
{ questionId: "first_name", categoryId: "Personal Information" },
Expand Down Expand Up @@ -317,27 +286,56 @@ const createDeltahacksXForm = async () => {
{ questionId: "agree_to_mlh_communications", categoryId: "MLH Consent" },
];

await createFormStructure(2024, DELTAHACKS_X_FORM_STRUCTURE_QUESTIONS);
await createFormStructure(
"DeltaHacks X Application Form",
DELTAHACKS_X_FORM_STRUCTURE_QUESTIONS
);
};

const HACKATHON_YEAR_CONFIG = {
id: "hackathonYear",
name: "hackathonYear",
value: "2024",
};
const createFormStructure = async (
deltaHacksApplicationFormName: string,
formStructureQuestions: FormStructureQuestion[]
) => {
await prisma.formStructure.upsert({
where: { id: deltaHacksApplicationFormName },
update: { id: deltaHacksApplicationFormName },
create: { id: deltaHacksApplicationFormName },
});

async function main() {
assert(
parseInt(HACKATHON_YEAR_CONFIG.value) >= 2024,
"No forms in the database exist before 2024"
await Promise.all(
formStructureQuestions.map(async (formQuestionOld, i) => {
const formQuestion = {
...formQuestionOld,
formStructureId: deltaHacksApplicationFormName,
displayPriority: i,
};
await prisma.formStructureQuestion.upsert({
where: {
formStructureId_questionId: {
formStructureId: formQuestion.formStructureId,
questionId: formQuestion.questionId,
},
},
update: formQuestion,
create: formQuestion,
});
})
);
};

const DELTAHACKS_APPLICATION_FORM_CONFIG = {
id: "DeltaHacksApplication",
name: "DeltaHacksApplication",
value: "DeltaHacks X Application Form",
};

async function main() {
await prisma.config.upsert({
where: {
id: HACKATHON_YEAR_CONFIG.id,
id: DELTAHACKS_APPLICATION_FORM_CONFIG.id,
},
create: HACKATHON_YEAR_CONFIG,
update: HACKATHON_YEAR_CONFIG,
create: DELTAHACKS_APPLICATION_FORM_CONFIG,
update: DELTAHACKS_APPLICATION_FORM_CONFIG,
});

await Promise.all(
Expand Down
22 changes: 13 additions & 9 deletions src/server/db/directQueries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@ export class DirectPrismaQuerier {
this.prisma = prisma;
}

async getHackathonYear() {
const hackathonYearConfig = await this.prisma.config.findFirstOrThrow({
where: {
id: "hackathonYear",
},
});
return parseInt(hackathonYearConfig.value);
async getDeltaHacksApplicationFormName() {
const deltaHacksApplicationFormConfig =
await this.prisma.config.findFirstOrThrow({
where: {
id: "DeltaHacksApplication",
},
});
return deltaHacksApplicationFormConfig.value;
}

async hasKilledApplications() {
Expand All @@ -27,9 +28,12 @@ export class DirectPrismaQuerier {
}

async getUserApplication(userId: string) {
const hackathonYear = await this.getHackathonYear();
const formName = await this.getDeltaHacksApplicationFormName();
const userApplication = await this.prisma.formSubmission.findFirst({
where: { formYear: hackathonYear, submitterId: userId },
where: {
formStructureId: formName,
submitterId: userId,
},
});
return userApplication;
}
Expand Down
28 changes: 15 additions & 13 deletions src/server/router/application.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,13 +113,13 @@ export const applicationRouter = router({
);

const directQuerier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await directQuerier.getHackathonYear();
const formName = await directQuerier.getDeltaHacksApplicationFormName();

const statusCount = (
await ctx.prisma.formSubmission.groupBy({
by: ["status"],
where: {
formYear: hackathonYear,
formStructureId: formName,
},
_count: {
status: true,
Expand Down Expand Up @@ -156,17 +156,17 @@ export const applicationRouter = router({
}),
rsvp: protectedProcedure.mutation(async ({ ctx }) => {
const querier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await querier.getHackathonYear();
const formName = await querier.getDeltaHacksApplicationFormName();
const form = await ctx.prisma?.formSubmission.findFirst({
where: { submitterId: ctx.session.user.id, formYear: hackathonYear },
where: { submitterId: ctx.session.user.id, formStructureId: formName },
});

trpcAssert(form?.status !== Status.ACCEPTED, "UNAUTHORIZED");

await ctx.prisma?.formSubmission.update({
where: {
formYear_submitterId: {
formYear: hackathonYear,
formStructureId_submitterId: {
formStructureId: formName,
submitterId: ctx.session.user.id,
},
},
Expand Down Expand Up @@ -202,17 +202,18 @@ export const applicationRouter = router({
.input(applicationSchema)
.mutation(async ({ ctx, input }) => {
const directQuerier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await directQuerier.getHackathonYear();
const deltaHacksApplicationFormName =
await directQuerier.getDeltaHacksApplicationFormName();

const formSubmission = {
formYear: hackathonYear,
formStructureId: deltaHacksApplicationFormName,
submitterId: ctx.session.user.id,
status: Status.IN_REVIEW,
};
await ctx.prisma.formSubmission.upsert({
where: {
formYear_submitterId: {
formYear: formSubmission.formYear,
formStructureId_submitterId: {
formStructureId: formSubmission.formStructureId,
submitterId: formSubmission.submitterId,
},
},
Expand Down Expand Up @@ -498,12 +499,13 @@ export const applicationRouter = router({
trpcAssert(user, "NOT_FOUND");

const querier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await querier.getHackathonYear();
const deltaHacksApplicationFormName =
await querier.getDeltaHacksApplicationFormName();
try {
await ctx.prisma.formSubmission.delete({
where: {
formYear_submitterId: {
formYear: hackathonYear,
formStructureId_submitterId: {
formStructureId: deltaHacksApplicationFormName,
submitterId: ctx.session.user.id,
},
},
Expand Down
23 changes: 13 additions & 10 deletions src/server/router/reviewers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const ApplicationForReview = z.object({
.transform((v) => (v === null ? "" : v)),
}),
status: z.nativeEnum(Status),
formYear: z.number(),
formStructureId: z.string(),
});

export type ApplicationForReview = z.infer<typeof ApplicationForReview>;
Expand All @@ -36,15 +36,16 @@ export const reviewerRouter = router({
);

const querier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await querier.getHackathonYear();
const deltaHacksApplicationFormName =
await querier.getDeltaHacksApplicationFormName();

const application = await ctx.prisma.formSubmission.findMany({
where: {
formYear: hackathonYear,
formStructureId: deltaHacksApplicationFormName,
},
select: {
status: true,
formYear: true,
formStructureId: true,
submitter: {
select: {
id: true,
Expand All @@ -70,11 +71,12 @@ export const reviewerRouter = router({
"UNAUTHORIZED"
);
const querier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await querier.getHackathonYear();
const deltaHacksApplicationFormName =
await querier.getDeltaHacksApplicationFormName();
const application = await ctx.prisma.formSubmission.findUniqueOrThrow({
where: {
formYear_submitterId: {
formYear: hackathonYear,
formStructureId_submitterId: {
formStructureId: deltaHacksApplicationFormName,
submitterId: input.submitterId,
},
},
Expand Down Expand Up @@ -128,12 +130,13 @@ export const reviewerRouter = router({
);

const querier = new DirectPrismaQuerier(ctx.prisma);
const hackathonYear = await querier.getHackathonYear();
const deltaHacksApplicationFormName =
await querier.getDeltaHacksApplicationFormName();

const formSubmission = await prisma?.formSubmission.update({
where: {
formYear_submitterId: {
formYear: hackathonYear,
formStructureId_submitterId: {
formStructureId: deltaHacksApplicationFormName,
submitterId: input.submitterId,
},
},
Expand Down

0 comments on commit e4264b0

Please sign in to comment.