diff --git a/apps/backend/src/app/api/admin/game-session-schedules/[id]/route.ts b/apps/backend/src/app/api/admin/game-session-schedules/[id]/route.ts index b2ebd1e48..aa6974236 100644 --- a/apps/backend/src/app/api/admin/game-session-schedules/[id]/route.ts +++ b/apps/backend/src/app/api/admin/game-session-schedules/[id]/route.ts @@ -14,7 +14,7 @@ class RouteWrapper { * @param params route parameters containing the GameSessionSchedule ID * @returns OK code and the game session schedule data */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -43,7 +43,7 @@ class RouteWrapper { * @param params Route parameters containing the GameSessionSchedule ID. * @returns The updated {@link GameSessionSchedule} document, otherwise an appropriate error response. */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async PATCH(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const parsedBody = UpdateGameSessionScheduleRequestSchema.parse(await req.json()) @@ -81,7 +81,7 @@ class RouteWrapper { * @param params Route parameters containing the GameSessionSchedule ID * @returns No content status code */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params diff --git a/apps/backend/src/app/api/admin/game-session-schedules/route.ts b/apps/backend/src/app/api/admin/game-session-schedules/route.ts index f085d8d7e..ca5cdad4d 100644 --- a/apps/backend/src/app/api/admin/game-session-schedules/route.ts +++ b/apps/backend/src/app/api/admin/game-session-schedules/route.ts @@ -13,7 +13,7 @@ class GameSessionSchedulesRouteWrapper { * @param req The request object containing the request body. * @returns All {@link GameSessionSchedule} documents, otherwise an appropriate error response. */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async GET(req: NextRequest) { try { const { searchParams } = new URL(req.url) @@ -55,7 +55,7 @@ class GameSessionSchedulesRouteWrapper { * @param req The request object containing the request body. * @returns The created {@link GameSessionSchedule} document, otherwise an appropriate error response. */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async POST(req: NextRequest) { try { const parsedBody = CreateGameSessionScheduleRequestSchema.parse(await req.json()) diff --git a/apps/backend/src/app/api/admin/game-sessions/[id]/route.ts b/apps/backend/src/app/api/admin/game-sessions/[id]/route.ts index 6b87b14d9..8671639e6 100644 --- a/apps/backend/src/app/api/admin/game-sessions/[id]/route.ts +++ b/apps/backend/src/app/api/admin/game-sessions/[id]/route.ts @@ -14,7 +14,7 @@ class GameSessionRouteWrapper { * @param params route parameters containing the GameSession ID * @returns No content status code */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -41,7 +41,7 @@ class GameSessionRouteWrapper { * @param req The request object containing the request body * @returns The updated {@link gameSession} document */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async PATCH(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params diff --git a/apps/backend/src/app/api/admin/semesters/[id]/route.ts b/apps/backend/src/app/api/admin/semesters/[id]/route.ts index acfedc084..6c10d4c0d 100644 --- a/apps/backend/src/app/api/admin/semesters/[id]/route.ts +++ b/apps/backend/src/app/api/admin/semesters/[id]/route.ts @@ -13,7 +13,7 @@ class SemesterRouteWrapper { * @param req The request object containing the request body * @returns No content status code */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -37,7 +37,7 @@ class SemesterRouteWrapper { * @param params The route parameters containing the Semester ID * @returns The updated {@link Semester} document */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async PATCH(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params diff --git a/apps/backend/src/app/api/admin/semesters/route.ts b/apps/backend/src/app/api/admin/semesters/route.ts index f3885d757..e3912994a 100644 --- a/apps/backend/src/app/api/admin/semesters/route.ts +++ b/apps/backend/src/app/api/admin/semesters/route.ts @@ -14,7 +14,7 @@ class SemesterRouteWrapper { * @param req The request object containing the request body * @returns The created {@link Semester} document. */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async POST(req: NextRequest) { try { const parsedBody = CreateSemesterRequestSchema.parse(await req.json()) diff --git a/apps/backend/src/app/api/admin/users/[id]/route.test.ts b/apps/backend/src/app/api/admin/users/[id]/route.test.ts index 66056e6f1..4f2a369bb 100644 --- a/apps/backend/src/app/api/admin/users/[id]/route.test.ts +++ b/apps/backend/src/app/api/admin/users/[id]/route.test.ts @@ -80,7 +80,7 @@ describe("/api/admin/users/[id]", async () => { expect(res.status).toBe(StatusCodes.OK) const json = await res.json() expect(json.data.id).toBe(ADMIN_USER_UID) - expect(json.data.role).toBe("admin") + expect(json.data.role).toBe("Admin") expect(consoleErrorSpy).not.toHaveBeenCalled() }) @@ -92,7 +92,7 @@ describe("/api/admin/users/[id]", async () => { expect(res.status).toBe(StatusCodes.OK) const json = await res.json() expect(json.data.id).toBe(CASUAL_USER_UID) - expect(json.data.role).toBe("casual") + expect(json.data.role).toBe("Casual") expect(consoleErrorSpy).not.toHaveBeenCalled() }) @@ -104,7 +104,7 @@ describe("/api/admin/users/[id]", async () => { expect(res.status).toBe(StatusCodes.OK) const json = await res.json() expect(json.data.id).toBe(MEMBER_USER_UID) - expect(json.data.role).toBe("member") + expect(json.data.role).toBe("Member") expect(consoleErrorSpy).not.toHaveBeenCalled() }) diff --git a/apps/backend/src/app/api/admin/users/[id]/route.ts b/apps/backend/src/app/api/admin/users/[id]/route.ts index d50dce85a..5109fd009 100644 --- a/apps/backend/src/app/api/admin/users/[id]/route.ts +++ b/apps/backend/src/app/api/admin/users/[id]/route.ts @@ -14,7 +14,7 @@ class UserRouteWrapper { * @param params The route parameters containing the user ID * @returns The user data if found, otherwise appropriate error response */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async GET(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -41,7 +41,7 @@ class UserRouteWrapper { * @param params The route parameters containing the User ID * @returns The updated User document */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async PATCH(req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params @@ -74,7 +74,7 @@ class UserRouteWrapper { * @param params The route parameters containing the user ID * @returns No content response if successful, otherwise appropriate error response */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async DELETE(_req: NextRequest, { params }: { params: Promise<{ id: string }> }) { try { const { id } = await params diff --git a/apps/backend/src/app/api/admin/users/route.ts b/apps/backend/src/app/api/admin/users/route.ts index 4806bb091..58698cd78 100644 --- a/apps/backend/src/app/api/admin/users/route.ts +++ b/apps/backend/src/app/api/admin/users/route.ts @@ -12,7 +12,7 @@ class UsersRouteWrapper { * @param req The request object containing query parameters for pagination * @returns Paginated user data with proper metadata */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async GET(req: NextRequest) { try { const { searchParams } = new URL(req.url) @@ -45,7 +45,7 @@ class UsersRouteWrapper { * @param req The request object containing the request body * @returns The created {@link User} document. */ - @Security("jwt", ["admin"]) + @Security("jwt", ["ADMIN"]) static async POST(req: NextRequest) { try { const parsedBody = CreateUserRequestSchema.parse(await req.json()) diff --git a/apps/backend/src/app/api/auth/google/callback/route.ts b/apps/backend/src/app/api/auth/google/callback/route.ts index d71072836..87a1587ab 100644 --- a/apps/backend/src/app/api/auth/google/callback/route.ts +++ b/apps/backend/src/app/api/auth/google/callback/route.ts @@ -99,7 +99,7 @@ export const GET = async (req: NextRequest) => { user = await userService.createUser({ firstName: given_name, lastName: family_name, - role: MembershipType.casual, + role: MembershipType.CASUAL, email, }) } else { diff --git a/apps/backend/src/app/api/auth/register/route.ts b/apps/backend/src/app/api/auth/register/route.ts index ce5cacbe1..f6a0b501f 100644 --- a/apps/backend/src/app/api/auth/register/route.ts +++ b/apps/backend/src/app/api/auth/register/route.ts @@ -25,7 +25,7 @@ export const POST = async (req: NextRequest) => { } } - const user = await userDataService.createUser({ ...parsedBody, role: "casual" }) + const user = await userDataService.createUser({ ...parsedBody, role: "Casual" }) const hash = await StandardSecurity.hashPassword(parsedBody.password) await authDataService.createAuth({ email: parsedBody.email, diff --git a/apps/backend/src/data-layer/collections/User.ts b/apps/backend/src/data-layer/collections/User.ts index 3e6bc8760..f5716fd11 100644 --- a/apps/backend/src/data-layer/collections/User.ts +++ b/apps/backend/src/data-layer/collections/User.ts @@ -31,7 +31,7 @@ export const User: CollectionConfig = { type: "select", required: true, options: Object.values(MembershipType), - defaultValue: MembershipType.casual, + defaultValue: MembershipType.CASUAL, admin: { description: "The role of the user", }, diff --git a/packages/shared/src/mocks/User.mock.ts b/packages/shared/src/mocks/User.mock.ts index 935a2d4ed..dc16c76ab 100644 --- a/packages/shared/src/mocks/User.mock.ts +++ b/packages/shared/src/mocks/User.mock.ts @@ -10,7 +10,7 @@ export const casualUserMock: User = { firstName: "straight", lastName: "zhao", email: "straight.zhao@casual.com", - role: MembershipType.casual, + role: MembershipType.CASUAL, remainingSessions: 4, updatedAt: new Date(2025, 0, 1).toISOString(), createdAt: new Date(2025, 0, 1).toISOString(), @@ -21,7 +21,7 @@ export const memberUserMock: User = { firstName: "straight", lastName: "zhao", email: "straight.zhao@member.com", - role: MembershipType.member, + role: MembershipType.MEMBER, remainingSessions: 5, updatedAt: new Date(2025, 0, 1).toISOString(), createdAt: new Date(2025, 0, 1).toISOString(), @@ -32,7 +32,7 @@ export const adminUserMock: User = { firstName: "straight", lastName: "zhao", email: "straight.zhao@admin.com", - role: MembershipType.admin, + role: MembershipType.ADMIN, remainingSessions: 6, updatedAt: new Date(2025, 0, 1).toISOString(), createdAt: new Date(2025, 0, 1).toISOString(), @@ -42,7 +42,7 @@ export const userCreateMock: CreateUserData = { firstName: "straight", lastName: "zhao", email: "straight.zhao@example.com", - role: MembershipType.casual, + role: MembershipType.CASUAL, remainingSessions: 7, image: null, } diff --git a/packages/shared/src/payload-types.ts b/packages/shared/src/payload-types.ts index 905845f19..da30b1c9a 100644 --- a/packages/shared/src/payload-types.ts +++ b/packages/shared/src/payload-types.ts @@ -301,7 +301,7 @@ export interface User { /** * The role of the user */ - role: 'member' | 'casual' | 'admin'; + role: 'Member' | 'Casual' | 'Admin'; /** * The phone number of the user */ diff --git a/packages/shared/src/schemas/user.ts b/packages/shared/src/schemas/user.ts index de667c914..2f336c815 100644 --- a/packages/shared/src/schemas/user.ts +++ b/packages/shared/src/schemas/user.ts @@ -16,7 +16,7 @@ export const UserSchema = z.object({ lastName: z.string().nullable().optional(), email: z.string().email(), // Payload generates a hard coded role type, the `satisfies` operator is used to ensure the type matches - role: z.enum(["admin", "member", "casual"]), + role: z.enum(["Admin", "Member", "Casual"]), remainingSessions: z.number().nullable().optional(), image: z.union([z.string(), MediaSchema]).nullable().optional(), updatedAt: z.string(), diff --git a/packages/shared/src/types/enums.ts b/packages/shared/src/types/enums.ts index e7d2ef04e..ee8715d3f 100644 --- a/packages/shared/src/types/enums.ts +++ b/packages/shared/src/types/enums.ts @@ -1,7 +1,7 @@ export enum MembershipType { - member = "member", - casual = "casual", - admin = "admin", + MEMBER = "Member", + CASUAL = "Casual", + ADMIN = "Admin", } export enum Weekday { diff --git a/packages/ui/src/components/Composite/AdminTable/AdminTable.stories.tsx b/packages/ui/src/components/Composite/AdminTable/AdminTable.stories.tsx index cd8d1a5e4..2af16e26c 100644 --- a/packages/ui/src/components/Composite/AdminTable/AdminTable.stories.tsx +++ b/packages/ui/src/components/Composite/AdminTable/AdminTable.stories.tsx @@ -23,7 +23,7 @@ const mockData = [ id: "1", name: "Alice Smith", email: "alice@example.com", - role: "admin", + role: "Admin", remaining: "10", joined: "2021-01-01", university: "University of Auckland", @@ -33,7 +33,7 @@ const mockData = [ id: "2", name: "Bob Smith", email: "bob@example.com", - role: "casual", + role: "Casual", remaining: "10", joined: "2021-01-01", university: "Auckland University of Technology", @@ -43,7 +43,7 @@ const mockData = [ id: "3", name: "Charlie Smith", email: "charlie@example.com", - role: "member", + role: "Member", remaining: "10", joined: "2021-01-01", university: "Massey University", @@ -53,7 +53,7 @@ const mockData = [ id: "4", name: "David Smith", email: "david@example.com", - role: "casual", + role: "Casual", remaining: "10", joined: "2021-01-01", university: "University of Auckland", @@ -63,7 +63,7 @@ const mockData = [ id: "5", name: "Eve Smith", email: "eve@example.com", - role: "member", + role: "Member", remaining: "10", joined: "2021-01-01", university: "Auckland University of Technology", @@ -73,7 +73,7 @@ const mockData = [ id: "6", name: "Frank Smith", email: "frank@example.com", - role: "casual", + role: "Casual", remaining: "10", joined: "2021-01-01", university: "Massey University", @@ -83,7 +83,7 @@ const mockData = [ id: "7", name: "Grace Smith", email: "grace@example.com", - role: "member", + role: "Member", remaining: "10", joined: "2021-01-01", university: "University of Auckland", @@ -93,7 +93,7 @@ const mockData = [ id: "8", name: "Hank Smith", email: "hank@example.com", - role: "casual", + role: "Casual", remaining: "10", joined: "2021-01-01", university: "Auckland University of Technology", diff --git a/packages/ui/src/components/Composite/AdminTable/AdminTable.test.tsx b/packages/ui/src/components/Composite/AdminTable/AdminTable.test.tsx index a009205cf..d08b0f5ba 100644 --- a/packages/ui/src/components/Composite/AdminTable/AdminTable.test.tsx +++ b/packages/ui/src/components/Composite/AdminTable/AdminTable.test.tsx @@ -7,7 +7,7 @@ const mockData = [ id: "1", name: "Alice Smith", email: "alice@example.com", - role: "member", + role: "Member", remaining: "10", university: "University of Auckland", joined: "2021-01-01", @@ -17,7 +17,7 @@ const mockData = [ id: "2", name: "Bob Smith", email: "bob@example.com", - role: "member", + role: "Member", remaining: "10", university: "University of Auckland", joined: "2021-01-01", @@ -27,7 +27,7 @@ const mockData = [ id: "3", name: "Charlie Smith", email: "charlie@example.com", - role: "member", + role: "Member", remaining: "10", university: "University of Auckland", joined: "2021-01-01", diff --git a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.stories.tsx b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.stories.tsx index bf4cb5f85..61a74ce20 100644 --- a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.stories.tsx +++ b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.stories.tsx @@ -35,7 +35,7 @@ export const Default: Story = {} export const Casual: Story = { parameters: { query: { - "booking-confirmed-popup-value": MembershipType.casual, + "booking-confirmed-popup-value": MembershipType.CASUAL, }, }, } diff --git a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.test.tsx b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.test.tsx index 1d6a39e72..3b1f7eb22 100644 --- a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.test.tsx +++ b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.test.tsx @@ -36,7 +36,7 @@ describe("", () => { wrapper: withNuqsTestingAdapter({ searchParams: { "booking-confirmed-popup": "open", - "booking-confirmed-popup-value": MembershipType.casual, + "booking-confirmed-popup-value": MembershipType.CASUAL, }, }), }) diff --git a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.tsx b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.tsx index cb01e30d5..33d8c99e7 100644 --- a/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.tsx +++ b/packages/ui/src/components/Composite/BookingConfirmedPopup/BookingConfirmedPopup.tsx @@ -51,7 +51,7 @@ export const BookingConfirmedPopup: FC = ({ title, message, additionalMessage, - initialValue = MembershipType.member, + initialValue = MembershipType.MEMBER, linkText = "View Booking", ...props }) => { @@ -68,7 +68,7 @@ export const BookingConfirmedPopup: FC = ({ {message} - {value === MembershipType.casual && additionalMessage && {additionalMessage}} + {value === MembershipType.CASUAL && additionalMessage && {additionalMessage}}