89 lines
2.6 KiB
TypeScript
89 lines
2.6 KiB
TypeScript
import type { Prisma } from "@prisma/client";
|
|
import type { NextApiRequest } from "next";
|
|
|
|
import { DEFAULT_SCHEDULE, getAvailabilityFromSchedule } from "@calcom/lib/availability";
|
|
import { HttpError } from "@calcom/lib/http-error";
|
|
import { defaultResponder } from "@calcom/lib/server";
|
|
|
|
import { schemaCreateScheduleBodyParams, schemaSchedulePublic } from "~/lib/validations/schedule";
|
|
|
|
/**
|
|
* @swagger
|
|
* /schedules:
|
|
* post:
|
|
* operationId: addSchedule
|
|
* summary: Creates a new schedule
|
|
* parameters:
|
|
* - in: query
|
|
* name: apiKey
|
|
* schema:
|
|
* type: string
|
|
* required: true
|
|
* description: Your API Key
|
|
* requestBody:
|
|
* description: Create a new schedule
|
|
* required: true
|
|
* content:
|
|
* application/json:
|
|
* schema:
|
|
* type: object
|
|
* required:
|
|
* - name
|
|
* - timezone
|
|
* properties:
|
|
* name:
|
|
* type: string
|
|
* description: Name of the schedule
|
|
* timezone:
|
|
* type: string
|
|
* description: The timezone for this schedule
|
|
* tags:
|
|
* - schedules
|
|
* responses:
|
|
* 201:
|
|
* description: OK, schedule created
|
|
* 400:
|
|
* description: Bad request. Schedule body is invalid.
|
|
* 401:
|
|
* description: Authorization information is missing or invalid.
|
|
*/
|
|
|
|
|
|
eventType EventType[]
|
|
name String
|
|
timeZone String?
|
|
availability Availability[]
|
|
async function postHandler(req: NextApiRequest) {
|
|
const { userId, isAdmin, prisma } = req;
|
|
const body = schemaCreateScheduleBodyParams.parse(req.body);
|
|
let args: Prisma.ScheduleCreateArgs = { data: { ...body, userId } };
|
|
|
|
/* If ADMIN we create the schedule for selected user */
|
|
if (isAdmin && body.userId) args = { data: { ...body, userId: body.userId } };
|
|
|
|
if (!isAdmin && body.userId)
|
|
throw new HttpError({ statusCode: 403, message: "ADMIN required for `userId`" });
|
|
|
|
// We create default availabilities for the schedule
|
|
args.data.availability = {
|
|
createMany: {
|
|
data: getAvailabilityFromSchedule(DEFAULT_SCHEDULE).map((schedule) => ({
|
|
days: schedule.days,
|
|
startTime: schedule.startTime,
|
|
endTime: schedule.endTime,
|
|
})),
|
|
},
|
|
};
|
|
// We include the recently created availability
|
|
args.include = { availability: true };
|
|
|
|
const data = await prisma.schedule.create(args);
|
|
|
|
return {
|
|
schedule: schemaSchedulePublic.parse(data),
|
|
message: "Schedule created successfully",
|
|
};
|
|
}
|
|
|
|
export default defaultResponder(postHandler);
|