From af72b1f5b5b6d183f8944b1e30e0a08de88f0c50 Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Pardo Date: Sat, 9 Apr 2022 01:29:26 +0200 Subject: [PATCH 1/5] feat: unitfy new/index of teams and selected calendars --- pages/api/index.ts | 2 +- pages/api/selected-calendars/[id].ts | 46 ++++++++++----- pages/api/selected-calendars/index.ts | 73 ++++++++++++++++++------ pages/api/selected-calendars/new.ts | 45 --------------- pages/api/selected-calendars/newIndex.ts | 68 ---------------------- pages/api/teams/[id].ts | 6 +- pages/api/teams/index.ts | 58 ++++++++++++++----- pages/api/teams/new.ts | 41 ------------- pages/api/users/index.ts | 2 +- 9 files changed, 135 insertions(+), 206 deletions(-) delete mode 100644 pages/api/selected-calendars/new.ts delete mode 100644 pages/api/selected-calendars/newIndex.ts delete mode 100644 pages/api/teams/new.ts diff --git a/pages/api/index.ts b/pages/api/index.ts index 17d29ee64b..94461cedce 100644 --- a/pages/api/index.ts +++ b/pages/api/index.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -export default async function CalcomApi(req: NextApiRequest, res: NextApiResponse) { +export default async function CalcomApi(_: NextApiRequest, res: NextApiResponse) { res.status(201).json({ message: "Welcome to Cal.com API - docs are at https://docs.cal.com/api" }); } diff --git a/pages/api/selected-calendars/[id].ts b/pages/api/selected-calendars/[id].ts index f8fb8c99b2..ed3af1e7b7 100644 --- a/pages/api/selected-calendars/[id].ts +++ b/pages/api/selected-calendars/[id].ts @@ -12,7 +12,7 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ /** * @swagger - * /api/selected-calendars/{userId}_{teamId}: + * /v1/selected-calendars/{userId}_{integration}_{externalId}: * get: * summary: Get a selected-calendar by userID and teamID * parameters: @@ -21,13 +21,19 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ * schema: * type: integer * required: true - * description: Numeric userId of the selected-calendar to get + * description: userId of the selected calendar to get * - in: path - * name: teamId + * name: externalId * schema: - * type: integer + * type: string * required: true - * description: Numeric teamId of the selected-calendar to get + * description: externalId of the selected calendar to get + * - in: path + * name: integration + * schema: + * type: string + * required: true + * description: integration of the selected calendar to get * tags: * - selected-calendars * responses: @@ -38,7 +44,7 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ * 404: * description: SelectedCalendar was not found * patch: - * summary: Edit an existing selected-calendar + * summary: Edit an existing selected calendar * consumes: * - application/json * parameters: @@ -54,13 +60,19 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ * schema: * type: integer * required: true - * description: Numeric userId of the selected-calendar to get + * description: userId of the selected calendar to get * - in: path - * name: teamId + * name: externalId * schema: - * type: integer + * type: string * required: true - * description: Numeric teamId of the selected-calendar to get + * description: externalId of the selected calendar to get + * - in: path + * name: integration + * schema: + * type: string + * required: true + * description: integration of the selected calendar to get * tags: * - selected-calendars * responses: @@ -79,13 +91,19 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ * schema: * type: integer * required: true - * description: Numeric userId of the selected-calendar to get + * description: userId of the selected calendar to get * - in: path - * name: teamId + * name: externalId * schema: * type: integer * required: true - * description: Numeric teamId of the selected-calendar to get + * description: externalId of the selected-calendar to get + * - in: path + * name: integration + * schema: + * type: string + * required: true + * description: integration of the selected calendar to get * tags: * - selected-calendars * responses: @@ -105,7 +123,7 @@ export async function selectedCalendarById( const safeQuery = await schemaQueryIdAsString.safeParse(query); const safeBody = await schemaSelectedCalendarBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); - // This is how we set the userId and teamId in the query for managing compoundId. + // This is how we set the userId and externalId in the query for managing compoundId. const [userId, integration, externalId] = safeQuery.data.id.split("_"); switch (method) { diff --git a/pages/api/selected-calendars/index.ts b/pages/api/selected-calendars/index.ts index bfc6e7b834..faa2eb0e5c 100644 --- a/pages/api/selected-calendars/index.ts +++ b/pages/api/selected-calendars/index.ts @@ -3,14 +3,18 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { SelectedCalendarsResponse } from "@lib/types"; -import { schemaSelectedCalendarPublic } from "@lib/validations/selected-calendar"; +import { SelectedCalendarResponse, SelectedCalendarsResponse } from "@lib/types"; +import { + schemaSelectedCalendarBodyParams, + schemaSelectedCalendarPublic, + withValidSelectedCalendar, +} from "@lib/validations/selected-calendar"; /** * @swagger - * /api/selected-calendars: + * /v1/selected-calendars: * get: - * summary: Returns all selected calendars + * summary: Get all selected calendars * tags: * - selected-calendars * responses: @@ -19,21 +23,54 @@ import { schemaSelectedCalendarPublic } from "@lib/validations/selected-calendar * 401: * description: Authorization information is missing or invalid. * 404: - * description: No selectedCalendars were found + * description: No selected calendars were found + * post: + * summary: Creates a new selected calendar + * tags: + * - selected-calendars + * responses: + * 201: + * description: OK, selected calendar created + * model: SelectedCalendar + * 400: + * description: Bad request. SelectedCalendar body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allSelectedCalendars(_: NextApiRequest, res: NextApiResponse) { - const selectedCalendars = await prisma.selectedCalendar.findMany(); - const data = selectedCalendars.map((selectedCalendar) => - schemaSelectedCalendarPublic.parse(selectedCalendar) - ); +async function createOrlistAllSelectedCalendars( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const selectedCalendars = await prisma.selectedCalendar.findMany(); + const data = selectedCalendars.map((selectedCalendar) => + schemaSelectedCalendarPublic.parse(selectedCalendar) + ); + if (data) res.status(200).json({ data }); + else + (error: Error) => + res.status(404).json({ + message: "No SelectedCalendars were found", + error, + }); + } else if (method === "POST") { + const safe = schemaSelectedCalendarBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No SelectedCalendars were found", - error, - }); + const selectedCalendar = await prisma.selectedCalendar.create({ data: safe.data }); + const data = schemaSelectedCalendarPublic.parse(selectedCalendar); + + if (data) res.status(201).json({ data, message: "SelectedCalendar created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new selectedCalendar", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allSelectedCalendars); +export default withMiddleware("HTTP_GET_OR_POST")( + withValidSelectedCalendar(createOrlistAllSelectedCalendars) +); diff --git a/pages/api/selected-calendars/new.ts b/pages/api/selected-calendars/new.ts deleted file mode 100644 index 4534215c0c..0000000000 --- a/pages/api/selected-calendars/new.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { SelectedCalendarResponse } from "@lib/types"; -import { - schemaSelectedCalendarBodyParams, - schemaSelectedCalendarPublic, - withValidSelectedCalendar, -} from "@lib/validations/selected-calendar"; - -/** - * @swagger - * /api/selected-calendars/new: - * post: - * summary: Creates a new selected calendar - * tags: - * - selected-calendars - * responses: - * 201: - * description: OK, selected calendar created - * model: SelectedCalendar - * 400: - * description: Bad request. SelectedCalendar body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createSelectedCalendar(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaSelectedCalendarBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const selectedCalendar = await prisma.selectedCalendar.create({ data: safe.data }); - const data = schemaSelectedCalendarPublic.parse(selectedCalendar); - - if (data) res.status(201).json({ data, message: "SelectedCalendar created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new selectedCalendar", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidSelectedCalendar(createSelectedCalendar)); diff --git a/pages/api/selected-calendars/newIndex.ts b/pages/api/selected-calendars/newIndex.ts deleted file mode 100644 index 732eb013b2..0000000000 --- a/pages/api/selected-calendars/newIndex.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { PaymentResponse, PaymentsResponse } from "@lib/types"; -import { schemaPaymentBodyParams, schemaPaymentPublic, withValidPayment } from "@lib/validations/payment"; - -/** - * @swagger - * /api/payments: - * get: - * summary: Get all payments - * tags: - * - payments - * responses: - * 200: - * description: OK - * 401: - * description: Authorization information is missing or invalid. - * 404: - * description: No payments were found - * post: - * summary: Creates a new payment - * tags: - * - payments - * responses: - * 201: - * description: OK, payment created - * model: Payment - * 400: - * description: Bad request. Payment body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createOrlistAllPayments( - req: NextApiRequest, - res: NextApiResponse -) { - const { method } = req; - if (method === "GET") { - const payments = await prisma.payment.findMany(); - const data = payments.map((payment) => schemaPaymentPublic.parse(payment)); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Payments were found", - error, - }); - } else if (method === "POST") { - const safe = schemaPaymentBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body"); - - const payment = await prisma.payment.create({ data: safe.data }); - const data = schemaPaymentPublic.parse(payment); - - if (data) res.status(201).json({ data, message: "Payment created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new payment", - error, - }); - } else res.status(405).json({ message: `Method ${method} not allowed` }); -} - -export default withMiddleware("HTTP_GET_OR_POST")(withValidPayment(createOrlistAllPayments)); diff --git a/pages/api/teams/[id].ts b/pages/api/teams/[id].ts index 21defc76b8..ef9f26845c 100644 --- a/pages/api/teams/[id].ts +++ b/pages/api/teams/[id].ts @@ -12,7 +12,7 @@ import { schemaTeamBodyParams, schemaTeamPublic } from "@lib/validations/team"; /** * @swagger - * /api/teams/{id}: + * /v1/teams/{id}: * get: * summary: Get a team by ID * parameters: @@ -81,8 +81,8 @@ import { schemaTeamBodyParams, schemaTeamPublic } from "@lib/validations/team"; */ export async function teamById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaTeamBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaTeamBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/teams/index.ts b/pages/api/teams/index.ts index a4ed336c38..6184a5e1bd 100644 --- a/pages/api/teams/index.ts +++ b/pages/api/teams/index.ts @@ -3,14 +3,14 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { TeamsResponse } from "@lib/types"; -import { schemaTeamPublic } from "@lib/validations/team"; +import { TeamResponse, TeamsResponse } from "@lib/types"; +import { schemaTeamBodyParams, schemaTeamPublic, withValidTeam } from "@lib/validations/team"; /** * @swagger - * /api/teams: + * /v1/teams: * get: - * summary: Returns all teams + * summary: Get all teams * tags: * - teams * responses: @@ -20,18 +20,46 @@ import { schemaTeamPublic } from "@lib/validations/team"; * description: Authorization information is missing or invalid. * 404: * description: No teams were found + * post: + * summary: Creates a new team + * tags: + * - teams + * responses: + * 201: + * description: OK, team created + * model: Team + * 400: + * description: Bad request. Team body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allTeams(_: NextApiRequest, res: NextApiResponse) { - const teams = await prisma.team.findMany(); - const data = teams.map((team) => schemaTeamPublic.parse(team)); +async function createOrlistAllTeams(req: NextApiRequest, res: NextApiResponse) { + const { method } = req; + if (method === "GET") { + const teams = await prisma.team.findMany(); + const data = teams.map((team) => schemaTeamPublic.parse(team)); + if (data) res.status(200).json({ data }); + else + (error: Error) => + res.status(404).json({ + message: "No Teams were found", + error, + }); + } else if (method === "POST") { + const safe = schemaTeamBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Teams were found", - error, - }); + const team = await prisma.team.create({ data: safe.data }); + const data = schemaTeamPublic.parse(team); + + if (data) res.status(201).json({ data, message: "Team created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new team", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allTeams); +export default withMiddleware("HTTP_GET_OR_POST")(withValidTeam(createOrlistAllTeams)); diff --git a/pages/api/teams/new.ts b/pages/api/teams/new.ts deleted file mode 100644 index 6100b5c42d..0000000000 --- a/pages/api/teams/new.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { TeamResponse } from "@lib/types"; -import { schemaTeamBodyParams, schemaTeamPublic, withValidTeam } from "@lib/validations/team"; - -/** - * @swagger - * /api/teams/new: - * post: - * summary: Creates a new team - * tags: - * - teams - * responses: - * 201: - * description: OK, team created - * model: Team - * 400: - * description: Bad request. Team body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createTeam(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaTeamBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const team = await prisma.team.create({ data: safe.data }); - const data = schemaTeamPublic.parse(team); - - if (data) res.status(201).json({ data, message: "Team created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new team", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidTeam(createTeam)); diff --git a/pages/api/users/index.ts b/pages/api/users/index.ts index 17c975c32d..1d11d751d5 100644 --- a/pages/api/users/index.ts +++ b/pages/api/users/index.ts @@ -9,7 +9,7 @@ import { schemaUserPublic } from "@lib/validations/user"; /** * @swagger - * /api/users: + * /v1/users: * get: * summary: Get all users (admin only), returns your user if regular user. * tags: From d95325c06c753086cfe921950b829020fc55a231 Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Pardo Date: Sun, 10 Apr 2022 02:10:34 +0200 Subject: [PATCH 2/5] payments safe, unify endpoints for remindermails schedules --- pages/api/attendees/[id].ts | 4 +- pages/api/availabilities/[id].ts | 4 +- pages/api/booking-references/[id].ts | 4 +- pages/api/bookings/[id].ts | 4 +- pages/api/credentials/[id].ts | 4 +- pages/api/daily-event-references/[id].ts | 4 +- pages/api/destination-calendars/[id].ts | 4 +- pages/api/event-type-custom-inputs/[id].ts | 4 +- pages/api/event-types/[id].ts | 4 +- pages/api/memberships/[id].ts | 4 +- pages/api/payments/[id].ts | 120 +++++---------------- pages/api/payments/index.ts | 12 ++- pages/api/payments/new.ts | 48 --------- pages/api/reminder-mails/[id].ts | 4 +- pages/api/reminder-mails/index.ts | 65 ++++++++--- pages/api/reminder-mails/new.ts | 52 --------- pages/api/reminder-mails/newIndex.ts | 68 ------------ pages/api/schedules/[id].ts | 6 +- pages/api/schedules/index.ts | 59 +++++++--- pages/api/schedules/new.ts | 41 ------- pages/api/schedules/newIndex.ts | 68 ------------ pages/api/selected-calendars/[id].ts | 4 +- pages/api/users/[id].ts | 6 +- templates/endpoints/[id]/delete.ts | 2 +- templates/endpoints/[id]/edit.ts | 4 +- templates/endpoints/[id]/index.ts | 2 +- 26 files changed, 167 insertions(+), 434 deletions(-) delete mode 100644 pages/api/payments/new.ts delete mode 100644 pages/api/reminder-mails/new.ts delete mode 100644 pages/api/reminder-mails/newIndex.ts delete mode 100644 pages/api/schedules/new.ts delete mode 100644 pages/api/schedules/newIndex.ts diff --git a/pages/api/attendees/[id].ts b/pages/api/attendees/[id].ts index 502fb5d1c5..8152512d5c 100644 --- a/pages/api/attendees/[id].ts +++ b/pages/api/attendees/[id].ts @@ -81,8 +81,8 @@ import { */ export async function attendeeById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaAttendeeBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaAttendeeBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/availabilities/[id].ts b/pages/api/availabilities/[id].ts index be9d9eb987..5e9e243e54 100644 --- a/pages/api/availabilities/[id].ts +++ b/pages/api/availabilities/[id].ts @@ -81,8 +81,8 @@ import { */ export async function availabilityById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaAvailabilityBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaAvailabilityBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/booking-references/[id].ts b/pages/api/booking-references/[id].ts index 8c804321e0..216d1282ff 100644 --- a/pages/api/booking-references/[id].ts +++ b/pages/api/booking-references/[id].ts @@ -87,8 +87,8 @@ export async function bookingReferenceById( res: NextApiResponse ) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaBookingReferenceBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaBookingReferenceBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/bookings/[id].ts b/pages/api/bookings/[id].ts index 57b817464d..852b32b983 100644 --- a/pages/api/bookings/[id].ts +++ b/pages/api/bookings/[id].ts @@ -81,8 +81,8 @@ import { */ export async function bookingById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaBookingBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaBookingBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/credentials/[id].ts b/pages/api/credentials/[id].ts index cc48ffab6a..16c60007a4 100644 --- a/pages/api/credentials/[id].ts +++ b/pages/api/credentials/[id].ts @@ -81,8 +81,8 @@ import { */ export async function credentialById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaCredentialBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaCredentialBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/daily-event-references/[id].ts b/pages/api/daily-event-references/[id].ts index 21072a7a4e..d150cf69ce 100644 --- a/pages/api/daily-event-references/[id].ts +++ b/pages/api/daily-event-references/[id].ts @@ -87,8 +87,8 @@ export async function dailyEventReferenceById( res: NextApiResponse ) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaDailyEventReferenceBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaDailyEventReferenceBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/destination-calendars/[id].ts b/pages/api/destination-calendars/[id].ts index a08406f9fa..16c5fba7be 100644 --- a/pages/api/destination-calendars/[id].ts +++ b/pages/api/destination-calendars/[id].ts @@ -87,8 +87,8 @@ export async function destionationCalendarById( res: NextApiResponse ) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaDestinationCalendarBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaDestinationCalendarBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/event-type-custom-inputs/[id].ts b/pages/api/event-type-custom-inputs/[id].ts index 8b5d29ed8f..85b2df0ccd 100644 --- a/pages/api/event-type-custom-inputs/[id].ts +++ b/pages/api/event-type-custom-inputs/[id].ts @@ -84,8 +84,8 @@ import { */ async function eventTypeById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaEventTypeCustomInputBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaEventTypeCustomInputBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/event-types/[id].ts b/pages/api/event-types/[id].ts index bf94bcdfa0..dd441f5cd3 100644 --- a/pages/api/event-types/[id].ts +++ b/pages/api/event-types/[id].ts @@ -81,8 +81,8 @@ import { */ export async function eventTypeById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaEventTypeBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaEventTypeBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/memberships/[id].ts b/pages/api/memberships/[id].ts index d78d0f1c88..61f78cc6e8 100644 --- a/pages/api/memberships/[id].ts +++ b/pages/api/memberships/[id].ts @@ -96,8 +96,8 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ */ export async function membershipById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdAsString.safeParse(query); - const safeBody = await schemaMembershipBodyParams.safeParse(body); + const safeQuery = schemaQueryIdAsString.safeParse(query); + const safeBody = schemaMembershipBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); // This is how we set the userId and teamId in the query for managing compoundId. const [userId, teamId] = safeQuery.data.id.split("_"); diff --git a/pages/api/payments/[id].ts b/pages/api/payments/[id].ts index 7637bb724d..e026e62dc5 100644 --- a/pages/api/payments/[id].ts +++ b/pages/api/payments/[id].ts @@ -4,7 +4,8 @@ import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; import type { PaymentResponse } from "@lib/types"; -import { schemaPaymentBodyParams, schemaPaymentPublic } from "@lib/validations/payment"; +import { getCalcomUserId } from "@lib/utils/getCalcomUserId"; +import { schemaPaymentPublic } from "@lib/validations/payment"; import { schemaQueryIdParseInt, withValidQueryIdTransformParseInt, @@ -14,7 +15,7 @@ import { * @swagger * /api/payments/{id}: * get: - * summary: Get an payment by ID + * summary: Get a payment by ID * parameters: * - in: path * name: id @@ -31,100 +32,33 @@ import { * description: Authorization information is missing or invalid. * 404: * description: Payment was not found - * patch: - * summary: Edit an existing payment - * consumes: - * - application/json - * parameters: - * - in: body - * name: payment - * description: The payment to edit - * schema: - * type: object - * $ref: '#/components/schemas/Payment' - * required: true - * - in: path - * name: id - * schema: - * type: integer - * required: true - * description: Numeric ID of the payment to edit - * tags: - * - payments - * responses: - * 201: - * description: OK, payment edited successfuly - * model: Payment - * 400: - * description: Bad request. Payment body is invalid. - * 401: - * description: Authorization information is missing or invalid. - * delete: - * summary: Remove an existing payment - * parameters: - * - in: path - * name: id - * schema: - * type: integer - * required: true - * description: Numeric ID of the payment to delete - * tags: - * - payments - * responses: - * 201: - * description: OK, payment removed successfuly - * model: Payment - * 400: - * description: Bad request. Payment id is invalid. - * 401: - * description: Authorization information is missing or invalid. */ export async function paymentById(req: NextApiRequest, res: NextApiResponse) { - const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaPaymentBodyParams.safeParse(body); - if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); + const { method, query } = req; + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const userId = await getCalcomUserId(res); - switch (method) { - case "GET": - await prisma.payment - .findUnique({ where: { id: safeQuery.data.id } }) - .then((payment) => schemaPaymentPublic.parse(payment)) - .then((data) => res.status(200).json({ data })) - .catch((error: Error) => - res.status(404).json({ message: `Payment with id: ${safeQuery.data.id} not found`, error }) - ); - break; - - case "PATCH": - if (!safeBody.success) throw new Error("Invalid request body"); - await prisma.payment - .update({ - where: { id: safeQuery.data.id }, - data: safeBody.data, + if (safeQuery.success && method === "GET") { + const userWithBookings = await prisma.user.findUnique({ + where: { id: userId }, + include: { bookings: true }, + }); + await prisma.payment + .findUnique({ where: { id: safeQuery.data.id } }) + .then((payment) => schemaPaymentPublic.parse(payment)) + .then((data) => { + if (userWithBookings?.bookings.map((b) => b.id).includes(data.bookingId)) { + res.status(200).json({ data }); + } else { + res.status(401).json({ message: "Unauthorized" }); + } + }) + .catch((error: Error) => + res.status(404).json({ + message: `Payment with id: ${safeQuery.data.id} not found`, + error, }) - .then((payment) => schemaPaymentPublic.parse(payment)) - .then((data) => res.status(200).json({ data })) - .catch((error: Error) => - res.status(404).json({ message: `Payment with id: ${safeQuery.data.id} not found`, error }) - ); - break; - - case "DELETE": - await prisma.payment - .delete({ where: { id: safeQuery.data.id } }) - .then(() => - res.status(200).json({ message: `Payment with id: ${safeQuery.data.id} deleted successfully` }) - ) - .catch((error: Error) => - res.status(404).json({ message: `Payment with id: ${safeQuery.data.id} not found`, error }) - ); - break; - - default: - res.status(405).json({ message: "Method not allowed" }); - break; + ); } } - -export default withMiddleware("HTTP_GET_DELETE_PATCH")(withValidQueryIdTransformParseInt(paymentById)); +export default withMiddleware("HTTP_GET")(withValidQueryIdTransformParseInt(paymentById)); diff --git a/pages/api/payments/index.ts b/pages/api/payments/index.ts index ccffac1161..73b32a7d1c 100644 --- a/pages/api/payments/index.ts +++ b/pages/api/payments/index.ts @@ -4,6 +4,7 @@ import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; import { PaymentsResponse } from "@lib/types"; +import { getCalcomUserId } from "@lib/utils/getCalcomUserId"; import { schemaPaymentPublic } from "@lib/validations/payment"; /** @@ -22,7 +23,16 @@ import { schemaPaymentPublic } from "@lib/validations/payment"; * description: No payments were found */ async function allPayments(_: NextApiRequest, res: NextApiResponse) { - const payments = await prisma.payment.findMany(); + const userId = await getCalcomUserId(res); + + const userWithBookings = await prisma.user.findUnique({ + where: { id: userId }, + include: { bookings: true }, + }); + if (!userWithBookings) throw new Error("No user found"); + const bookings = userWithBookings.bookings; + const bookingIds = bookings.map((booking) => booking.id); + const payments = await prisma.payment.findMany({ where: { bookingId: { in: bookingIds } } }); const data = payments.map((payment) => schemaPaymentPublic.parse(payment)); if (data) res.status(200).json({ data }); diff --git a/pages/api/payments/new.ts b/pages/api/payments/new.ts deleted file mode 100644 index 1886270fe2..0000000000 --- a/pages/api/payments/new.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { PaymentResponse } from "@lib/types"; -import { schemaPaymentBodyParams, schemaPaymentPublic, withValidPayment } from "@lib/validations/payment"; - -/** - * @swagger - * /api/payments/new: - * post: - * summary: Creates a new payment - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Payment' - * tags: - * - payments - * responses: - * 201: - * description: OK, payment created - * model: Payment - * 400: - * description: Bad request. Payment body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createPayment(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaPaymentBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const payment = await prisma.payment.create({ data: safe.data }); - const data = schemaPaymentPublic.parse(payment); - - if (data) res.status(201).json({ data, message: "Payment created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new payment", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidPayment(createPayment)); diff --git a/pages/api/reminder-mails/[id].ts b/pages/api/reminder-mails/[id].ts index 5d101b4c6d..543b84de9b 100644 --- a/pages/api/reminder-mails/[id].ts +++ b/pages/api/reminder-mails/[id].ts @@ -81,8 +81,8 @@ import { */ export async function reminderMailById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaReminderMailBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaReminderMailBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/reminder-mails/index.ts b/pages/api/reminder-mails/index.ts index 3a847def6b..be7025ba21 100644 --- a/pages/api/reminder-mails/index.ts +++ b/pages/api/reminder-mails/index.ts @@ -3,12 +3,16 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { ReminderMailsResponse } from "@lib/types"; -import { schemaReminderMailPublic } from "@lib/validations/reminder-mail"; +import { ReminderMailResponse, ReminderMailsResponse } from "@lib/types"; +import { + schemaReminderMailBodyParams, + schemaReminderMailPublic, + withValidReminderMail, +} from "@lib/validations/reminder-mail"; /** * @swagger - * /api/reminder-mails: + * /v1/reminder-mails: * get: * summary: Get all reminder mails * tags: @@ -19,19 +23,50 @@ import { schemaReminderMailPublic } from "@lib/validations/reminder-mail"; * 401: * description: Authorization information is missing or invalid. * 404: - * description: No reminderMails were found + * description: No reminder mails were found + * post: + * summary: Creates a new reminder mail + * tags: + * - reminder-mails + * responses: + * 201: + * description: OK, reminder mail created + * model: ReminderMail + * 400: + * description: Bad request. ReminderMail body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allReminderMails(_: NextApiRequest, res: NextApiResponse) { - const reminderMails = await prisma.reminderMail.findMany(); - const data = reminderMails.map((reminderMail) => schemaReminderMailPublic.parse(reminderMail)); +async function createOrlistAllReminderMails( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const reminderMails = await prisma.reminderMail.findMany(); + const data = reminderMails.map((reminderMail) => schemaReminderMailPublic.parse(reminderMail)); + if (data) res.status(200).json({ data }); + else + (error: Error) => + res.status(404).json({ + message: "No ReminderMails were found", + error, + }); + } else if (method === "POST") { + const safe = schemaReminderMailBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No ReminderMails were found", - error, - }); + const reminderMail = await prisma.reminderMail.create({ data: safe.data }); + const data = schemaReminderMailPublic.parse(reminderMail); + + if (data) res.status(201).json({ data, message: "reminder mail created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "could not create new reminder mail", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allReminderMails); +export default withMiddleware("HTTP_GET_OR_POST")(withValidReminderMail(createOrlistAllReminderMails)); diff --git a/pages/api/reminder-mails/new.ts b/pages/api/reminder-mails/new.ts deleted file mode 100644 index dd82b7a78e..0000000000 --- a/pages/api/reminder-mails/new.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { ReminderMailResponse } from "@lib/types"; -import { - schemaReminderMailBodyParams, - schemaReminderMailPublic, - withValidReminderMail, -} from "@lib/validations/reminder-mail"; - -/** - * @swagger - * /api/reminder-mails/new: - * post: - * summary: Creates a new reminder mail - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/ReminderMail' - * tags: - * - reminder-mails - * responses: - * 201: - * description: OK, reminderMail created - * model: ReminderMail - * 400: - * description: Bad request. ReminderMail body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createReminderMail(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaReminderMailBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const reminderMail = await prisma.reminderMail.create({ data: safe.data }); - const data = schemaReminderMailPublic.parse(reminderMail); - - if (data) res.status(201).json({ data, message: "ReminderMail created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new reminderMail", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidReminderMail(createReminderMail)); diff --git a/pages/api/reminder-mails/newIndex.ts b/pages/api/reminder-mails/newIndex.ts deleted file mode 100644 index 732eb013b2..0000000000 --- a/pages/api/reminder-mails/newIndex.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { PaymentResponse, PaymentsResponse } from "@lib/types"; -import { schemaPaymentBodyParams, schemaPaymentPublic, withValidPayment } from "@lib/validations/payment"; - -/** - * @swagger - * /api/payments: - * get: - * summary: Get all payments - * tags: - * - payments - * responses: - * 200: - * description: OK - * 401: - * description: Authorization information is missing or invalid. - * 404: - * description: No payments were found - * post: - * summary: Creates a new payment - * tags: - * - payments - * responses: - * 201: - * description: OK, payment created - * model: Payment - * 400: - * description: Bad request. Payment body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createOrlistAllPayments( - req: NextApiRequest, - res: NextApiResponse -) { - const { method } = req; - if (method === "GET") { - const payments = await prisma.payment.findMany(); - const data = payments.map((payment) => schemaPaymentPublic.parse(payment)); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Payments were found", - error, - }); - } else if (method === "POST") { - const safe = schemaPaymentBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body"); - - const payment = await prisma.payment.create({ data: safe.data }); - const data = schemaPaymentPublic.parse(payment); - - if (data) res.status(201).json({ data, message: "Payment created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new payment", - error, - }); - } else res.status(405).json({ message: `Method ${method} not allowed` }); -} - -export default withMiddleware("HTTP_GET_OR_POST")(withValidPayment(createOrlistAllPayments)); diff --git a/pages/api/schedules/[id].ts b/pages/api/schedules/[id].ts index 682dc334d2..162f7f9542 100644 --- a/pages/api/schedules/[id].ts +++ b/pages/api/schedules/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/schedules/{id}: + * /v1/schedules/{id}: * get: * summary: Get a schedule by ID * parameters: @@ -81,8 +81,8 @@ import { */ export async function scheduleById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaScheduleBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaScheduleBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); switch (method) { diff --git a/pages/api/schedules/index.ts b/pages/api/schedules/index.ts index cd09534c99..3458e4896b 100644 --- a/pages/api/schedules/index.ts +++ b/pages/api/schedules/index.ts @@ -3,14 +3,14 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { SchedulesResponse } from "@lib/types"; -import { schemaSchedulePublic } from "@lib/validations/schedule"; +import { ScheduleResponse, SchedulesResponse } from "@lib/types"; +import { schemaScheduleBodyParams, schemaSchedulePublic, withValidSchedule } from "@lib/validations/schedule"; /** * @swagger * /api/schedules: * get: - * summary: Returns all schedules + * summary: Get all schedules * tags: * - schedules * responses: @@ -20,18 +20,49 @@ import { schemaSchedulePublic } from "@lib/validations/schedule"; * description: Authorization information is missing or invalid. * 404: * description: No schedules were found + * post: + * summary: Creates a new schedule + * tags: + * - schedules + * responses: + * 201: + * description: OK, schedule created + * model: Schedule + * 400: + * description: Bad request. Schedule body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allSchedules(_: NextApiRequest, res: NextApiResponse) { - const schedules = await prisma.schedule.findMany(); - const data = schedules.map((schedule) => schemaSchedulePublic.parse(schedule)); +async function createOrlistAllSchedules( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const schedules = await prisma.schedule.findMany(); + const data = schedules.map((schedule) => schemaSchedulePublic.parse(schedule)); + if (data) res.status(200).json({ data }); + else + (error: Error) => + res.status(404).json({ + message: "No Schedules were found", + error, + }); + } else if (method === "POST") { + const safe = schemaScheduleBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Schedules were found", - error, - }); + const schedule = await prisma.schedule.create({ data: safe.data }); + const data = schemaSchedulePublic.parse(schedule); + + if (data) res.status(201).json({ data, message: "Schedule created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new schedule", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allSchedules); +export default withMiddleware("HTTP_GET_OR_POST")(withValidSchedule(createOrlistAllSchedules)); diff --git a/pages/api/schedules/new.ts b/pages/api/schedules/new.ts deleted file mode 100644 index d4a3ea4416..0000000000 --- a/pages/api/schedules/new.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { ScheduleResponse } from "@lib/types"; -import { schemaScheduleBodyParams, schemaSchedulePublic, withValidSchedule } from "@lib/validations/schedule"; - -/** - * @swagger - * /api/schedules/new: - * post: - * summary: Creates a new schedule - * tags: - * - schedules - * responses: - * 201: - * description: OK, schedule created - * model: Schedule - * 400: - * description: Bad request. Schedule body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createSchedule(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaScheduleBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const schedule = await prisma.schedule.create({ data: safe.data }); - const data = schemaSchedulePublic.parse(schedule); - - if (data) res.status(201).json({ data, message: "Schedule created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new schedule", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidSchedule(createSchedule)); diff --git a/pages/api/schedules/newIndex.ts b/pages/api/schedules/newIndex.ts deleted file mode 100644 index 732eb013b2..0000000000 --- a/pages/api/schedules/newIndex.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { PaymentResponse, PaymentsResponse } from "@lib/types"; -import { schemaPaymentBodyParams, schemaPaymentPublic, withValidPayment } from "@lib/validations/payment"; - -/** - * @swagger - * /api/payments: - * get: - * summary: Get all payments - * tags: - * - payments - * responses: - * 200: - * description: OK - * 401: - * description: Authorization information is missing or invalid. - * 404: - * description: No payments were found - * post: - * summary: Creates a new payment - * tags: - * - payments - * responses: - * 201: - * description: OK, payment created - * model: Payment - * 400: - * description: Bad request. Payment body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createOrlistAllPayments( - req: NextApiRequest, - res: NextApiResponse -) { - const { method } = req; - if (method === "GET") { - const payments = await prisma.payment.findMany(); - const data = payments.map((payment) => schemaPaymentPublic.parse(payment)); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Payments were found", - error, - }); - } else if (method === "POST") { - const safe = schemaPaymentBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body"); - - const payment = await prisma.payment.create({ data: safe.data }); - const data = schemaPaymentPublic.parse(payment); - - if (data) res.status(201).json({ data, message: "Payment created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new payment", - error, - }); - } else res.status(405).json({ message: `Method ${method} not allowed` }); -} - -export default withMiddleware("HTTP_GET_OR_POST")(withValidPayment(createOrlistAllPayments)); diff --git a/pages/api/selected-calendars/[id].ts b/pages/api/selected-calendars/[id].ts index ed3af1e7b7..900c2295db 100644 --- a/pages/api/selected-calendars/[id].ts +++ b/pages/api/selected-calendars/[id].ts @@ -120,8 +120,8 @@ export async function selectedCalendarById( res: NextApiResponse ) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdAsString.safeParse(query); - const safeBody = await schemaSelectedCalendarBodyParams.safeParse(body); + const safeQuery = schemaQueryIdAsString.safeParse(query); + const safeBody = schemaSelectedCalendarBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); // This is how we set the userId and externalId in the query for managing compoundId. const [userId, integration, externalId] = safeQuery.data.id.split("_"); diff --git a/pages/api/users/[id].ts b/pages/api/users/[id].ts index 3802a4fb90..a264051726 100644 --- a/pages/api/users/[id].ts +++ b/pages/api/users/[id].ts @@ -13,7 +13,7 @@ import { schemaUserBodyParams, schemaUserPublic } from "@lib/validations/user"; /** * @swagger - * /api/users/{id}: + * /v1/users/{id}: * get: * summary: Get a user by ID, returns your user if regular user. * parameters: @@ -82,8 +82,8 @@ import { schemaUserBodyParams, schemaUserPublic } from "@lib/validations/user"; */ export async function userById(req: NextApiRequest, res: NextApiResponse) { const { method, query, body } = req; - const safeQuery = await schemaQueryIdParseInt.safeParse(query); - const safeBody = await schemaUserBodyParams.safeParse(body); + const safeQuery = schemaQueryIdParseInt.safeParse(query); + const safeBody = schemaUserBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); const userId = getCalcomUserId(res); if (safeQuery.data.id === userId) { diff --git a/templates/endpoints/[id]/delete.ts b/templates/endpoints/[id]/delete.ts index 95049ae799..a9816a3ab6 100644 --- a/templates/endpoints/[id]/delete.ts +++ b/templates/endpoints/[id]/delete.ts @@ -33,7 +33,7 @@ import { * description: Authorization information is missing or invalid. */ export async function deleteResource(req: NextApiRequest, res: NextApiResponse) { - const safe = await schemaQueryIdParseInt.safeParse(req.query); + const safe = schemaQueryIdParseInt.safeParse(req.query); if (!safe.success) throw new Error("Invalid request query", safe.error); const data = await prisma.resource.delete({ where: { id: safe.data.id } }); diff --git a/templates/endpoints/[id]/edit.ts b/templates/endpoints/[id]/edit.ts index e4d2f382ec..2be7bd06c1 100644 --- a/templates/endpoints/[id]/edit.ts +++ b/templates/endpoints/[id]/edit.ts @@ -34,8 +34,8 @@ import { schemaResourceBodyParams, schemaResourcePublic, withValidResource } fro * description: Authorization information is missing or invalid. */ export async function editResource(req: NextApiRequest, res: NextApiResponse) { - const safeQuery = await schemaQueryIdParseInt.safeParse(req.query); - const safeBody = await schemaResourceBodyParams.safeParse(req.body); + const safeQuery = schemaQueryIdParseInt.safeParse(req.query); + const safeBody = schemaResourceBodyParams.safeParse(req.body); if (!safeQuery.success || !safeBody.success) throw new Error("Invalid request"); const resource = await prisma.resource.update({ diff --git a/templates/endpoints/[id]/index.ts b/templates/endpoints/[id]/index.ts index 0ba07d382f..2ef4d18a67 100644 --- a/templates/endpoints/[id]/index.ts +++ b/templates/endpoints/[id]/index.ts @@ -33,7 +33,7 @@ import { schemaResourcePublic } from "@lib/validations/resource"; * description: Resource was not found */ export async function resourceById(req: NextApiRequest, res: NextApiResponse) { - const safe = await schemaQueryIdParseInt.safeParse(req.query); + const safe = schemaQueryIdParseInt.safeParse(req.query); if (!safe.success) throw new Error("Invalid request query"); const resource = await prisma.resource.findUnique({ where: { id: safe.data.id } }); From ddc1b4043c23bb1f6611878149ffea23b952b770 Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Pardo Date: Mon, 11 Apr 2022 00:10:38 +0200 Subject: [PATCH 3/5] fix: docs bad ref in event type --- pages/api/event-type-custom-inputs/[id].ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/api/event-type-custom-inputs/[id].ts b/pages/api/event-type-custom-inputs/[id].ts index 85b2df0ccd..c737b5fb84 100644 --- a/pages/api/event-type-custom-inputs/[id].ts +++ b/pages/api/event-type-custom-inputs/[id].ts @@ -44,7 +44,7 @@ import { * description: The eventTypeCustomInput to edit * schema: * type: object - * $ref: '#/comCustomInputponents/schemas/EventType' + * $ref: '#/components/schemas/EventTypeCustomInput' * required: true * - in: path * name: id From 963c8937272dc3ce50bded645f81a195cc6c61b4 Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Pardo Date: Mon, 11 Apr 2022 12:03:15 +0200 Subject: [PATCH 4/5] feat: unify new/index of attendees, availabilities, booking references, bookings, selected calendars, update response types --- lib/types.ts | 76 ++++++++++++--------------- pages/api/attendees/[id].ts | 8 +-- pages/api/attendees/index.ts | 10 ++-- pages/api/availabilities/[id].ts | 8 +-- pages/api/availabilities/index.ts | 57 +++++++++++++++----- pages/api/availabilities/new.ts | 51 ------------------ pages/api/booking-references/[id].ts | 6 +-- pages/api/booking-references/index.ts | 68 ++++++++++++++++++------ pages/api/booking-references/new.ts | 51 ------------------ pages/api/bookings/[id].ts | 8 +-- pages/api/bookings/index.ts | 57 +++++++++++++++----- pages/api/bookings/new.ts | 48 ----------------- pages/api/payments/[id].ts | 2 +- pages/api/schedules/index.ts | 2 +- pages/api/selected-calendars/[id].ts | 4 +- pages/api/selected-calendars/index.ts | 17 +++--- pages/api/teams/[id].ts | 11 ++-- pages/api/teams/index.ts | 21 +++++--- pages/api/users/[id].ts | 8 +-- pages/api/users/index.ts | 6 +-- templates/endpoints/newIndex.ts | 2 +- 21 files changed, 237 insertions(+), 284 deletions(-) delete mode 100644 pages/api/availabilities/new.ts delete mode 100644 pages/api/booking-references/new.ts delete mode 100644 pages/api/bookings/new.ts diff --git a/lib/types.ts b/lib/types.ts index cffd7c9841..91af310a62 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -27,147 +27,139 @@ export type BaseResponse = { // User export type UserResponse = BaseResponse & { - data?: Partial; + user?: Partial; }; export type UsersResponse = BaseResponse & { - data?: Partial[]; -}; - -// API Key -export type ApiKeyResponse = BaseResponse & { - data?: Partial; -}; -export type ApiKeysResponse = BaseResponse & { - data?: Partial[]; + users?: Partial[]; }; // Team export type TeamResponse = BaseResponse & { - data?: Partial; + team?: Partial; }; export type TeamsResponse = BaseResponse & { - data?: Partial[]; + teams?: Partial[]; }; // SelectedCalendar export type SelectedCalendarResponse = BaseResponse & { - data?: Partial; + selected_calendar?: Partial; }; export type SelectedCalendarsResponse = BaseResponse & { - data?: Partial[]; + selected_calendars?: Partial[]; }; // Attendee export type AttendeeResponse = BaseResponse & { - data?: Partial; + attendee?: Partial; }; // Grouping attendees in booking arrays for now, // later might remove endpoint and move to booking endpoint altogether. export type AttendeesResponse = BaseResponse & { - data?: Partial[]; + attendees?: Partial[]; }; // Availability export type AvailabilityResponse = BaseResponse & { - data?: Partial; + availability?: Partial; }; export type AvailabilitiesResponse = BaseResponse & { - data?: Partial[]; + availabilities?: Partial[]; }; // BookingReference export type BookingReferenceResponse = BaseResponse & { - data?: Partial; + booking_reference?: Partial; }; export type BookingReferencesResponse = BaseResponse & { - data?: Partial[]; + booking_references?: Partial[]; }; // Booking export type BookingResponse = BaseResponse & { - data?: Partial; + booking?: Partial; }; export type BookingsResponse = BaseResponse & { - data?: Partial[]; + bookings?: Partial[]; }; // Credential export type CredentialResponse = BaseResponse & { - data?: Partial; + credential?: Partial; }; export type CredentialsResponse = BaseResponse & { - data?: Partial[]; + credentials?: Partial[]; }; // DailyEventReference export type DailyEventReferenceResponse = BaseResponse & { - data?: Partial; + daily_event_reference?: Partial; }; export type DailyEventReferencesResponse = BaseResponse & { - data?: Partial[]; + daily_event_references?: Partial[]; }; // DestinationCalendar export type DestinationCalendarResponse = BaseResponse & { - data?: Partial; + destination_calendar?: Partial; }; export type DestinationCalendarsResponse = BaseResponse & { - data?: Partial[]; + destination_calendars?: Partial[]; }; // Membership export type MembershipResponse = BaseResponse & { - data?: Partial; + membership?: Partial; }; export type MembershipsResponse = BaseResponse & { - data?: Partial[]; + memberships?: Partial[]; }; // EventTypeCustomInput export type EventTypeCustomInputResponse = BaseResponse & { - data?: Partial; + event_type_custom_input?: Partial; }; export type EventTypeCustomInputsResponse = BaseResponse & { - data?: Partial[]; + event_type_custom_inputs?: Partial[]; }; // EventType export type EventTypeResponse = BaseResponse & { - data?: Partial; + event_type?: Partial; }; export type EventTypesResponse = BaseResponse & { - data?: Partial[]; + event_types?: Partial[]; }; // Payment export type PaymentResponse = BaseResponse & { - data?: Partial; + payment?: Partial; }; export type PaymentsResponse = BaseResponse & { - data?: Partial[]; + payments?: Partial[]; }; // Schedule export type ScheduleResponse = BaseResponse & { - data?: Partial; + schedule?: Partial; }; export type SchedulesResponse = BaseResponse & { - data?: Partial[]; + schedules?: Partial[]; }; // Webhook export type WebhookResponse = BaseResponse & { - data?: Partial; + webhook?: Partial; }; export type WebhooksResponse = BaseResponse & { - data?: Partial[]; + webhooks?: Partial[]; }; // ReminderMail export type ReminderMailResponse = BaseResponse & { - data?: Partial; + reminder_mail?: Partial; }; export type ReminderMailsResponse = BaseResponse & { - data?: Partial[]; + reminder_mails?: Partial[]; }; diff --git a/pages/api/attendees/[id].ts b/pages/api/attendees/[id].ts index 8152512d5c..6044c6cc74 100644 --- a/pages/api/attendees/[id].ts +++ b/pages/api/attendees/[id].ts @@ -89,8 +89,8 @@ export async function attendeeById(req: NextApiRequest, res: NextApiResponse schemaAttendeePublic.parse(attendee)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaAttendeePublic.parse(data)) + .then((attendee) => res.status(200).json({ attendee })) .catch((error: Error) => res.status(404).json({ message: `Attendee with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function attendeeById(req: NextApiRequest, res: NextApiResponse schemaAttendeePublic.parse(attendee)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaAttendeePublic.parse(data)) + .then((attendee) => res.status(200).json({ attendee })) .catch((error: Error) => res.status(404).json({ message: `Attendee with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/attendees/index.ts b/pages/api/attendees/index.ts index e15a3af0e0..d9f7429325 100644 --- a/pages/api/attendees/index.ts +++ b/pages/api/attendees/index.ts @@ -49,9 +49,9 @@ async function createOrlistAllAttendees( attendees: true, }, }); - const userBookingsAttendees = userBookings.map((booking) => booking.attendees).flat(); + const attendees = userBookings.map((booking) => booking.attendees).flat(); if (method === "GET") { - if (userBookingsAttendees) res.status(200).json({ data: userBookingsAttendees }); + if (attendees) res.status(200).json({ attendees }); else (error: Error) => res.status(404).json({ @@ -67,12 +67,12 @@ async function createOrlistAllAttendees( const bookingId = safe.data.bookingId; delete safe.data.bookingId; const noBookingId = safe.data; - const attendee = await prisma.attendee.create({ + const data = await prisma.attendee.create({ data: { ...noBookingId, booking: { connect: { id: parseInt(bookingId as string) } } }, }); - const data = schemaAttendeePublic.parse(attendee); + const attendee = schemaAttendeePublic.parse(data); - if (data) res.status(201).json({ data, message: "Attendee created successfully" }); + if (attendee) res.status(201).json({ attendee, message: "Attendee created successfully" }); else (error: Error) => res.status(400).json({ diff --git a/pages/api/availabilities/[id].ts b/pages/api/availabilities/[id].ts index 5e9e243e54..1c126ff2c2 100644 --- a/pages/api/availabilities/[id].ts +++ b/pages/api/availabilities/[id].ts @@ -89,8 +89,8 @@ export async function availabilityById(req: NextApiRequest, res: NextApiResponse case "GET": await prisma.availability .findUnique({ where: { id: safeQuery.data.id } }) - .then((availability) => schemaAvailabilityPublic.parse(availability)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaAvailabilityPublic.parse(data)) + .then((availability) => res.status(200).json({ availability })) .catch((error: Error) => res.status(404).json({ message: `Availability with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function availabilityById(req: NextApiRequest, res: NextApiResponse where: { id: safeQuery.data.id }, data: safeBody.data, }) - .then((availability) => schemaAvailabilityPublic.parse(availability)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaAvailabilityPublic.parse(data)) + .then((availability) => res.status(200).json({ availability })) .catch((error: Error) => res.status(404).json({ message: `Availability with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/availabilities/index.ts b/pages/api/availabilities/index.ts index 5449162d95..d0408a32aa 100644 --- a/pages/api/availabilities/index.ts +++ b/pages/api/availabilities/index.ts @@ -3,8 +3,8 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { AvailabilitiesResponse } from "@lib/types"; -import { schemaAvailabilityPublic } from "@lib/validations/availability"; +import { AvailabilityResponse, AvailabilitiesResponse } from "@lib/types"; +import { schemaAvailabilityBodyParams, schemaAvailabilityPublic } from "@lib/validations/availability"; /** * @swagger @@ -20,18 +20,49 @@ import { schemaAvailabilityPublic } from "@lib/validations/availability"; * description: Authorization information is missing or invalid. * 404: * description: No availabilities were found + * post: + * summary: Creates a new availability + * tags: + * - availabilities + * responses: + * 201: + * description: OK, availability created + * model: Availability + * 400: + * description: Bad request. Availability body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allAvailabilities(_: NextApiRequest, res: NextApiResponse) { - const availabilities = await prisma.availability.findMany(); - const data = availabilities.map((availability) => schemaAvailabilityPublic.parse(availability)); +async function createOrlistAllAvailabilities( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.availability.findMany(); + const availabilities = data.map((availability) => schemaAvailabilityPublic.parse(availability)); + if (availabilities) res.status(200).json({ availabilities }); + else + (error: Error) => + res.status(404).json({ + message: "No Availabilities were found", + error, + }); + } else if (method === "POST") { + const safe = schemaAvailabilityBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Availabilities were found", - error, - }); + const data = await prisma.availability.create({ data: safe.data }); + const availability = schemaAvailabilityPublic.parse(data); + + if (availability) res.status(201).json({ availability, message: "Availability created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new availability", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allAvailabilities); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllAvailabilities); diff --git a/pages/api/availabilities/new.ts b/pages/api/availabilities/new.ts deleted file mode 100644 index d7461ba803..0000000000 --- a/pages/api/availabilities/new.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { AvailabilityResponse } from "@lib/types"; -import { - schemaAvailabilityBodyParams, - schemaAvailabilityPublic, - withValidAvailability, -} from "@lib/validations/availability"; - -/** - * @swagger - * /api/availabilities/new: - * post: - * summary: Creates a new availability - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Availability' - * tags: - * - availabilities - * responses: - * 201: - * description: OK, availability created - * 400: - * description: Bad request. Availability body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createAvailability(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaAvailabilityBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const availability = await prisma.availability.create({ data: safe.data }); - const data = schemaAvailabilityPublic.parse(availability); - - if (data) res.status(201).json({ data, message: "Availability created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new availability", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidAvailability(createAvailability)); diff --git a/pages/api/booking-references/[id].ts b/pages/api/booking-references/[id].ts index 216d1282ff..659c48f46d 100644 --- a/pages/api/booking-references/[id].ts +++ b/pages/api/booking-references/[id].ts @@ -96,7 +96,7 @@ export async function bookingReferenceById( await prisma.bookingReference .findUnique({ where: { id: safeQuery.data.id } }) .then((data) => schemaBookingReferencePublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((booking_reference) => res.status(200).json({ booking_reference })) .catch((error: Error) => res.status(404).json({ message: `BookingReference with id: ${safeQuery.data.id} not found`, error }) ); @@ -109,8 +109,8 @@ export async function bookingReferenceById( where: { id: safeQuery.data.id }, data: safeBody.data, }) - .then((bookingReference) => schemaBookingReferencePublic.parse(bookingReference)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaBookingReferencePublic.parse(data)) + .then((booking_reference) => res.status(200).json({ booking_reference })) .catch((error: Error) => res.status(404).json({ message: `BookingReference with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/booking-references/index.ts b/pages/api/booking-references/index.ts index 312ccf4b78..df12d1c882 100644 --- a/pages/api/booking-references/index.ts +++ b/pages/api/booking-references/index.ts @@ -3,14 +3,17 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { BookingReferencesResponse } from "@lib/types"; -import { schemaBookingReferencePublic } from "@lib/validations/booking-reference"; +import { BookingReferenceResponse, BookingReferencesResponse } from "@lib/types"; +import { + schemaBookingReferenceBodyParams, + schemaBookingReferencePublic, +} from "@lib/validations/booking-reference"; /** * @swagger * /api/booking-references: * get: - * summary: Get all bookingReferences + * summary: Get all booking references * tags: * - booking-references * responses: @@ -19,21 +22,52 @@ import { schemaBookingReferencePublic } from "@lib/validations/booking-reference * 401: * description: Authorization information is missing or invalid. * 404: - * description: No bookingReferences were found + * description: No booking references were found + * post: + * summary: Creates a new booking reference + * tags: + * - booking-references + * responses: + * 201: + * description: OK, booking reference created + * model: BookingReference + * 400: + * description: Bad request. BookingReference body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allBookingReferences(_: NextApiRequest, res: NextApiResponse) { - const bookingReferences = await prisma.bookingReference.findMany(); - const data = bookingReferences.map((bookingReference) => - schemaBookingReferencePublic.parse(bookingReference) - ); +async function createOrlistAllBookingReferences( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.bookingReference.findMany(); + const booking_references = data.map((bookingReference) => + schemaBookingReferencePublic.parse(bookingReference) + ); + if (booking_references) res.status(200).json({ booking_references }); + else + (error: Error) => + res.status(404).json({ + message: "No BookingReferences were found", + error, + }); + } else if (method === "POST") { + const safe = schemaBookingReferenceBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No BookingReferences were found", - error, - }); + const data = await prisma.bookingReference.create({ data: safe.data }); + const booking_reference = schemaBookingReferencePublic.parse(data); + + if (data) res.status(201).json({ booking_reference, message: "BookingReference created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new booking reference", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allBookingReferences); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllBookingReferences); diff --git a/pages/api/booking-references/new.ts b/pages/api/booking-references/new.ts deleted file mode 100644 index 737156ae3f..0000000000 --- a/pages/api/booking-references/new.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { BookingReferenceResponse } from "@lib/types"; -import { - schemaBookingReferenceBodyParams, - schemaBookingReferencePublic, - withValidBookingReference, -} from "@lib/validations/booking-reference"; - -/** - * @swagger - * /api/booking-references/new: - * post: - * summary: Creates a new bookingReference - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/BookingReference' - * tags: - * - booking-references - * responses: - * 201: - * description: OK, bookingReference created - * 400: - * description: Bad request. BookingReference body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createBookingReference(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaBookingReferenceBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const bookingReference = await prisma.bookingReference.create({ data: safe.data }); - const data = schemaBookingReferencePublic.parse(bookingReference); - - if (data) res.status(201).json({ data, message: "BookingReference created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new bookingReference", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidBookingReference(createBookingReference)); diff --git a/pages/api/bookings/[id].ts b/pages/api/bookings/[id].ts index 852b32b983..f3104fc44e 100644 --- a/pages/api/bookings/[id].ts +++ b/pages/api/bookings/[id].ts @@ -89,8 +89,8 @@ export async function bookingById(req: NextApiRequest, res: NextApiResponse schemaBookingPublic.parse(booking)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaBookingPublic.parse(data)) + .then((booking) => res.status(200).json({ booking })) .catch((error: Error) => res.status(404).json({ message: `Booking with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function bookingById(req: NextApiRequest, res: NextApiResponse schemaBookingPublic.parse(booking)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaBookingPublic.parse(data)) + .then((booking) => res.status(200).json({ booking })) .catch((error: Error) => res.status(404).json({ message: `Booking with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/bookings/index.ts b/pages/api/bookings/index.ts index f2d724071c..dabf90f245 100644 --- a/pages/api/bookings/index.ts +++ b/pages/api/bookings/index.ts @@ -3,8 +3,8 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { BookingsResponse } from "@lib/types"; -import { schemaBookingPublic } from "@lib/validations/booking"; +import { BookingResponse, BookingsResponse } from "@lib/types"; +import { schemaBookingBodyParams, schemaBookingPublic, withValidBooking } from "@lib/validations/booking"; /** * @swagger @@ -20,18 +20,49 @@ import { schemaBookingPublic } from "@lib/validations/booking"; * description: Authorization information is missing or invalid. * 404: * description: No bookings were found + * post: + * summary: Creates a new booking + * tags: + * - bookings + * responses: + * 201: + * description: OK, booking created + * model: Booking + * 400: + * description: Bad request. Booking body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allBookings(_: NextApiRequest, res: NextApiResponse) { - const bookings = await prisma.booking.findMany(); - const data = bookings.map((booking) => schemaBookingPublic.parse(booking)); +async function createOrlistAllBookings( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.booking.findMany(); + const bookings = data.map((booking) => schemaBookingPublic.parse(booking)); + if (bookings) res.status(200).json({ bookings }); + else + (error: Error) => + res.status(404).json({ + message: "No Bookings were found", + error, + }); + } else if (method === "POST") { + const safe = schemaBookingBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Bookings were found", - error, - }); + const data = await prisma.booking.create({ data: safe.data }); + const booking = schemaBookingPublic.parse(data); + + if (booking) res.status(201).json({ booking, message: "Booking created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new booking", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allBookings); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllBookings); diff --git a/pages/api/bookings/new.ts b/pages/api/bookings/new.ts deleted file mode 100644 index 3e10e1c143..0000000000 --- a/pages/api/bookings/new.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { BookingResponse } from "@lib/types"; -import { schemaBookingBodyParams, schemaBookingPublic, withValidBooking } from "@lib/validations/booking"; - -/** - * @swagger - * /api/bookings/new: - * post: - * summary: Creates a new booking - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Booking' - * tags: - * - bookings - * responses: - * 201: - * description: OK, booking created - * model: Booking - * 400: - * description: Bad request. Booking body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createBooking(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaBookingBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const booking = await prisma.booking.create({ data: safe.data }); - const data = schemaBookingPublic.parse(booking); - - if (data) res.status(201).json({ data, message: "Booking created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new booking", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidBooking(createBooking)); diff --git a/pages/api/payments/[id].ts b/pages/api/payments/[id].ts index e026e62dc5..bdd8766c69 100644 --- a/pages/api/payments/[id].ts +++ b/pages/api/payments/[id].ts @@ -15,7 +15,7 @@ import { * @swagger * /api/payments/{id}: * get: - * summary: Get a payment by ID + * summary: Get one of your own payments by ID * parameters: * - in: path * name: id diff --git a/pages/api/schedules/index.ts b/pages/api/schedules/index.ts index 3458e4896b..e3b178d216 100644 --- a/pages/api/schedules/index.ts +++ b/pages/api/schedules/index.ts @@ -8,7 +8,7 @@ import { schemaScheduleBodyParams, schemaSchedulePublic, withValidSchedule } fro /** * @swagger - * /api/schedules: + * /v1/schedules: * get: * summary: Get all schedules * tags: diff --git a/pages/api/selected-calendars/[id].ts b/pages/api/selected-calendars/[id].ts index 900c2295db..b66fc5a888 100644 --- a/pages/api/selected-calendars/[id].ts +++ b/pages/api/selected-calendars/[id].ts @@ -139,7 +139,7 @@ export async function selectedCalendarById( }, }) .then((selectedCalendar) => schemaSelectedCalendarPublic.parse(selectedCalendar)) - .then((data) => res.status(200).json({ data })) + .then((selected_calendar) => res.status(200).json({ selected_calendar })) .catch((error: Error) => res.status(404).json({ message: `SelectedCalendar with id: ${safeQuery.data.id} not found`, error }) ); @@ -159,7 +159,7 @@ export async function selectedCalendarById( data: safeBody.data, }) .then((selectedCalendar) => schemaSelectedCalendarPublic.parse(selectedCalendar)) - .then((data) => res.status(200).json({ data })) + .then((selected_calendar) => res.status(200).json({ selected_calendar })) .catch((error: Error) => res.status(404).json({ message: `SelectedCalendar with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/selected-calendars/index.ts b/pages/api/selected-calendars/index.ts index faa2eb0e5c..a6a8a39c16 100644 --- a/pages/api/selected-calendars/index.ts +++ b/pages/api/selected-calendars/index.ts @@ -43,11 +43,11 @@ async function createOrlistAllSelectedCalendars( ) { const { method } = req; if (method === "GET") { - const selectedCalendars = await prisma.selectedCalendar.findMany(); - const data = selectedCalendars.map((selectedCalendar) => - schemaSelectedCalendarPublic.parse(selectedCalendar) + const data = await prisma.selectedCalendar.findMany(); + const selected_calendars = data.map((selected_calendar) => + schemaSelectedCalendarPublic.parse(selected_calendar) ); - if (data) res.status(200).json({ data }); + if (selected_calendars) res.status(200).json({ selected_calendars }); else (error: Error) => res.status(404).json({ @@ -58,14 +58,15 @@ async function createOrlistAllSelectedCalendars( const safe = schemaSelectedCalendarBodyParams.safeParse(req.body); if (!safe.success) throw new Error("Invalid request body"); - const selectedCalendar = await prisma.selectedCalendar.create({ data: safe.data }); - const data = schemaSelectedCalendarPublic.parse(selectedCalendar); + const data = await prisma.selectedCalendar.create({ data: safe.data }); + const selected_calendar = schemaSelectedCalendarPublic.parse(data); - if (data) res.status(201).json({ data, message: "SelectedCalendar created successfully" }); + if (selected_calendar) + res.status(201).json({ selected_calendar, message: "SelectedCalendar created successfully" }); else (error: Error) => res.status(400).json({ - message: "Could not create new selectedCalendar", + message: "Could not create new selected calendar", error, }); } else res.status(405).json({ message: `Method ${method} not allowed` }); diff --git a/pages/api/teams/[id].ts b/pages/api/teams/[id].ts index ef9f26845c..5435b18dc5 100644 --- a/pages/api/teams/[id].ts +++ b/pages/api/teams/[id].ts @@ -4,6 +4,7 @@ import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; import type { TeamResponse } from "@lib/types"; +import { getCalcomUserId } from "@lib/utils/getCalcomUserId"; import { schemaQueryIdParseInt, withValidQueryIdTransformParseInt, @@ -84,13 +85,17 @@ export async function teamById(req: NextApiRequest, res: NextApiResponse schemaTeamPublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((team) => res.status(200).json({ team })) .catch((error: Error) => res.status(404).json({ message: `Team with id: ${safeQuery.data.id} not found`, error }) ); @@ -104,7 +109,7 @@ export async function teamById(req: NextApiRequest, res: NextApiResponse schemaTeamPublic.parse(team)) - .then((data) => res.status(200).json({ data })) + .then((team) => res.status(200).json({ team })) .catch((error: Error) => res.status(404).json({ message: `Team with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/teams/index.ts b/pages/api/teams/index.ts index 6184a5e1bd..5e68236e2e 100644 --- a/pages/api/teams/index.ts +++ b/pages/api/teams/index.ts @@ -4,6 +4,7 @@ import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; import { TeamResponse, TeamsResponse } from "@lib/types"; +import { getCalcomUserId } from "@lib/utils/getCalcomUserId"; import { schemaTeamBodyParams, schemaTeamPublic, withValidTeam } from "@lib/validations/team"; /** @@ -35,10 +36,14 @@ import { schemaTeamBodyParams, schemaTeamPublic, withValidTeam } from "@lib/vali */ async function createOrlistAllTeams(req: NextApiRequest, res: NextApiResponse) { const { method } = req; + const userId = getCalcomUserId(res); if (method === "GET") { - const teams = await prisma.team.findMany(); - const data = teams.map((team) => schemaTeamPublic.parse(team)); - if (data) res.status(200).json({ data }); + const userWithMemberships = await prisma.membership.findMany({ + where: { userId: userId }, + }); + const teamIds = userWithMemberships.map((membership) => membership.teamId); + const teams = await prisma.team.findMany({ where: { id: { in: teamIds } } }); + if (teams) res.status(200).json({ teams }); else (error: Error) => res.status(404).json({ @@ -46,13 +51,17 @@ async function createOrlistAllTeams(req: NextApiRequest, res: NextApiResponse res.status(400).json({ @@ -62,4 +71,4 @@ async function createOrlistAllTeams(req: NextApiRequest, res: NextApiResponse schemaUserPublic.parse(user)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaUserPublic.parse(data)) + .then((user) => res.status(200).json({ user })) .catch((error: Error) => res.status(404).json({ message: `User with id: ${safeQuery.data.id} not found`, error }) ); @@ -105,8 +105,8 @@ export async function userById(req: NextApiRequest, res: NextApiResponse schemaUserPublic.parse(user)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaUserPublic.parse(data)) + .then((user) => res.status(200).json({ user })) .catch((error: Error) => res.status(404).json({ message: `User with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/users/index.ts b/pages/api/users/index.ts index 1d11d751d5..138395adba 100644 --- a/pages/api/users/index.ts +++ b/pages/api/users/index.ts @@ -24,13 +24,13 @@ import { schemaUserPublic } from "@lib/validations/user"; */ async function allUsers(req: NextApiRequest, res: NextApiResponse) { const userId = getCalcomUserId(res); - const users = await prisma.user.findMany({ + const data = await prisma.user.findMany({ where: { id: userId, }, }); - const data = users.map((user) => schemaUserPublic.parse(user)); - if (data) res.status(200).json({ data }); + const users = data.map((user) => schemaUserPublic.parse(user)); + if (users) res.status(200).json({ users }); else (error: Error) => res.status(404).json({ diff --git a/templates/endpoints/newIndex.ts b/templates/endpoints/newIndex.ts index 732eb013b2..5d608ee0cb 100644 --- a/templates/endpoints/newIndex.ts +++ b/templates/endpoints/newIndex.ts @@ -65,4 +65,4 @@ async function createOrlistAllPayments( } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET_OR_POST")(withValidPayment(createOrlistAllPayments)); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllPayments); From 0bda98867665ba9e5745b315b6525085abc8925c Mon Sep 17 00:00:00 2001 From: Agusti Fernandez Pardo Date: Mon, 11 Apr 2022 15:10:16 +0200 Subject: [PATCH 5/5] feat: all resources endpoints for get all and new unified --- pages/api/attendees/[id].ts | 2 +- pages/api/attendees/index.ts | 2 +- pages/api/availabilities/[id].ts | 2 +- pages/api/availabilities/index.ts | 2 +- pages/api/booking-references/[id].ts | 3 +- pages/api/booking-references/index.ts | 2 +- pages/api/bookings/[id].ts | 4 +- pages/api/bookings/index.ts | 4 +- pages/api/credentials/[id].ts | 10 +-- pages/api/credentials/index.ts | 57 ++++++++++---- pages/api/credentials/new.ts | 52 ------------- pages/api/daily-event-references/[id].ts | 8 +- pages/api/daily-event-references/index.ts | 74 +++++++++++++------ pages/api/daily-event-references/new.ts | 55 -------------- pages/api/destination-calendars/[id].ts | 8 +- pages/api/destination-calendars/index.ts | 70 +++++++++++++----- pages/api/destination-calendars/new.ts | 55 -------------- pages/api/event-type-custom-inputs/[id].ts | 8 +- pages/api/event-type-custom-inputs/index.ts | 68 ++++++++++++----- pages/api/event-type-custom-inputs/new.ts | 55 -------------- pages/api/event-types/[id].ts | 8 +- pages/api/event-types/index.ts | 63 ++++++++++++---- pages/api/event-types/new.ts | 45 ----------- pages/api/memberships/[id].ts | 10 +-- pages/api/memberships/index.ts | 61 +++++++++++---- pages/api/memberships/new.ts | 45 ----------- pages/api/payments/[id].ts | 10 +-- pages/api/payments/index.ts | 10 +-- pages/api/reminder-mails/[id].ts | 6 +- pages/api/reminder-mails/index.ts | 12 +-- pages/api/schedules/[id].ts | 8 +- pages/api/schedules/index.ts | 12 +-- templates/endpoints/[id]/delete.ts | 2 +- templates/endpoints/[id]/edit.ts | 8 +- templates/endpoints/[id]/index.ts | 4 +- templates/endpoints/{index.ts => get_all.ts} | 2 +- .../{newIndex.ts => get_all_and_post.ts} | 4 +- templates/endpoints/{new.ts => post.ts} | 2 +- 38 files changed, 370 insertions(+), 483 deletions(-) delete mode 100644 pages/api/credentials/new.ts delete mode 100644 pages/api/daily-event-references/new.ts delete mode 100644 pages/api/destination-calendars/new.ts delete mode 100644 pages/api/event-type-custom-inputs/new.ts delete mode 100644 pages/api/event-types/new.ts delete mode 100644 pages/api/memberships/new.ts rename templates/endpoints/{index.ts => get_all.ts} (98%) rename templates/endpoints/{newIndex.ts => get_all_and_post.ts} (94%) rename templates/endpoints/{new.ts => post.ts} (98%) diff --git a/pages/api/attendees/[id].ts b/pages/api/attendees/[id].ts index 6044c6cc74..093579a799 100644 --- a/pages/api/attendees/[id].ts +++ b/pages/api/attendees/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/attendees/{id}: + * /v1/attendees/{id}: * get: * summary: Get an attendee by ID * parameters: diff --git a/pages/api/attendees/index.ts b/pages/api/attendees/index.ts index d9f7429325..509907bb8d 100644 --- a/pages/api/attendees/index.ts +++ b/pages/api/attendees/index.ts @@ -9,7 +9,7 @@ import { schemaAttendeeBodyParams, schemaAttendeePublic, withValidAttendee } fro /** * @swagger - * /api/attendees: + * /v1/attendees: * get: * summary: Get all attendees * tags: diff --git a/pages/api/availabilities/[id].ts b/pages/api/availabilities/[id].ts index 1c126ff2c2..34bab03008 100644 --- a/pages/api/availabilities/[id].ts +++ b/pages/api/availabilities/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/availabilities/{id}: + * /v1/availabilities/{id}: * get: * summary: Get an availability by ID * parameters: diff --git a/pages/api/availabilities/index.ts b/pages/api/availabilities/index.ts index d0408a32aa..9778bfdbfa 100644 --- a/pages/api/availabilities/index.ts +++ b/pages/api/availabilities/index.ts @@ -8,7 +8,7 @@ import { schemaAvailabilityBodyParams, schemaAvailabilityPublic } from "@lib/val /** * @swagger - * /api/availabilities: + * /v1/availabilities: * get: * summary: Get all availabilities * tags: diff --git a/pages/api/booking-references/[id].ts b/pages/api/booking-references/[id].ts index 659c48f46d..2d48aa7413 100644 --- a/pages/api/booking-references/[id].ts +++ b/pages/api/booking-references/[id].ts @@ -15,7 +15,7 @@ import { /** * @swagger - * /api/booking-references/{id}: + * /v1/booking-references/{id}: * get: * summary: Get a daily event reference by ID * parameters: @@ -90,6 +90,7 @@ export async function bookingReferenceById( const safeQuery = schemaQueryIdParseInt.safeParse(query); const safeBody = schemaBookingReferenceBodyParams.safeParse(body); if (!safeQuery.success) throw new Error("Invalid request query", safeQuery.error); + // FIXME: Allow only userId owner of booking ref to edit it switch (method) { case "GET": diff --git a/pages/api/booking-references/index.ts b/pages/api/booking-references/index.ts index df12d1c882..0ca58c2f8a 100644 --- a/pages/api/booking-references/index.ts +++ b/pages/api/booking-references/index.ts @@ -11,7 +11,7 @@ import { /** * @swagger - * /api/booking-references: + * /v1/booking-references: * get: * summary: Get all booking references * tags: diff --git a/pages/api/bookings/[id].ts b/pages/api/bookings/[id].ts index f3104fc44e..45f24774e6 100644 --- a/pages/api/bookings/[id].ts +++ b/pages/api/bookings/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/bookings/{id}: + * /v1/bookings/{id}: * get: * summary: Get a booking by ID * parameters: @@ -84,7 +84,7 @@ export async function bookingById(req: NextApiRequest, res: NextApiResponse ) { const { method } = req; + // FIXME: List only bookings owner by userId + if (method === "GET") { const data = await prisma.booking.findMany(); const bookings = data.map((booking) => schemaBookingPublic.parse(booking)); diff --git a/pages/api/credentials/[id].ts b/pages/api/credentials/[id].ts index 16c60007a4..bb82d0f019 100644 --- a/pages/api/credentials/[id].ts +++ b/pages/api/credentials/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/credentials/{id}: + * /v1/credentials/{id}: * get: * summary: Get a credential by ID * parameters: @@ -89,8 +89,8 @@ export async function credentialById(req: NextApiRequest, res: NextApiResponse schemaCredentialPublic.parse(credential)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaCredentialPublic.parse(data)) + .then((credential) => res.status(200).json({ credential })) .catch((error: Error) => res.status(404).json({ message: `Credential with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function credentialById(req: NextApiRequest, res: NextApiResponse schemaCredentialPublic.parse(credential)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaCredentialPublic.parse(data)) + .then((credential) => res.status(200).json({ credential })) .catch((error: Error) => res.status(404).json({ message: `Credential with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/credentials/index.ts b/pages/api/credentials/index.ts index 1ef98a95df..8ba9a5aeb5 100644 --- a/pages/api/credentials/index.ts +++ b/pages/api/credentials/index.ts @@ -3,8 +3,8 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { CredentialsResponse } from "@lib/types"; -import { schemaCredentialPublic } from "@lib/validations/credential"; +import { CredentialResponse, CredentialsResponse } from "@lib/types"; +import { schemaCredentialBodyParams, schemaCredentialPublic } from "@lib/validations/credential"; /** * @swagger @@ -20,18 +20,49 @@ import { schemaCredentialPublic } from "@lib/validations/credential"; * description: Authorization information is missing or invalid. * 404: * description: No credentials were found + * post: + * summary: Creates a new credential + * tags: + * - credentials + * responses: + * 201: + * description: OK, credential created + * model: Credential + * 400: + * description: Bad request. Credential body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allCredentials(_: NextApiRequest, res: NextApiResponse) { - const credentials = await prisma.credential.findMany(); - const data = credentials.map((credential) => schemaCredentialPublic.parse(credential)); +async function createOrlistAllCredentials( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.credential.findMany(); + const credentials = data.map((credential) => schemaCredentialPublic.parse(credential)); + if (credentials) res.status(200).json({ credentials }); + else + (error: Error) => + res.status(404).json({ + message: "No Credentials were found", + error, + }); + } else if (method === "POST") { + const safe = schemaCredentialBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Credentials were found", - error, - }); + const data = await prisma.credential.create({ data: safe.data }); + const credential = schemaCredentialPublic.parse(data); + + if (credential) res.status(201).json({ credential, message: "Credential created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new credential", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allCredentials); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllCredentials); diff --git a/pages/api/credentials/new.ts b/pages/api/credentials/new.ts deleted file mode 100644 index 39302c7a1d..0000000000 --- a/pages/api/credentials/new.ts +++ /dev/null @@ -1,52 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { CredentialResponse } from "@lib/types"; -import { - schemaCredentialBodyParams, - schemaCredentialPublic, - withValidCredential, -} from "@lib/validations/credential"; - -/** - * @swagger - * /api/credentials/new: - * post: - * summary: Creates a new credential - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Credential' - * tags: - * - credentials - * responses: - * 201: - * description: OK, credential created - * model: Credential - * 400: - * description: Bad request. Credential body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createCredential(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaCredentialBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const credential = await prisma.credential.create({ data: safe.data }); - const data = schemaCredentialPublic.parse(credential); - - if (data) res.status(201).json({ data, message: "Credential created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new credential", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidCredential(createCredential)); diff --git a/pages/api/daily-event-references/[id].ts b/pages/api/daily-event-references/[id].ts index d150cf69ce..482aab6ec1 100644 --- a/pages/api/daily-event-references/[id].ts +++ b/pages/api/daily-event-references/[id].ts @@ -15,7 +15,7 @@ import { /** * @swagger - * /api/daily-event-references/{id}: + * /v1/daily-event-references/{id}: * get: * summary: Get a daily event reference by ID * parameters: @@ -96,7 +96,7 @@ export async function dailyEventReferenceById( await prisma.dailyEventReference .findUnique({ where: { id: safeQuery.data.id } }) .then((data) => schemaDailyEventReferencePublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((daily_event_reference) => res.status(200).json({ daily_event_reference })) .catch((error: Error) => res .status(404) @@ -111,8 +111,8 @@ export async function dailyEventReferenceById( where: { id: safeQuery.data.id }, data: safeBody.data, }) - .then((dailyEventReference) => schemaDailyEventReferencePublic.parse(dailyEventReference)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaDailyEventReferencePublic.parse(data)) + .then((daily_event_reference) => res.status(200).json({ daily_event_reference })) .catch((error: Error) => res .status(404) diff --git a/pages/api/daily-event-references/index.ts b/pages/api/daily-event-references/index.ts index d4495ef0f1..1a1762157d 100644 --- a/pages/api/daily-event-references/index.ts +++ b/pages/api/daily-event-references/index.ts @@ -3,40 +3,72 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { DailyEventReferencesResponse } from "@lib/types"; -import { schemaDailyEventReferencePublic } from "@lib/validations/daily-event-reference"; +import { DailyEventReferenceResponse, DailyEventReferencesResponse } from "@lib/types"; +import { + schemaDailyEventReferenceBodyParams, + schemaDailyEventReferencePublic, +} from "@lib/validations/daily-event-reference"; /** * @swagger - * /api/daily-event-references: + * /v1/daily-event-references: * get: - * summary: Get all dailyEventReferences + * summary: Get all daily event reference * tags: - * - daily-event-references + * - daily-event-reference * responses: * 200: * description: OK * 401: * description: Authorization information is missing or invalid. * 404: - * description: No dailyEventReferences were found + * description: No daily event references were found + * post: + * summary: Creates a new daily event reference + * tags: + * - daily-event-reference + * responses: + * 201: + * description: OK, daily event reference created + * model: DailyEventReference + * 400: + * description: Bad request. DailyEventReference body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allDailyEventReferences( - _: NextApiRequest, - res: NextApiResponse +async function createOrlistAllDailyEventReferences( + req: NextApiRequest, + res: NextApiResponse ) { - const dailyEventReferences = await prisma.dailyEventReference.findMany(); - const data = dailyEventReferences.map((dailyEventReference) => - schemaDailyEventReferencePublic.parse(dailyEventReference) - ); + const { method } = req; + if (method === "GET") { + const data = await prisma.dailyEventReference.findMany(); + const daily_event_references = data.map((dailyEventReference) => + schemaDailyEventReferencePublic.parse(dailyEventReference) + ); + if (daily_event_references) res.status(200).json({ daily_event_references }); + else + (error: Error) => + res.status(404).json({ + message: "No DailyEventReferences were found", + error, + }); + } else if (method === "POST") { + const safe = schemaDailyEventReferenceBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No DailyEventReferences were found", - error, - }); + const data = await prisma.dailyEventReference.create({ data: safe.data }); + const daily_event_reference = schemaDailyEventReferencePublic.parse(data); + + if (daily_event_reference) + res.status(201).json({ daily_event_reference, message: "DailyEventReference created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new daily event reference", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allDailyEventReferences); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllDailyEventReferences); diff --git a/pages/api/daily-event-references/new.ts b/pages/api/daily-event-references/new.ts deleted file mode 100644 index 1e61a7fa59..0000000000 --- a/pages/api/daily-event-references/new.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { DailyEventReferenceResponse } from "@lib/types"; -import { - schemaDailyEventReferenceBodyParams, - schemaDailyEventReferencePublic, - withValidDailyEventReference, -} from "@lib/validations/daily-event-reference"; - -/** - * @swagger - * /api/daily-event-references/new: - * post: - * summary: Creates a new dailyEventReference - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/DailyEventReference' - * tags: - * - daily-event-references - * responses: - * 201: - * description: OK, dailyEventReference created - * model: DailyEventReference - * 400: - * description: Bad request. DailyEventReference body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createDailyEventReference( - req: NextApiRequest, - res: NextApiResponse -) { - const safe = schemaDailyEventReferenceBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const dailyEventReference = await prisma.dailyEventReference.create({ data: safe.data }); - const data = schemaDailyEventReferencePublic.parse(dailyEventReference); - - if (data) res.status(201).json({ data, message: "DailyEventReference created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new dailyEventReference", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidDailyEventReference(createDailyEventReference)); diff --git a/pages/api/destination-calendars/[id].ts b/pages/api/destination-calendars/[id].ts index 16c5fba7be..a72bcecba1 100644 --- a/pages/api/destination-calendars/[id].ts +++ b/pages/api/destination-calendars/[id].ts @@ -15,7 +15,7 @@ import { /** * @swagger - * /api/destination-calendars/{id}: + * /v1/destination-calendars/{id}: * get: * summary: Get a destination calendar by ID * parameters: @@ -96,7 +96,7 @@ export async function destionationCalendarById( await prisma.destinationCalendar .findUnique({ where: { id: safeQuery.data.id } }) .then((data) => schemaDestinationCalendarPublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((destination_calendar) => res.status(200).json({ destination_calendar })) .catch((error: Error) => res .status(404) @@ -111,8 +111,8 @@ export async function destionationCalendarById( where: { id: safeQuery.data.id }, data: safeBody.data, }) - .then((destinationCalendar) => schemaDestinationCalendarPublic.parse(destinationCalendar)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaDestinationCalendarPublic.parse(data)) + .then((destination_calendar) => res.status(200).json({ destination_calendar })) .catch((error: Error) => res .status(404) diff --git a/pages/api/destination-calendars/index.ts b/pages/api/destination-calendars/index.ts index b031b8a27e..3557272970 100644 --- a/pages/api/destination-calendars/index.ts +++ b/pages/api/destination-calendars/index.ts @@ -3,12 +3,15 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { DestinationCalendarsResponse } from "@lib/types"; -import { schemaDestinationCalendarPublic } from "@lib/validations/destination-calendar"; +import { DestinationCalendarResponse, DestinationCalendarsResponse } from "@lib/types"; +import { + schemaDestinationCalendarBodyParams, + schemaDestinationCalendarPublic, +} from "@lib/validations/destination-calendar"; /** * @swagger - * /api/destination-calendars: + * /v1/destination-calendars: * get: * summary: Get all destination calendars * tags: @@ -19,24 +22,53 @@ import { schemaDestinationCalendarPublic } from "@lib/validations/destination-ca * 401: * description: Authorization information is missing or invalid. * 404: - * description: No destinationCalendars were found + * description: No destination calendars were found + * post: + * summary: Creates a new destination calendar + * tags: + * - destination-calendars + * responses: + * 201: + * description: OK, destination calendar created + * model: DestinationCalendar + * 400: + * description: Bad request. DestinationCalendar body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allDestinationCalendars( - _: NextApiRequest, - res: NextApiResponse +async function createOrlistAllDestinationCalendars( + req: NextApiRequest, + res: NextApiResponse ) { - const destinationCalendars = await prisma.destinationCalendar.findMany(); - const data = destinationCalendars.map((destinationCalendar) => - schemaDestinationCalendarPublic.parse(destinationCalendar) - ); + const { method } = req; + if (method === "GET") { + const data = await prisma.destinationCalendar.findMany(); + const destination_calendars = data.map((destinationCalendar) => + schemaDestinationCalendarPublic.parse(destinationCalendar) + ); + if (data) res.status(200).json({ destination_calendars }); + else + (error: Error) => + res.status(404).json({ + message: "No DestinationCalendars were found", + error, + }); + } else if (method === "POST") { + const safe = schemaDestinationCalendarBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No DestinationCalendars were found", - error, - }); + const data = await prisma.destinationCalendar.create({ data: safe.data }); + const destination_calendar = schemaDestinationCalendarPublic.parse(data); + + if (destination_calendar) + res.status(201).json({ destination_calendar, message: "DestinationCalendar created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new destinationCalendar", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allDestinationCalendars); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllDestinationCalendars); diff --git a/pages/api/destination-calendars/new.ts b/pages/api/destination-calendars/new.ts deleted file mode 100644 index e98472b216..0000000000 --- a/pages/api/destination-calendars/new.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { DestinationCalendarResponse } from "@lib/types"; -import { - schemaDestinationCalendarBodyParams, - schemaDestinationCalendarPublic, - withValidDestinationCalendar, -} from "@lib/validations/destination-calendar"; - -/** - * @swagger - * /api/destination-calendars/new: - * post: - * summary: Creates a new destination calendar - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/DestinationCalendar' - * tags: - * - destination-calendars - * responses: - * 201: - * description: OK, destinationCalendar created - * model: DestinationCalendar - * 400: - * description: Bad request. DestinationCalendar body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createDestinationCalendar( - req: NextApiRequest, - res: NextApiResponse -) { - const safe = schemaDestinationCalendarBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const destinationCalendar = await prisma.destinationCalendar.create({ data: safe.data }); - const data = schemaDestinationCalendarPublic.parse(destinationCalendar); - - if (data) res.status(201).json({ data, message: "DestinationCalendar created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new destinationCalendar", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidDestinationCalendar(createDestinationCalendar)); diff --git a/pages/api/event-type-custom-inputs/[id].ts b/pages/api/event-type-custom-inputs/[id].ts index c737b5fb84..62b61d9c92 100644 --- a/pages/api/event-type-custom-inputs/[id].ts +++ b/pages/api/event-type-custom-inputs/[id].ts @@ -15,7 +15,7 @@ import { /** * @swagger - * /api/event-type-custom-inputs/{id}: + * /v1/event-type-custom-inputs/{id}: * get: * summary: Get a eventTypeCustomInput by ID * parameters: @@ -93,7 +93,7 @@ async function eventTypeById(req: NextApiRequest, res: NextApiResponse schemaEventTypeCustomInputPublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((event_type_custom_input) => res.status(200).json({ event_type_custom_input })) .catch((error: Error) => res.status(404).json({ message: `EventType with id: ${safeQuery.data.id} not found`, error }) ); @@ -106,8 +106,8 @@ async function eventTypeById(req: NextApiRequest, res: NextApiResponse schemaEventTypeCustomInputPublic.parse(eventTypeCustomInput)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaEventTypeCustomInputPublic.parse(data)) + .then((event_type_custom_input) => res.status(200).json({ event_type_custom_input })) .catch((error: Error) => res.status(404).json({ message: `EventType with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/event-type-custom-inputs/index.ts b/pages/api/event-type-custom-inputs/index.ts index d1c8e3ad90..f988adc281 100644 --- a/pages/api/event-type-custom-inputs/index.ts +++ b/pages/api/event-type-custom-inputs/index.ts @@ -3,12 +3,15 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { EventTypeCustomInputsResponse } from "@lib/types"; -import { schemaEventTypeCustomInputPublic } from "@lib/validations/event-type-custom-input"; +import { EventTypeCustomInputResponse, EventTypeCustomInputsResponse } from "@lib/types"; +import { + schemaEventTypeCustomInputBodyParams, + schemaEventTypeCustomInputPublic, +} from "@lib/validations/event-type-custom-input"; /** * @swagger - * /api/event-type-custom-inputs: + * /v1/event-type-custom-inputs: * get: * summary: Get all eventTypeCustomInputs * tags: @@ -20,23 +23,52 @@ import { schemaEventTypeCustomInputPublic } from "@lib/validations/event-type-cu * description: Authorization information is missing or invalid. * 404: * description: No eventTypeCustomInputs were found + * post: + * summary: Creates a new eventTypeCustomInput + * tags: + * - event-type-custom-inputs + * responses: + * 201: + * description: OK, eventTypeCustomInput created + * model: EventTypeCustomInput + * 400: + * description: Bad request. EventTypeCustomInput body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allEventTypeCustomInputs( - _: NextApiRequest, - res: NextApiResponse +async function createOrlistAllEventTypeCustomInputs( + req: NextApiRequest, + res: NextApiResponse ) { - const eventTypeCustomInputs = await prisma.eventTypeCustomInput.findMany(); - const data = eventTypeCustomInputs.map((eventTypeCustomInput) => - schemaEventTypeCustomInputPublic.parse(eventTypeCustomInput) - ); + const { method } = req; + if (method === "GET") { + const data = await prisma.eventTypeCustomInput.findMany(); + const event_type_custom_inputs = data.map((eventTypeCustomInput) => + schemaEventTypeCustomInputPublic.parse(eventTypeCustomInput) + ); + if (event_type_custom_inputs) res.status(200).json({ event_type_custom_inputs }); + else + (error: Error) => + res.status(404).json({ + message: "No EventTypeCustomInputs were found", + error, + }); + } else if (method === "POST") { + const safe = schemaEventTypeCustomInputBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No EventTypeCustomInputs were found", - error, - }); + const data = await prisma.eventTypeCustomInput.create({ data: safe.data }); + const event_type_custom_input = schemaEventTypeCustomInputPublic.parse(data); + + if (event_type_custom_input) + res.status(201).json({ event_type_custom_input, message: "EventTypeCustomInput created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new eventTypeCustomInput", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allEventTypeCustomInputs); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllEventTypeCustomInputs); diff --git a/pages/api/event-type-custom-inputs/new.ts b/pages/api/event-type-custom-inputs/new.ts deleted file mode 100644 index 3d64c296dd..0000000000 --- a/pages/api/event-type-custom-inputs/new.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { EventTypeCustomInputResponse } from "@lib/types"; -import { - schemaEventTypeCustomInputBodyParams, - schemaEventTypeCustomInputPublic, - withValidEventTypeCustomInput, -} from "@lib/validations/event-type-custom-input"; - -/** - * @swagger - * /api/event-type-custom-inputs/new: - * post: - * summary: Creates a new eventTypeCustomInput - * requestBody: - * description: Optional description in *Markdown* - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/EventTypeCustomInput' - * tags: - * - event-type-custom-inputs - * responses: - * 201: - * description: OK, eventTypeCustomInput created - * model: EventTypeCustomInput - * 400: - * description: Bad request. EventTypeCustomInput body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createEventTypeCustomInput( - req: NextApiRequest, - res: NextApiResponse -) { - const safe = schemaEventTypeCustomInputBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const eventTypeCustomInput = await prisma.eventTypeCustomInput.create({ data: safe.data }); - const data = schemaEventTypeCustomInputPublic.parse(eventTypeCustomInput); - - if (data) res.status(201).json({ data, message: "EventTypeCustomInput created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new eventTypeCustomInput", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidEventTypeCustomInput(createEventTypeCustomInput)); diff --git a/pages/api/event-types/[id].ts b/pages/api/event-types/[id].ts index dd441f5cd3..e3ffe87f9b 100644 --- a/pages/api/event-types/[id].ts +++ b/pages/api/event-types/[id].ts @@ -12,7 +12,7 @@ import { /** * @swagger - * /api/event-types/{id}: + * /v1/event-types/{id}: * get: * summary: Get a eventType by ID * parameters: @@ -90,7 +90,7 @@ export async function eventTypeById(req: NextApiRequest, res: NextApiResponse schemaEventTypePublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((event_type) => res.status(200).json({ event_type })) .catch((error: Error) => res.status(404).json({ message: `EventType with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function eventTypeById(req: NextApiRequest, res: NextApiResponse schemaEventTypePublic.parse(eventType)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaEventTypePublic.parse(data)) + .then((event_type) => res.status(200).json({ event_type })) .catch((error: Error) => res.status(404).json({ message: `EventType with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/event-types/index.ts b/pages/api/event-types/index.ts index a626490919..724f0e9769 100644 --- a/pages/api/event-types/index.ts +++ b/pages/api/event-types/index.ts @@ -3,14 +3,14 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { EventTypesResponse } from "@lib/types"; -import { schemaEventTypePublic } from "@lib/validations/event-type"; +import { EventTypeResponse, EventTypesResponse } from "@lib/types"; +import { schemaEventTypeBodyParams, schemaEventTypePublic } from "@lib/validations/event-type"; /** * @swagger - * /api/eventTypes: + * /v1/event-types: * get: - * summary: Returns all eventTypes + * summary: Get all event types * tags: * - event-types * responses: @@ -19,19 +19,50 @@ import { schemaEventTypePublic } from "@lib/validations/event-type"; * 401: * description: Authorization information is missing or invalid. * 404: - * description: No eventTypes were found + * description: No event types were found + * post: + * summary: Creates a new event type + * tags: + * - event-types + * responses: + * 201: + * description: OK, event type created + * model: EventType + * 400: + * description: Bad request. EventType body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allEventTypes(_: NextApiRequest, res: NextApiResponse) { - const eventTypes = await prisma.eventType.findMany(); - const data = eventTypes.map((eventType) => schemaEventTypePublic.parse(eventType)); +async function createOrlistAllEventTypes( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.eventType.findMany(); + const event_types = data.map((eventType) => schemaEventTypePublic.parse(eventType)); + if (event_types) res.status(200).json({ event_types }); + else + (error: Error) => + res.status(404).json({ + message: "No EventTypes were found", + error, + }); + } else if (method === "POST") { + const safe = schemaEventTypeBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No EventTypes were found", - error, - }); + const data = await prisma.eventType.create({ data: safe.data }); + const event_type = schemaEventTypePublic.parse(data); + + if (data) res.status(201).json({ event_type, message: "EventType created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new event type", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allEventTypes); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllEventTypes); diff --git a/pages/api/event-types/new.ts b/pages/api/event-types/new.ts deleted file mode 100644 index 491057c453..0000000000 --- a/pages/api/event-types/new.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { EventTypeResponse } from "@lib/types"; -import { - schemaEventTypeBodyParams, - schemaEventTypePublic, - withValidEventType, -} from "@lib/validations/event-type"; - -/** - * @swagger - * /api/event-types/new: - * post: - * summary: Creates a new eventType - * tags: - * - event-types - * responses: - * 201: - * description: OK, eventType created - * model: EventType - * 400: - * description: Bad request. EventType body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createEventType(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaEventTypeBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const eventType = await prisma.eventType.create({ data: safe.data }); - const data = schemaEventTypePublic.parse(eventType); - - if (data) res.status(201).json({ data, message: "EventType created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new eventType", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidEventType(createEventType)); diff --git a/pages/api/memberships/[id].ts b/pages/api/memberships/[id].ts index 61f78cc6e8..a963c023f5 100644 --- a/pages/api/memberships/[id].ts +++ b/pages/api/memberships/[id].ts @@ -9,7 +9,7 @@ import { schemaQueryIdAsString, withValidQueryIdString } from "@lib/validations/ /** * @swagger - * /api/memberships/{userId}_{teamId}: + * /v1/memberships/{userId}_{teamId}: * get: * summary: Get a membership by userID and teamID * parameters: @@ -106,8 +106,8 @@ export async function membershipById(req: NextApiRequest, res: NextApiResponse schemaMembershipPublic.parse(membership)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaMembershipPublic.parse(data)) + .then((membership) => res.status(200).json({ membership })) .catch((error: Error) => res.status(404).json({ message: `Membership with id: ${safeQuery.data.id} not found`, error }) ); @@ -120,8 +120,8 @@ export async function membershipById(req: NextApiRequest, res: NextApiResponse schemaMembershipPublic.parse(membership)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaMembershipPublic.parse(data)) + .then((membership) => res.status(200).json({ membership })) .catch((error: Error) => res.status(404).json({ message: `Membership with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/memberships/index.ts b/pages/api/memberships/index.ts index d53670ce92..54b6e70c16 100644 --- a/pages/api/memberships/index.ts +++ b/pages/api/memberships/index.ts @@ -3,14 +3,14 @@ import type { NextApiRequest, NextApiResponse } from "next"; import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; -import { MembershipsResponse } from "@lib/types"; -import { schemaMembershipPublic } from "@lib/validations/membership"; +import { MembershipResponse, MembershipsResponse } from "@lib/types"; +import { schemaMembershipBodyParams, schemaMembershipPublic } from "@lib/validations/membership"; /** * @swagger - * /api/memberships: + * /v1/memberships: * get: - * summary: Returns all memberships + * summary: Get all memberships * tags: * - memberships * responses: @@ -20,18 +20,49 @@ import { schemaMembershipPublic } from "@lib/validations/membership"; * description: Authorization information is missing or invalid. * 404: * description: No memberships were found + * post: + * summary: Creates a new membership + * tags: + * - memberships + * responses: + * 201: + * description: OK, membership created + * model: Membership + * 400: + * description: Bad request. Membership body is invalid. + * 401: + * description: Authorization information is missing or invalid. */ -async function allMemberships(_: NextApiRequest, res: NextApiResponse) { - const memberships = await prisma.membership.findMany(); - const data = memberships.map((membership) => schemaMembershipPublic.parse(membership)); +async function createOrlistAllMemberships( + req: NextApiRequest, + res: NextApiResponse +) { + const { method } = req; + if (method === "GET") { + const data = await prisma.membership.findMany(); + const memberships = data.map((membership) => schemaMembershipPublic.parse(membership)); + if (memberships) res.status(200).json({ memberships }); + else + (error: Error) => + res.status(404).json({ + message: "No Memberships were found", + error, + }); + } else if (method === "POST") { + const safe = schemaMembershipBodyParams.safeParse(req.body); + if (!safe.success) throw new Error("Invalid request body"); - if (data) res.status(200).json({ data }); - else - (error: Error) => - res.status(404).json({ - message: "No Memberships were found", - error, - }); + const data = await prisma.membership.create({ data: safe.data }); + const membership = schemaMembershipPublic.parse(data); + + if (membership) res.status(201).json({ membership, message: "Membership created successfully" }); + else + (error: Error) => + res.status(400).json({ + message: "Could not create new membership", + error, + }); + } else res.status(405).json({ message: `Method ${method} not allowed` }); } -export default withMiddleware("HTTP_GET")(allMemberships); +export default withMiddleware("HTTP_GET_OR_POST")(createOrlistAllMemberships); diff --git a/pages/api/memberships/new.ts b/pages/api/memberships/new.ts deleted file mode 100644 index e3b9dbe02f..0000000000 --- a/pages/api/memberships/new.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { NextApiRequest, NextApiResponse } from "next"; - -import prisma from "@calcom/prisma"; - -import { withMiddleware } from "@lib/helpers/withMiddleware"; -import type { MembershipResponse } from "@lib/types"; -import { - schemaMembershipBodyParams, - schemaMembershipPublic, - withValidMembership, -} from "@lib/validations/membership"; - -/** - * @swagger - * /api/memberships/new: - * post: - * summary: Creates a new membership - * tags: - * - memberships - * responses: - * 201: - * description: OK, membership created - * model: Membership - * 400: - * description: Bad request. Membership body is invalid. - * 401: - * description: Authorization information is missing or invalid. - */ -async function createMembership(req: NextApiRequest, res: NextApiResponse) { - const safe = schemaMembershipBodyParams.safeParse(req.body); - if (!safe.success) throw new Error("Invalid request body", safe.error); - - const membership = await prisma.membership.create({ data: safe.data }); - const data = schemaMembershipPublic.parse(membership); - - if (data) res.status(201).json({ data, message: "Membership created successfully" }); - else - (error: Error) => - res.status(400).json({ - message: "Could not create new membership", - error, - }); -} - -export default withMiddleware("HTTP_POST")(withValidMembership(createMembership)); diff --git a/pages/api/payments/[id].ts b/pages/api/payments/[id].ts index bdd8766c69..cdedf473ec 100644 --- a/pages/api/payments/[id].ts +++ b/pages/api/payments/[id].ts @@ -13,7 +13,7 @@ import { /** * @swagger - * /api/payments/{id}: + * /v1/payments/{id}: * get: * summary: Get one of your own payments by ID * parameters: @@ -45,10 +45,10 @@ export async function paymentById(req: NextApiRequest, res: NextApiResponse schemaPaymentPublic.parse(payment)) - .then((data) => { - if (userWithBookings?.bookings.map((b) => b.id).includes(data.bookingId)) { - res.status(200).json({ data }); + .then((data) => schemaPaymentPublic.parse(data)) + .then((payment) => { + if (userWithBookings?.bookings.map((b) => b.id).includes(payment.bookingId)) { + res.status(200).json({ payment }); } else { res.status(401).json({ message: "Unauthorized" }); } diff --git a/pages/api/payments/index.ts b/pages/api/payments/index.ts index 73b32a7d1c..955cff0725 100644 --- a/pages/api/payments/index.ts +++ b/pages/api/payments/index.ts @@ -9,7 +9,7 @@ import { schemaPaymentPublic } from "@lib/validations/payment"; /** * @swagger - * /api/payments: + * /v1/payments: * get: * summary: Get all payments * tags: @@ -32,10 +32,10 @@ async function allPayments(_: NextApiRequest, res: NextApiResponse booking.id); - const payments = await prisma.payment.findMany({ where: { bookingId: { in: bookingIds } } }); - const data = payments.map((payment) => schemaPaymentPublic.parse(payment)); + const data = await prisma.payment.findMany({ where: { bookingId: { in: bookingIds } } }); + const payments = data.map((payment) => schemaPaymentPublic.parse(payment)); - if (data) res.status(200).json({ data }); + if (payments) res.status(200).json({ payments }); else (error: Error) => res.status(404).json({ @@ -43,5 +43,5 @@ async function allPayments(_: NextApiRequest, res: NextApiResponse schemaReminderMailPublic.parse(data)) - .then((data) => res.status(200).json({ data })) + .then((reminder_mail) => res.status(200).json({ reminder_mail })) .catch((error: Error) => res.status(404).json({ message: `ReminderMail with id: ${safeQuery.data.id} not found`, error }) ); @@ -104,7 +104,7 @@ export async function reminderMailById(req: NextApiRequest, res: NextApiResponse data: safeBody.data, }) .then((reminderMail) => schemaReminderMailPublic.parse(reminderMail)) - .then((data) => res.status(200).json({ data })) + .then((reminder_mail) => res.status(200).json({ reminder_mail })) .catch((error: Error) => res.status(404).json({ message: `ReminderMail with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/reminder-mails/index.ts b/pages/api/reminder-mails/index.ts index be7025ba21..2c743c0474 100644 --- a/pages/api/reminder-mails/index.ts +++ b/pages/api/reminder-mails/index.ts @@ -43,9 +43,9 @@ async function createOrlistAllReminderMails( ) { const { method } = req; if (method === "GET") { - const reminderMails = await prisma.reminderMail.findMany(); - const data = reminderMails.map((reminderMail) => schemaReminderMailPublic.parse(reminderMail)); - if (data) res.status(200).json({ data }); + const data = await prisma.reminderMail.findMany(); + const reminder_mails = data.map((reminderMail) => schemaReminderMailPublic.parse(reminderMail)); + if (reminder_mails) res.status(200).json({ reminder_mails }); else (error: Error) => res.status(404).json({ @@ -56,10 +56,10 @@ async function createOrlistAllReminderMails( const safe = schemaReminderMailBodyParams.safeParse(req.body); if (!safe.success) throw new Error("Invalid request body"); - const reminderMail = await prisma.reminderMail.create({ data: safe.data }); - const data = schemaReminderMailPublic.parse(reminderMail); + const data = await prisma.reminderMail.create({ data: safe.data }); + const reminder_mail = schemaReminderMailPublic.parse(data); - if (data) res.status(201).json({ data, message: "reminder mail created successfully" }); + if (reminder_mail) res.status(201).json({ reminder_mail, message: "reminder mail created successfully" }); else (error: Error) => res.status(400).json({ diff --git a/pages/api/schedules/[id].ts b/pages/api/schedules/[id].ts index 162f7f9542..c75034e5d1 100644 --- a/pages/api/schedules/[id].ts +++ b/pages/api/schedules/[id].ts @@ -89,8 +89,8 @@ export async function scheduleById(req: NextApiRequest, res: NextApiResponse schemaSchedulePublic.parse(schedule)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaSchedulePublic.parse(data)) + .then((schedule) => res.status(200).json({ schedule })) .catch((error: Error) => res.status(404).json({ message: `Schedule with id: ${safeQuery.data.id} not found`, error }) ); @@ -103,8 +103,8 @@ export async function scheduleById(req: NextApiRequest, res: NextApiResponse schemaSchedulePublic.parse(schedule)) - .then((data) => res.status(200).json({ data })) + .then((data) => schemaSchedulePublic.parse(data)) + .then((schedule) => res.status(200).json({ schedule })) .catch((error: Error) => res.status(404).json({ message: `Schedule with id: ${safeQuery.data.id} not found`, error }) ); diff --git a/pages/api/schedules/index.ts b/pages/api/schedules/index.ts index e3b178d216..f8eedf599f 100644 --- a/pages/api/schedules/index.ts +++ b/pages/api/schedules/index.ts @@ -39,9 +39,9 @@ async function createOrlistAllSchedules( ) { const { method } = req; if (method === "GET") { - const schedules = await prisma.schedule.findMany(); - const data = schedules.map((schedule) => schemaSchedulePublic.parse(schedule)); - if (data) res.status(200).json({ data }); + const data = await prisma.schedule.findMany(); + const schedules = data.map((schedule) => schemaSchedulePublic.parse(schedule)); + if (schedules) res.status(200).json({ schedules }); else (error: Error) => res.status(404).json({ @@ -52,10 +52,10 @@ async function createOrlistAllSchedules( const safe = schemaScheduleBodyParams.safeParse(req.body); if (!safe.success) throw new Error("Invalid request body"); - const schedule = await prisma.schedule.create({ data: safe.data }); - const data = schemaSchedulePublic.parse(schedule); + const data = await prisma.schedule.create({ data: safe.data }); + const schedule = schemaSchedulePublic.parse(data); - if (data) res.status(201).json({ data, message: "Schedule created successfully" }); + if (schedule) res.status(201).json({ schedule, message: "Schedule created successfully" }); else (error: Error) => res.status(400).json({ diff --git a/templates/endpoints/[id]/delete.ts b/templates/endpoints/[id]/delete.ts index a9816a3ab6..2b59baee90 100644 --- a/templates/endpoints/[id]/delete.ts +++ b/templates/endpoints/[id]/delete.ts @@ -11,7 +11,7 @@ import { /** * @swagger - * /api/resources/{id}/delete: + * /v1/resources/{id}/delete: * delete: * summary: Remove an existing resource * parameters: diff --git a/templates/endpoints/[id]/edit.ts b/templates/endpoints/[id]/edit.ts index 2be7bd06c1..0e73604fb4 100644 --- a/templates/endpoints/[id]/edit.ts +++ b/templates/endpoints/[id]/edit.ts @@ -4,15 +4,15 @@ import prisma from "@calcom/prisma"; import { withMiddleware } from "@lib/helpers/withMiddleware"; import type { ResourceResponse } from "@lib/types"; +import { schemaResourceBodyParams, schemaResourcePublic, withValidResource } from "@lib/validations/resource"; import { schemaQueryIdParseInt, withValidQueryIdTransformParseInt, } from "@lib/validations/shared/queryIdTransformParseInt"; -import { schemaResourceBodyParams, schemaResourcePublic, withValidResource } from "@lib/validations/resource"; /** * @swagger - * /api/resources/{id}/edit: + * /v1/resources/{id}/edit: * patch: * summary: Edit an existing resource * parameters: @@ -53,4 +53,6 @@ export async function editResource(req: NextApiRequest, res: NextApiResponse