fix: build webhooks and event-types
This commit is contained in:
+13
-11
@@ -1,19 +1,21 @@
|
||||
import type { IncomingMessage } from "http";
|
||||
// import type { NextApiRequest } from "next";
|
||||
import { NextMiddleware } from "next-api-middleware";
|
||||
|
||||
import { hashAPIKey } from "@calcom/ee/lib/api/apiKeys";
|
||||
import prisma from "@calcom/prisma";
|
||||
|
||||
/** @todo figure how to use the one from `@calcom/types`fi */
|
||||
/** @todo: remove once `@calcom/types` is updated with it.*/
|
||||
declare module "next" {
|
||||
export interface NextApiRequest extends IncomingMessage {
|
||||
userId: number;
|
||||
query: {
|
||||
apiKey: string;
|
||||
};
|
||||
}
|
||||
}
|
||||
// /** @todo figure how to use the one from `@calcom/types`fi */
|
||||
// /** @todo: remove once `@calcom/types` is updated with it.*/
|
||||
// declare module "next" {
|
||||
// export interface NextApiRequest extends NextApiRequest {
|
||||
// userId: number;
|
||||
// body: any;
|
||||
// method: string;
|
||||
// query: {
|
||||
// apiKey: string;
|
||||
// };
|
||||
// }
|
||||
// }
|
||||
|
||||
// Used to check if the apiKey is not expired, could be extracted if reused. but not for now.
|
||||
export const dateNotInPast = function (date: Date) {
|
||||
|
||||
@@ -150,6 +150,7 @@ interface EventTypeExtended extends Omit<EventType, "recurringEvent" | "location
|
||||
type: DefaultLocationType | AppStoreLocationType;
|
||||
}[];
|
||||
}
|
||||
|
||||
// EventType
|
||||
export type EventTypeResponse = BaseResponse & {
|
||||
event_type?: Partial<EventTypeExtended>;
|
||||
|
||||
@@ -24,7 +24,7 @@ export const schemaWebhookCreateBodyParams = schemaWebhookBaseBodyParams.merge(s
|
||||
const schemaWebhookEditParams = z
|
||||
.object({
|
||||
payloadTemplate: z.string().optional(),
|
||||
eventTriggers: z.string().optional(),
|
||||
eventTriggers: z.any(),
|
||||
subscriberUrl: z.string().optional(),
|
||||
})
|
||||
.strict();
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@calcom/tsconfig": "*",
|
||||
"@calcom/types": "*",
|
||||
"@typescript-eslint/eslint-plugin": "^5.25.0",
|
||||
"babel-jest": "^28.1.0",
|
||||
"jest": "^28.0.3",
|
||||
|
||||
@@ -22,177 +22,177 @@ export async function bookingReferenceById(
|
||||
res.status(400).json({ message: "Your query was invalid" });
|
||||
return;
|
||||
}
|
||||
// const userWithBookings = await prisma.user.findUnique({
|
||||
// where: { id: userId },
|
||||
// include: { bookings: true },
|
||||
// });
|
||||
// if (!userWithBookings) throw new Error("User not found");
|
||||
// const userBookingIds = userWithBookings.bookings.map((booking: { id: number }) => booking.id).flat();
|
||||
const userWithBookings = await prisma.user.findUnique({
|
||||
where: { id: userId },
|
||||
include: { bookings: true },
|
||||
});
|
||||
if (!userWithBookings) throw new Error("User not found");
|
||||
const userBookingIds = userWithBookings.bookings.map((booking: { id: number }) => booking.id).flat();
|
||||
// console.log(userBookingIds);
|
||||
// const bookingReferences = await prisma.bookingReference
|
||||
// .findMany({ where: { id: { in: userBookingIds } } })
|
||||
// .then((bookingReferences) => {
|
||||
// console.log(bookingReferences);
|
||||
// return bookingReferences.map((bookingReference) => bookingReference.id);
|
||||
// });
|
||||
const bookingReferences = await prisma.bookingReference
|
||||
.findMany({ where: { id: { in: userBookingIds } } })
|
||||
.then((bookingReferences) => {
|
||||
console.log(bookingReferences);
|
||||
return bookingReferences.map((bookingReference) => bookingReference.id);
|
||||
});
|
||||
|
||||
// res.status(400).json({ message: "Booking reference not found" });
|
||||
// return;
|
||||
// }
|
||||
// if (userBookingIds.includes(safeQuery.data.id)) {
|
||||
// if (!bookingReferences?.includes(safeQuery.data.id)) {
|
||||
// throw new Error("BookingReference: bookingId not found");
|
||||
switch (method) {
|
||||
case "GET":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* get:
|
||||
* operationId: getBookingReferenceById
|
||||
* summary: Find a booking reference
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to get
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
* 404:
|
||||
* description: BookingReference was not found
|
||||
*/
|
||||
// console.log(safeQuery.data.id);
|
||||
const bookingReference = await prisma.bookingReference.findFirst().catch((error: Error) => {
|
||||
console.log("hoerr:", error);
|
||||
});
|
||||
// console.log(bookingReference);
|
||||
if (!bookingReference) res.status(404).json({ message: "Booking reference not found" });
|
||||
else res.status(200).json({ booking_reference: bookingReference });
|
||||
if (!bookingReferences?.includes(safeQuery.data.id)) {
|
||||
// if (userBookingIds.includes(safeQuery.data.id)) {
|
||||
// throw new Error("BookingReference: bookingId not found");
|
||||
switch (method) {
|
||||
case "GET":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* get:
|
||||
* operationId: getBookingReferenceById
|
||||
* summary: Find a booking reference
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to get
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 200:
|
||||
* description: OK
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
* 404:
|
||||
* description: BookingReference was not found
|
||||
*/
|
||||
// console.log(safeQuery.data.id);
|
||||
const bookingReference = await prisma.bookingReference.findFirst().catch((error: Error) => {
|
||||
console.log("hoerr:", error);
|
||||
});
|
||||
// console.log(bookingReference);
|
||||
if (!bookingReference) res.status(404).json({ message: "Booking reference not found" });
|
||||
else res.status(200).json({ booking_reference: bookingReference });
|
||||
|
||||
// .then((data) => {
|
||||
// console.log(data);
|
||||
// return schemaBookingReferenceReadPublic.parse(data);
|
||||
// })
|
||||
// .then((booking_reference) => res.status(200).json({ booking_reference }))
|
||||
// .catch((error: Error) => {
|
||||
// console.log(error);
|
||||
// res.status(404).json({
|
||||
// message: `BookingReference with id: ${safeQuery.data.id} not found`,
|
||||
// error,
|
||||
// });
|
||||
// });
|
||||
break;
|
||||
case "PATCH":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* patch:
|
||||
* operationId: editBookingReferenceById
|
||||
* summary: Edit an existing booking reference
|
||||
* requestBody:
|
||||
* description: Edit an existing booking reference related to one of your bookings
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* days:
|
||||
* type: array
|
||||
* example: email@example.com
|
||||
* startTime:
|
||||
* type: string
|
||||
* example: 1970-01-01T17:00:00.000Z
|
||||
* endTime:
|
||||
* type: string
|
||||
* example: 1970-01-01T17:00:00.000Z
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to edit
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 201:
|
||||
* description: OK, safeBody.data edited successfuly
|
||||
* 400:
|
||||
* description: Bad request. BookingReference body is invalid.
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
*/
|
||||
// .then((data) => {
|
||||
// console.log(data);
|
||||
// return schemaBookingReferenceReadPublic.parse(data);
|
||||
// })
|
||||
// .then((booking_reference) => res.status(200).json({ booking_reference }))
|
||||
// .catch((error: Error) => {
|
||||
// console.log(error);
|
||||
// res.status(404).json({
|
||||
// message: `BookingReference with id: ${safeQuery.data.id} not found`,
|
||||
// error,
|
||||
// });
|
||||
// });
|
||||
break;
|
||||
case "PATCH":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* patch:
|
||||
* operationId: editBookingReferenceById
|
||||
* summary: Edit an existing booking reference
|
||||
* requestBody:
|
||||
* description: Edit an existing booking reference related to one of your bookings
|
||||
* required: true
|
||||
* content:
|
||||
* application/json:
|
||||
* schema:
|
||||
* type: object
|
||||
* properties:
|
||||
* days:
|
||||
* type: array
|
||||
* example: email@example.com
|
||||
* startTime:
|
||||
* type: string
|
||||
* example: 1970-01-01T17:00:00.000Z
|
||||
* endTime:
|
||||
* type: string
|
||||
* example: 1970-01-01T17:00:00.000Z
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to edit
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 201:
|
||||
* description: OK, safeBody.data edited successfuly
|
||||
* 400:
|
||||
* description: Bad request. BookingReference body is invalid.
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
*/
|
||||
|
||||
const safeBody = schemaBookingEditBodyParams.safeParse(body);
|
||||
if (!safeBody.success) {
|
||||
console.log(safeBody.error);
|
||||
res.status(400).json({ message: "Invalid request body", error: safeBody.error });
|
||||
return;
|
||||
}
|
||||
await prisma.bookingReference
|
||||
.update({ where: { id: safeQuery.data.id }, data: safeBody.data })
|
||||
.then((data) => schemaBookingReferenceReadPublic.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,
|
||||
const safeBody = schemaBookingEditBodyParams.safeParse(body);
|
||||
if (!safeBody.success) {
|
||||
console.log(safeBody.error);
|
||||
res.status(400).json({ message: "Invalid request body", error: safeBody.error });
|
||||
return;
|
||||
}
|
||||
await prisma.bookingReference
|
||||
.update({ where: { id: safeQuery.data.id }, data: safeBody.data })
|
||||
.then((data) => schemaBookingReferenceReadPublic.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,
|
||||
})
|
||||
);
|
||||
break;
|
||||
case "DELETE":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* delete:
|
||||
* operationId: removeBookingReferenceById
|
||||
* summary: Remove an existing booking reference
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to delete
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 201:
|
||||
* description: OK, bookingReference removed successfuly
|
||||
* 400:
|
||||
* description: Bad request. BookingReference id is invalid.
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
*/
|
||||
await prisma.bookingReference
|
||||
.delete({
|
||||
where: { id: safeQuery.data.id },
|
||||
})
|
||||
);
|
||||
break;
|
||||
case "DELETE":
|
||||
/**
|
||||
* @swagger
|
||||
* /booking-references/{id}:
|
||||
* delete:
|
||||
* operationId: removeBookingReferenceById
|
||||
* summary: Remove an existing booking reference
|
||||
* parameters:
|
||||
* - in: path
|
||||
* name: id
|
||||
* schema:
|
||||
* type: integer
|
||||
* required: true
|
||||
* description: ID of the booking reference to delete
|
||||
* tags:
|
||||
* - booking-references
|
||||
* responses:
|
||||
* 201:
|
||||
* description: OK, bookingReference removed successfuly
|
||||
* 400:
|
||||
* description: Bad request. BookingReference id is invalid.
|
||||
* 401:
|
||||
* description: Authorization information is missing or invalid.
|
||||
*/
|
||||
await prisma.bookingReference
|
||||
.delete({
|
||||
where: { id: safeQuery.data.id },
|
||||
})
|
||||
.then(() =>
|
||||
res.status(200).json({
|
||||
message: `BookingReference with id: ${safeQuery.data.id} deleted`,
|
||||
})
|
||||
)
|
||||
.catch((error: Error) =>
|
||||
res.status(404).json({
|
||||
message: `BookingReference with id: ${safeQuery.data.id} not found`,
|
||||
error,
|
||||
})
|
||||
);
|
||||
break;
|
||||
.then(() =>
|
||||
res.status(200).json({
|
||||
message: `BookingReference with id: ${safeQuery.data.id} deleted`,
|
||||
})
|
||||
)
|
||||
.catch((error: Error) =>
|
||||
res.status(404).json({
|
||||
message: `BookingReference with id: ${safeQuery.data.id} not found`,
|
||||
error,
|
||||
})
|
||||
);
|
||||
break;
|
||||
|
||||
default:
|
||||
res.status(405).json({ message: "Method not allowed" });
|
||||
break;
|
||||
}
|
||||
// } else res.status(401).json({ message: "Unauthorized" });
|
||||
default:
|
||||
res.status(405).json({ message: "Method not allowed" });
|
||||
break;
|
||||
}
|
||||
} else res.status(401).json({ message: "Unauthorized" });
|
||||
}
|
||||
|
||||
export default withMiddleware("HTTP_GET_DELETE_PATCH")(
|
||||
|
||||
+11
-12
@@ -40,19 +40,18 @@ async function getAllorCreateUser(
|
||||
message: "No Users were found",
|
||||
error,
|
||||
});
|
||||
} else if (method === "POST") {
|
||||
const isAdmin = await prisma.user
|
||||
.findUnique({ where: { id: userId } })
|
||||
.then((user) => user?.role === "ADMIN");
|
||||
if (!isAdmin) res.status(401).json({ message: "You are not authorized" });
|
||||
else {
|
||||
const user = await prisma.user.create({
|
||||
data: schemaUserReadPublic.parse(body),
|
||||
});
|
||||
res.status(201).json({ user });
|
||||
}
|
||||
}
|
||||
// else if (method === "POST") {
|
||||
// const isAdmin = await prisma.user
|
||||
// .findUnique({ where: { id: userId } })
|
||||
// .then((user) => user?.role === "ADMIN");
|
||||
// if (!isAdmin) res.status(401).json({ message: "You are not authorized" });
|
||||
// else {
|
||||
// const user = await prisma.user.create({
|
||||
// data: schemaUserReadPublic.parse(body),
|
||||
// });
|
||||
// res.status(201).json({ user });
|
||||
// }
|
||||
// }
|
||||
}
|
||||
// No POST endpoint for users for now as a regular user you're expected to signup.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user