From 2c1fa7fa15aba23f494e3829b54a47829001c79a Mon Sep 17 00:00:00 2001 From: ManasC478 Date: Tue, 18 Feb 2025 22:28:42 -0800 Subject: [PATCH] feat: check if authenticated user subscribed or bookmarked --- server/src/router/v1/users.ts | 178 ++++++++++++++++++++++++++++++---- 1 file changed, 160 insertions(+), 18 deletions(-) diff --git a/server/src/router/v1/users.ts b/server/src/router/v1/users.ts index bcc58e3..b6f331c 100644 --- a/server/src/router/v1/users.ts +++ b/server/src/router/v1/users.ts @@ -4,11 +4,11 @@ import { authMiddleWare } from '@/middlewares/auth-middleware'; import * as HttpStatusCodes from 'stoker/http-status-codes'; import { users, events, subscribedCompanies, companies, subscribedEvents, equipmentRentalType, equipmentItem, equipmentRentals, userRoleEnum, equipmentConditionEnum, bookmarkedEvents } from '@/db/schema'; import { db } from '@/db/db'; -import { eq, getTableColumns } from 'drizzle-orm'; +import { eq, getTableColumns, and } from 'drizzle-orm'; import { unauthorizedRequest } from '@/middlewares/auth-middleware'; import type { User, Event, Company } from '@/db/schema'; import type { Context } from '@/lib/context'; -import { userSchema, companySchema, bookmarkSchema, updateUserSchema, userIdSchema, eventSchema } from '@/util/zod'; +import { userSchema, companySchema, bookmarkSchema, updateUserSchema, userIdSchema, eventSchema, eventIDSchema, companyIDSchema } from '@/util/zod'; const userRouter = new OpenAPIHono(); @@ -243,18 +243,20 @@ userRouter.openapi( userRouter.openapi( createRoute({ method: 'get', - path: '/my/subscriptions', + path: '/my/bookmarked/{eventID}', tags: ['users'], - summary: 'Get current user\'s subscriptions', + summary: 'Check if current user has bookmarked an event', middleware: [authMiddleWare('user')], + request: { + params: eventIDSchema, + }, responses: { [HttpStatusCodes.OK]: { description: 'Successful response', content: { 'application/json': { schema: z.object({ - companies: z.array(companySchema), - events: z.array(eventSchema), + bookmarked: z.boolean(), }), }, }, @@ -267,13 +269,42 @@ userRouter.openapi( if (!session) { return c.json({ error: 'Unauthorized' }, HttpStatusCodes.UNAUTHORIZED); } + const { eventID } = c.req.valid('param'); + const bookmark = await db + .select() + .from(bookmarkedEvents) + .where(and(eq(bookmarkedEvents.userId, session.userId), eq(bookmarkedEvents.eventId, parseInt(eventID)))); - // Get subscribed companies - const foundSubscribedCompanies: Company[] = await db - .select(getTableColumns(companies)) - .from(subscribedCompanies) - .innerJoin(companies, eq(companies.id, subscribedCompanies.companyId)) - .where(eq(subscribedCompanies.userId, session.userId)); + return c.json({ bookmarked: bookmark.length > 0 }, HttpStatusCodes.OK); + }, +); + +userRouter.openapi( + createRoute({ + method: 'get', + path: '/my/subscribed-events', + tags: ['users'], + summary: 'Get authenticated user\'s subscribed events', + middleware: [authMiddleWare('user')], + responses: { + [HttpStatusCodes.OK]: { + description: 'Successful response', + content: { + 'application/json': { + schema: z.object({ + events: z.array(eventSchema), + }), + }, + }, + }, + ...unauthorizedRequest, + }, + }), + async (c) => { + const session = c.get('session'); + if (!session) { + return c.json({ error: 'Unauthorized' }, HttpStatusCodes.UNAUTHORIZED); + } // Get subscribed events const foundSubscribedEvents: Event[] = await db @@ -281,20 +312,131 @@ userRouter.openapi( .from(subscribedEvents) .innerJoin(events, eq(events.id, subscribedEvents.eventId)) .where(eq(subscribedEvents.userId, session.userId)); + + return c.json({ + events: foundSubscribedEvents, + }, HttpStatusCodes.OK); + }, +); - // Format events to match schema - const formattedEvents = foundSubscribedEvents.map(event => ({ - ...event, - createdAt: event.createdAt.toISOString(), - })); +userRouter.openapi( + createRoute({ + method: 'get', + path: '/my/subscribed-events/{eventID}', + tags: ['users'], + summary: 'Check if current user has subscribed to an event', + middleware: [authMiddleWare('user')], + request: { + params: eventIDSchema, + }, + responses: { + [HttpStatusCodes.OK]: { + description: 'Successful response', + content: { + 'application/json': { + schema: z.object({ + subscribed: z.boolean(), + }), + }, + }, + }, + ...unauthorizedRequest, + }, + }), + async (c) => { + const session = c.get('session'); + if (!session) { + return c.json({ error: 'Unauthorized' }, HttpStatusCodes.UNAUTHORIZED); + } + const { eventID } = c.req.valid('param'); + const sub = await db + .select() + .from(subscribedEvents) + .where(and(eq(subscribedEvents.userId, session.userId), eq(subscribedEvents.eventId, parseInt(eventID)))); + + return c.json({ subscribed: sub.length > 0 }, HttpStatusCodes.OK); + }, +); + +userRouter.openapi( + createRoute({ + method: 'get', + path: '/my/subscribed-companies', + tags: ['users'], + summary: 'Get authenticated user\'s subscribed companies', + middleware: [authMiddleWare('user')], + responses: { + [HttpStatusCodes.OK]: { + description: 'Successful response', + content: { + 'application/json': { + schema: z.object({ + companies: z.array(companySchema), + }), + }, + }, + }, + ...unauthorizedRequest, + }, + }), + async (c) => { + const session = c.get('session'); + if (!session) { + return c.json({ error: 'Unauthorized' }, HttpStatusCodes.UNAUTHORIZED); + } + + // Get subscribed companies + const foundSubscribedCompanies: Company[] = await db + .select(getTableColumns(companies)) + .from(subscribedCompanies) + .innerJoin(companies, eq(companies.id, subscribedCompanies.companyId)) + .where(eq(subscribedCompanies.userId, session.userId)); return c.json({ companies: foundSubscribedCompanies, - events: formattedEvents, }, HttpStatusCodes.OK); }, ); +userRouter.openapi( + createRoute({ + method: 'get', + path: '/my/subscribed-companies/{companyID}', + tags: ['users'], + summary: 'Check if current user has subscribed to a company', + middleware: [authMiddleWare('user')], + request: { + params: companyIDSchema, + }, + responses: { + [HttpStatusCodes.OK]: { + description: 'Successful response', + content: { + 'application/json': { + schema: z.object({ + subscribed: z.boolean(), + }), + }, + }, + }, + ...unauthorizedRequest, + }, + }), + async (c) => { + const session = c.get('session'); + if (!session) { + return c.json({ error: 'Unauthorized' }, HttpStatusCodes.UNAUTHORIZED); + } + const { companyID } = c.req.valid('param'); + const sub = await db + .select() + .from(subscribedCompanies) + .where(and(eq(subscribedCompanies.userId, session.userId), eq(subscribedCompanies.companyId, parseInt(companyID)))); + + return c.json({ subscribed: sub.length > 0 }, HttpStatusCodes.OK); + }, +); + userRouter.openapi( createRoute({ method: 'get',