From 0778f7ed06428a7f1c68a09332068c9ba0ef44ea Mon Sep 17 00:00:00 2001 From: dasher1505 Date: Thu, 21 May 2026 14:59:46 +1200 Subject: [PATCH 1/5] added memberRepository.ts --- src/repositories/memberRepository.ts | 59 ++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/repositories/memberRepository.ts diff --git a/src/repositories/memberRepository.ts b/src/repositories/memberRepository.ts new file mode 100644 index 0000000..120764c --- /dev/null +++ b/src/repositories/memberRepository.ts @@ -0,0 +1,59 @@ +import { getPrisma } from "../lib/db/prisma"; + +export async function createMembershipRegistration( + registration: MemberRegistration, +) { + const memberData = toMemberCreateInput(registration); + + try { + await getPrisma().member.create({ data: memberData }); + return Response.json({ ok: true }); + } catch (error: unknown) { + if (error instanceof PrismaClientKnownRequestError) { + if (error.code === "P2002") { + return Response.json({ ok: false, error: { type: "duplicate" } }); + } + } + + return Response.json({ ok: false, error: { type: "database" } }); + } +} + +function toMemberCreateInput(registration: MemberRegistration) { + const memberData = { + // unconditonal fields + firstName: registration.firstName, + lastName: registration.lastName, + email: registration.email, + linuxSkillLevel: registration.linuxSkillLevel, + potentialInvolvement: registration.potentialInvolvement, + discordUsername: registration.discordUsername, + + // shared conditional fields + isConditionalReturningMember: registration.isEligibleReturningUoaStudent, + isCurrentUoaStudent: registration.isCurrentUoaStudent, + }; + + const conditionalData = // non-shared conditional fields + registration instanceof CurrentUoaStudentMember + ? { + faculty: registration.faculty, + programme: registration.programme, + yearLevel: registration.yearLevel, + upi: registration.upi, + studentId: registration.studentId, + } + : registration instanceof ConditionalReturningMember + ? { + faculty: [], + upi: registration.upi, + studentId: registration.studentId, + } + : { + faculty: [], + primaryAffiliation: registration.primaryAffiliation, + nonUoaExcerpt: registration.nonUoaExcerpt, + nonUoaPitch: registration.nonUoaPitch, + }; + return { memberData, conditionalData }; +} From 106b482e1bc50177e0bdfb0df612a96b345d05b7 Mon Sep 17 00:00:00 2001 From: dasher1505 Date: Thu, 28 May 2026 01:06:19 +1200 Subject: [PATCH 2/5] fix(registration): update code to fit with pr change requests --- src/repositories/memberRepository.ts | 32 ++++++++++++++++------------ 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/repositories/memberRepository.ts b/src/repositories/memberRepository.ts index 120764c..c295764 100644 --- a/src/repositories/memberRepository.ts +++ b/src/repositories/memberRepository.ts @@ -4,22 +4,23 @@ export async function createMembershipRegistration( registration: MemberRegistration, ) { const memberData = toMemberCreateInput(registration); - try { await getPrisma().member.create({ data: memberData }); - return Response.json({ ok: true }); + return { ok: true }; } catch (error: unknown) { if (error instanceof PrismaClientKnownRequestError) { if (error.code === "P2002") { - return Response.json({ ok: false, error: { type: "duplicate" } }); + return { ok: false, error: { type: "duplicate" } }; } } - return Response.json({ ok: false, error: { type: "database" } }); + return { ok: false, error: { type: "database" } }; } } -function toMemberCreateInput(registration: MemberRegistration) { +function toMemberCreateInput( + registration: MemberRegistration, +): MemberCreateInput { const memberData = { // unconditonal fields firstName: registration.firstName, @@ -29,31 +30,34 @@ function toMemberCreateInput(registration: MemberRegistration) { potentialInvolvement: registration.potentialInvolvement, discordUsername: registration.discordUsername, - // shared conditional fields + // shared conditional field isConditionalReturningMember: registration.isEligibleReturningUoaStudent, - isCurrentUoaStudent: registration.isCurrentUoaStudent, }; const conditionalData = // non-shared conditional fields - registration instanceof CurrentUoaStudentMember + registration.isEligibleReturningUoaStudent === true ? { - faculty: registration.faculty, - programme: registration.programme, - yearLevel: registration.yearLevel, + faculty: [], upi: registration.upi, studentId: registration.studentId, + isCurrentUoaStudent: registration.isCurrentUoaStudent, } - : registration instanceof ConditionalReturningMember + : registration.isCurrentUoaStudent === true ? { - faculty: [], + faculty: registration.faculty, + programme: registration.programme, + yearLevel: registration.yearLevel, upi: registration.upi, studentId: registration.studentId, + isCurrentUoaStudent: registration.isCurrentUoaStudent, } : { faculty: [], primaryAffiliation: registration.primaryAffiliation, nonUoaExcerpt: registration.nonUoaExcerpt, nonUoaPitch: registration.nonUoaPitch, + isCurrentUoaStudent: registration.isCurrentUoaStudent, }; - return { memberData, conditionalData }; + + return { ...memberData, ...conditionalData }; } From c01e17e18dc442dda84ae9c449c572ba9934f1f7 Mon Sep 17 00:00:00 2001 From: dasher1505 Date: Sat, 11 Jul 2026 15:44:14 +1200 Subject: [PATCH 3/5] resolve pr issues --- src/repositories/memberRepository.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/repositories/memberRepository.ts b/src/repositories/memberRepository.ts index c295764..93378f3 100644 --- a/src/repositories/memberRepository.ts +++ b/src/repositories/memberRepository.ts @@ -1,8 +1,12 @@ import { getPrisma } from "../lib/db/prisma"; +type CreateMembershipRegistration = + | { ok: true } + | { ok: false; error: { type: "duplicate" | "database" } }; + export async function createMembershipRegistration( registration: MemberRegistration, -) { +): Promise { const memberData = toMemberCreateInput(registration); try { await getPrisma().member.create({ data: memberData }); @@ -22,7 +26,7 @@ function toMemberCreateInput( registration: MemberRegistration, ): MemberCreateInput { const memberData = { - // unconditonal fields + // Unconditional fields firstName: registration.firstName, lastName: registration.lastName, email: registration.email, @@ -30,17 +34,15 @@ function toMemberCreateInput( potentialInvolvement: registration.potentialInvolvement, discordUsername: registration.discordUsername, - // shared conditional field - isConditionalReturningMember: registration.isEligibleReturningUoaStudent, + // Shared conditional field + isConditionalReturningMember: registration.isConditionalReturningMember, }; - const conditionalData = // non-shared conditional fields - registration.isEligibleReturningUoaStudent === true + const conditionalData = // Non-shared conditional fields + registration.isConditionalReturningMember === true ? { - faculty: [], upi: registration.upi, studentId: registration.studentId, - isCurrentUoaStudent: registration.isCurrentUoaStudent, } : registration.isCurrentUoaStudent === true ? { From c82a8ad1b80d6c415ec68939b0d64a0002446803 Mon Sep 17 00:00:00 2001 From: William Tay Date: Mon, 13 Jul 2026 05:07:04 +1200 Subject: [PATCH 4/5] fix: add imports to member repository --- src/repositories/memberRepository.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/repositories/memberRepository.ts b/src/repositories/memberRepository.ts index 93378f3..7c1fa4b 100644 --- a/src/repositories/memberRepository.ts +++ b/src/repositories/memberRepository.ts @@ -1,4 +1,6 @@ import { getPrisma } from "../lib/db/prisma"; +import { MemberRegistration } from "@/domain/member/types"; +import { Prisma } from "@/generated/prisma/client"; type CreateMembershipRegistration = | { ok: true } @@ -12,7 +14,7 @@ export async function createMembershipRegistration( await getPrisma().member.create({ data: memberData }); return { ok: true }; } catch (error: unknown) { - if (error instanceof PrismaClientKnownRequestError) { + if (error instanceof Prisma.PrismaClientKnownRequestError) { if (error.code === "P2002") { return { ok: false, error: { type: "duplicate" } }; } @@ -24,7 +26,7 @@ export async function createMembershipRegistration( function toMemberCreateInput( registration: MemberRegistration, -): MemberCreateInput { +): Prisma.MemberCreateInput { const memberData = { // Unconditional fields firstName: registration.firstName, From 9fbef248cd61319aeefd07e34f736f633eccbf85 Mon Sep 17 00:00:00 2001 From: William Tay Date: Mon, 13 Jul 2026 05:09:50 +1200 Subject: [PATCH 5/5] chore: rename type and move comment --- src/repositories/memberRepository.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/repositories/memberRepository.ts b/src/repositories/memberRepository.ts index 7c1fa4b..c2ef56f 100644 --- a/src/repositories/memberRepository.ts +++ b/src/repositories/memberRepository.ts @@ -2,13 +2,13 @@ import { getPrisma } from "../lib/db/prisma"; import { MemberRegistration } from "@/domain/member/types"; import { Prisma } from "@/generated/prisma/client"; -type CreateMembershipRegistration = +type CreateMembershipRegistrationResult = | { ok: true } | { ok: false; error: { type: "duplicate" | "database" } }; export async function createMembershipRegistration( registration: MemberRegistration, -): Promise { +): Promise { const memberData = toMemberCreateInput(registration); try { await getPrisma().member.create({ data: memberData }); @@ -40,7 +40,8 @@ function toMemberCreateInput( isConditionalReturningMember: registration.isConditionalReturningMember, }; - const conditionalData = // Non-shared conditional fields + // Non-shared conditional fields + const conditionalData = registration.isConditionalReturningMember === true ? { upi: registration.upi,