From 67cfbf98c0975d0bd0bb187c604a6ea2b6d005ab Mon Sep 17 00:00:00 2001 From: ManasC478 <85337436+ManasC478@users.noreply.github.com> Date: Tue, 11 Feb 2025 18:33:04 -0800 Subject: [PATCH 1/4] fix: redirect onboarding if new user (#78) * fix: redirect onboarding if new user * fix: lint fix --- server/src/router/v1/auth.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/router/v1/auth.ts b/server/src/router/v1/auth.ts index 37f41c8..0dbd4d5 100644 --- a/server/src/router/v1/auth.ts +++ b/server/src/router/v1/auth.ts @@ -149,6 +149,7 @@ authRouter.openapi( await db.select().from(users).where(eq(users.email, email)) )?.[0]; let user = existingUser; + let redirectPath = '/'; if (!existingUser) { const newUser = await db .insert(users) @@ -166,12 +167,13 @@ authRouter.openapi( .returning(); user = newUser[0]; + redirectPath = '/onboarding'; } const session = await lucia.createSession(user.id, {}); const sessionCookie = lucia.createSessionCookie(session.id).serialize(); c.header('Set-Cookie', sessionCookie, { append: true }); - return c.redirect('/'); + return c.redirect(redirectPath); } catch (error) { console.error(error); return c.json( From 0ee807c88ab5bfa4fb2e26fb3dc95caef19a63f0 Mon Sep 17 00:00:00 2001 From: kevintsoii Date: Tue, 18 Feb 2025 23:12:51 -0800 Subject: [PATCH 2/4] add query params to events --- server/src/router/v1/events.ts | 35 ++++++++++++++++++++++++++++++++-- server/src/util/zod.ts | 5 +++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/server/src/router/v1/events.ts b/server/src/router/v1/events.ts index 33489ab..46b551f 100644 --- a/server/src/router/v1/events.ts +++ b/server/src/router/v1/events.ts @@ -15,7 +15,7 @@ import { urls, bookmarkedEvents, } from '@/db/schema'; -import { eq, count, getTableColumns, and } from 'drizzle-orm'; +import { eq, count, getTableColumns, and, lt, gt, arrayContains } from 'drizzle-orm'; import type { User, Company, File, Event, Url } from '@/db/schema'; import { authMiddleWare, @@ -29,6 +29,8 @@ import { userSchema, fileSchema, eventSchema, + csFieldsEnumSchema, + timestampEnumSchema, } from '@/util/zod'; const eventRouter = new OpenAPIHono(); @@ -186,6 +188,12 @@ eventRouter.openapi( path: '/', tags: ['events'], summary: 'List all events', + request: { + query: z.object({ + tags: z.string().optional(), + timeframe: timestampEnumSchema.optional(), + }), + }, responses: { [HttpStatusCodes.OK]: { content: { @@ -200,7 +208,30 @@ eventRouter.openapi( }, }), async (c) => { - const foundEvents: Event[] = await db.select().from(events); + const { tags = '', timeframe = 'all' } = c.req.valid('query'); + + const conditions = []; + + if (timeframe !== 'all') { + const today = new Date().toISOString().split('T')[0]; + + conditions.push( + timeframe === 'upcoming' ? gt(events.startDate, today) : + timeframe === 'past' ? lt(events.startDate, today) : + eq(events.startDate, today), + ); + } + + const validTags = tags + .split(',') + .filter(tag => csFieldsEnumSchema._def.values.includes(tag as z.infer)) + .map(tag => tag as z.infer); + + if (tags?.length > 0) { + conditions.push(arrayContains(events.tags, validTags)); + } + + const foundEvents: Event[] = await db.select().from(events).where(and(...conditions)); return c.json({ foundEvents }, HttpStatusCodes.OK); }, ); diff --git a/server/src/util/zod.ts b/server/src/util/zod.ts index da803f2..4698ab1 100644 --- a/server/src/util/zod.ts +++ b/server/src/util/zod.ts @@ -1,7 +1,6 @@ import { createSelectSchema } from 'drizzle-zod'; -import { educationLevelEnum, bookmarkedEvents, projects, users, events, subscribedCompanies, majors, companies, equipmentRentalType, equipmentItem, equipmentRentals, files, sponsors, officers } from '@/db/schema'; +import { educationLevelEnum, bookmarkedEvents, projects, users, events, subscribedCompanies, majors, companies, equipmentRentalType, equipmentItem, equipmentRentals, files, sponsors, officers, csFieldsEnum } from '@/db/schema'; -import { csFieldsEnum } from '@/db/schema'; import { z } from 'zod'; export const companySchema = createSelectSchema(companies); @@ -13,6 +12,8 @@ export const eventSchema = createSelectSchema(events).extend({ tags: z.array(z.enum(csFieldsEnum.enumValues)), urls: z.array(z.string()), }); +export const csFieldsEnumSchema = z.enum(csFieldsEnum.enumValues); +export const timestampEnumSchema = z.enum(['upcoming', 'today', 'past', 'all']); export const userSchema = createSelectSchema(users).extend({ interests: z.array(z.enum(csFieldsEnum.enumValues)), }); From 3816f8a1c8b0a0806fb9bb0d59fe7ee789c60e9b Mon Sep 17 00:00:00 2001 From: ManasC478 <85337436+ManasC478@users.noreply.github.com> Date: Wed, 19 Feb 2025 09:57:34 -0800 Subject: [PATCH 3/4] feat: check if authenticated user subscribed or bookmarked (#84) --- 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', From 5d13b4a8b92919cc0f8da63354d1ad23bf598e1b Mon Sep 17 00:00:00 2001 From: ManasC478 <85337436+ManasC478@users.noreply.github.com> Date: Thu, 20 Feb 2025 20:55:34 -0800 Subject: [PATCH 4/4] feat: auto-generate types (#86) --- client/package.json | 3 +- client/src/types/schema.v1.d.ts | 3304 +++++++++++++++++++++++++++++++ 2 files changed, 3306 insertions(+), 1 deletion(-) create mode 100644 client/src/types/schema.v1.d.ts diff --git a/client/package.json b/client/package.json index 0dd47ab..73bb9b8 100644 --- a/client/package.json +++ b/client/package.json @@ -9,7 +9,8 @@ "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview", - "typecheck": "tsc --noEmit --skipLibCheck" + "typecheck": "tsc --noEmit --skipLibCheck", + "generate-types": "npx openapi-typescript http://localhost/api/docs -o src/types/schema.v1.d.ts" }, "dependencies": { "@hookform/resolvers": "^3.9.0", diff --git a/client/src/types/schema.v1.d.ts b/client/src/types/schema.v1.d.ts new file mode 100644 index 0000000..742c1a0 --- /dev/null +++ b/client/src/types/schema.v1.d.ts @@ -0,0 +1,3304 @@ +/** + * This file was auto-generated by openapi-typescript. + * Do not make direct changes to the file. + */ + +export interface paths { + "/api/v1/auth/login": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Initiate Google OAuth login */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Redirect to Google OAuth */ + 301: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Google OAuth not configured */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/auth/callback": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Handle Google OAuth callback */ + get: { + parameters: { + query: { + code: string; + state: string; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Redirect after successful login */ + 301: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Missing code or state */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Failed to validate authorization code */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/auth/logout": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Logout user */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Redirect after logout */ + 301: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin List all users */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + users: { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get current user */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + /** Update current user */ + put: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + major?: string; + gradDate?: string | null; + interests?: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string} */ + education_level?: "undergraduate" | "graduate"; + discord?: string; + linkedin?: string; + github?: string; + website?: string; + }; + }; + }; + responses: { + /** @description Successfully updated user */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/rental-history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get current user's equipment rental history */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + rentals: { + itemId: number; + dateBorrowed: string; + returnDate: string; + price: number; + /** @enum {string} */ + condition: "ready" | "broken" | "in maintenance"; + equipmentType: { + name: string; + description: string | null; + }; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/bookmarks": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get current user's bookmarks */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + bookmarks: { + userId: string; + eventId: number; + bookmarkedDate: string; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/bookmarked/{eventID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Check if current user has bookmarked an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + bookmarked: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/subscribed-events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get authenticated user's subscribed events */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + events: { + id: number; + createdAt: string; + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/subscribed-events/{eventID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Check if current user has subscribed to an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + subscribed: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/subscribed-companies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get authenticated user's subscribed companies */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + companies: { + id: number; + name: string; + location: string | null; + description: string; + /** @enum {string} */ + industryId: "banking and finance" | "aerospace" | "healthcare" | "automotive" | "energy" | "technology"; + logo: string | null; + }[]; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/my/subscribed-companies/{companyID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Check if current user has subscribed to a company */ + get: { + parameters: { + query?: never; + header?: never; + path: { + companyID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + subscribed: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/users/{userId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Admin Get a user by ID */ + get: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description User not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + /** Admin Update a user */ + put: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + major?: string; + gradDate?: string | null; + interests?: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string} */ + education_level?: "undergraduate" | "graduate"; + discord?: string; + linkedin?: string; + github?: string; + website?: string; + /** @enum {string} */ + role?: "user" | "member" | "admin"; + }; + }; + }; + responses: { + /** @description Successfully updated user */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description User not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + post?: never; + /** Admin Delete a user */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + userId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted user */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description User not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/projects": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all projects */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + projects: { + id: number; + name: string; + description: string; + /** @enum {string} */ + status: "not started" | "looking for members" | "in progress" | "completed"; + githubLink: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + /** Creates a new project */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + name: string; + description: string; + /** @enum {string} */ + status: "not started" | "looking for members" | "in progress" | "completed"; + githubLink: string | null; + }; + }; + }; + responses: { + /** @description Successful response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + project: { + id: number; + name: string; + description: string; + /** @enum {string} */ + status: "not started" | "looking for members" | "in progress" | "completed"; + githubLink: string | null; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/projects/{projectID}/interested": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all interested users for a project */ + get: { + parameters: { + query?: never; + header?: never; + path: { + projectID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + interestedUsers: { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/projects/{projectID}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all files for a project */ + get: { + parameters: { + query?: never; + header?: never; + path: { + projectID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + projectFiles: { + key: string; + name: string; + createdAt: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/companies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all companies for an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + foundEventCompanies: { + id: number; + name: string; + location: string | null; + description: string; + /** @enum {string} */ + industryId: "banking and finance" | "aerospace" | "healthcare" | "automotive" | "energy" | "technology"; + logo: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/subscribers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all subscribers for an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + eventSubscribers: { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/subscribers/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get the number of subscribers for an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + subscribersCount: number; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/files": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all files for an event */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + eventFiles: { + key: string; + name: string; + createdAt: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all events */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + foundEvents: { + id: number; + createdAt: string; + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }[]; + }; + }; + }; + }; + }; + put?: never; + /** Create an event */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }; + }; + }; + responses: { + /** @description Successful response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + event: { + id: number; + createdAt: string; + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List event information */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + foundEvent: { + id: number; + createdAt: string; + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }; + }; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/subscribe": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** User subscribes to an event */ + post: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + newSubscription: { + userId: string; + eventId: number; + subscribedDate: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + /** User unsubscribes to an event */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + deletedSubscription: { + userId: string; + eventId: number; + subscribedDate: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/url": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Fetch event URL */ + get: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + url: { + id: number; + originalUrl: string; + shortUrl: string; + }; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/events/{eventID}/bookmark": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** User bookmarks an event */ + post: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + newBookmark: { + userId: string; + eventId: number; + bookmarkedDate: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + /** User unbookmarks an event */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + eventID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + deletedBookmark: { + userId: string; + eventId: number; + bookmarkedDate: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Not Found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/companies": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all companies */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + companies: { + id: number; + name: string; + location: string | null; + description: string; + /** @enum {string} */ + industryId: "banking and finance" | "aerospace" | "healthcare" | "automotive" | "energy" | "technology"; + logo: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + /** Creates a new company */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + name: string; + location: string | null; + description: string; + /** @enum {string} */ + industryId: "banking and finance" | "aerospace" | "healthcare" | "automotive" | "energy" | "technology"; + logo: string | null; + }; + }; + }; + responses: { + /** @description Successful response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + company: { + id: number; + name: string; + location: string | null; + description: string; + /** @enum {string} */ + industryId: "banking and finance" | "aerospace" | "healthcare" | "automotive" | "energy" | "technology"; + logo: string | null; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/companies/subscribe": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Subscribe to a company */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + companyId: string; + }; + }; + }; + responses: { + /** @description Successfully subscribed */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + subscription: { + userId: string; + companyId: number; + subscribedDate: string; + }; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Already subscribed */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + /** Unsubscribe from a company */ + delete: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + companyId: number; + }; + }; + }; + responses: { + /** @description Successfully unsubscribed */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + message: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/companies/{companyID}/events": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all events for a company */ + get: { + parameters: { + query?: never; + header?: never; + path: { + companyID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + companyEvents: { + id: number; + createdAt: string; + name: string; + location: string; + startDate: string; + endDate: string; + description: string; + urls: string[]; + /** @enum {string} */ + eventType: "workshop" | "seminar" | "hackathon" | "conference" | "meetup" | "test" | "other"; + eventCapacity: number | null; + image: string; + startTime: string; + endTime: string; + tags: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + /** @enum {string|null} */ + targetAudience: "students" | null; + shortenedEventUrl: number | null; + memberOnly: boolean; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/companies/{companyID}/subscribers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all subscribers for a company */ + get: { + parameters: { + query?: never; + header?: never; + path: { + companyID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + companySubscribers: { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/companies/{companyID}/subscribers/count": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get the number of subscribers for a company */ + get: { + parameters: { + query?: never; + header?: never; + path: { + companyID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + subscribersCount: number; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/types": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List of all equipment types */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + equipmentTypes: { + id: number; + createdAt: string; + name: string; + price: string; + image: string | null; + description: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/rentals": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Rent an equipment item */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + itemId: number; + userId: string | null; + dateBorrowed: string; + returnDate: string; + price: string; + /** @enum {string} */ + condition: "ready" | "broken" | "in maintenance"; + }; + }; + }; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + itemId: number; + userId: string | null; + dateBorrowed: string; + returnDate: string; + price: string; + /** @enum {string} */ + condition: "ready" | "broken" | "in maintenance"; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/type": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create a new equipment type */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + createdAt: string; + name: string; + price: string; + image: string | null; + description: string | null; + }; + }; + }; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: number; + createdAt: string; + name: string; + price: string; + image: string | null; + description: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/type/{equipmentTypeID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Delete an equipment type */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + equipmentTypeID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted user */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/type/{equipmentTypeId}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** Update an equipment type */ + put: { + parameters: { + query?: never; + header?: never; + path: { + equipmentTypeId: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + createdAt: string; + name: string; + price: string; + image: string | null; + description: string | null; + }; + }; + }; + responses: { + /** @description Successfully updated equipment type */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: number; + createdAt: string; + name: string; + price: string; + image: string | null; + description: string | null; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/type/{equipmentTypeId}/item": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List of all equipment items for a type */ + get: { + parameters: { + query?: never; + header?: never; + path: { + equipmentTypeId: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + equipmentItems: { + id: number; + createdAt: string; + equipmentType: number; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/item/{equipmentItemID}/rental-history": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Lists rental history for an equipment item */ + get: { + parameters: { + query?: never; + header?: never; + path: { + equipmentItemID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + rentalHistory: { + itemId: number; + userId: string | null; + dateBorrowed: string; + returnDate: string; + price: string; + /** @enum {string} */ + condition: "ready" | "broken" | "in maintenance"; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/item": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** Create a new equipment item */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + createdAt: string; + equipmentType: number; + }; + }; + }; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: number; + createdAt: string; + equipmentType: number; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/equipments/item/{equipmentItemID}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** Update an equipment item */ + put: { + parameters: { + query?: never; + header?: never; + path: { + equipmentItemID: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + id: number; + createdAt: string; + equipmentType: number; + }; + }; + }; + responses: { + /** @description Successfully updated equipment item */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + id: number; + createdAt: string; + equipmentType: number; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + post?: never; + /** Delete an equipment item */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + equipmentItemID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successfully deleted equipment item */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + success: boolean; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/majors": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all majors */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + majors: { + name: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + /** create major */ + post: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + }; + }; + }; + responses: { + /** @description Successful response */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + name: string; + }; + }; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/majors/{major}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** update major */ + put: { + parameters: { + query?: never; + header?: never; + path: { + major: string; + }; + cookie?: never; + }; + requestBody?: { + content: { + "application/json": { + name: string; + }; + }; + }; + responses: { + /** @description Successful response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 409: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + post?: never; + /** delete major */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + major: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Unauthorized */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Forbidden */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + /** @description Conflict */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/majors/{majorName}/users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List of all users in a major */ + get: { + parameters: { + query?: never; + header?: never; + path: { + majorName: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + majorUsers: { + id: string; + createdAt: string; + name: string; + email: string; + major: string; + gradDate: string; + interests: ("web development" | "machine learning" | "cloud computing" | "artificial intelligence" | "networking" | "cybersecurity" | "mobile development" | "game development" | "data science")[]; + profilePic: string | null; + /** @enum {string} */ + role: "user" | "member" | "admin"; + /** @enum {string|null} */ + paid: "semester" | "annual" | null; + /** @enum {string} */ + education_level: "undergraduate" | "graduate"; + discord: string | null; + linkedin: string | null; + github: string | null; + website: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/enums/{enumType}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** Get enum types */ + get: { + parameters: { + query?: never; + header?: never; + path: { + enumType: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Get array of values for enum type */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + types: string[]; + }; + }; + }; + /** @description Enum type does not exist */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + error: string; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/sponsors": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all sponsors */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + sponsors: { + name: string; + logoKey: string; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/v1/officers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** List all officers */ + get: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + officers: { + id: number; + userId: string; + /** @enum {string} */ + position: "president" | "vice president" | "dev team officer" | "treasurer" | "social media manager"; + linkedin: string | null; + photo: string | null; + }[]; + }; + }; + }; + }; + }; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; +} +export type webhooks = Record; +export interface components { + schemas: never; + responses: never; + parameters: never; + requestBodies: never; + headers: never; + pathItems: never; +} +export type $defs = Record; +export type operations = Record;