39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import { Prisma } from "@prisma/client";
|
|
import { v5 as uuidv5 } from "uuid";
|
|
|
|
import { BookingStatus } from "@calcom/prisma/enums";
|
|
|
|
export function bookingIdempotencyKeyExtension() {
|
|
return Prisma.defineExtension({
|
|
query: {
|
|
booking: {
|
|
async create({ args, query }) {
|
|
const uniqueEmailJoinInput: string[] = [];
|
|
if (args.data.attendees?.create && !Array.isArray(args.data.attendees?.create)) {
|
|
uniqueEmailJoinInput.push(args.data.attendees?.create.email);
|
|
}
|
|
if (args.data.attendees?.createMany && Array.isArray(args.data.attendees?.createMany.data)) {
|
|
uniqueEmailJoinInput.push(...args.data.attendees?.createMany.data.map((record) => record.email));
|
|
}
|
|
const idempotencyKey = uuidv5(
|
|
`${
|
|
args.data.eventType?.connect?.id
|
|
}.${args.data.startTime.valueOf()}.${args.data.endTime.valueOf()}.${uniqueEmailJoinInput.join(
|
|
","
|
|
)}`,
|
|
uuidv5.URL
|
|
);
|
|
args.data.idempotencyKey = idempotencyKey;
|
|
return query(args);
|
|
},
|
|
async update({ args, query }) {
|
|
if (args.data.status === BookingStatus.CANCELLED || args.data.status === BookingStatus.REJECTED) {
|
|
args.data.idempotencyKey = null;
|
|
}
|
|
return query(args);
|
|
},
|
|
},
|
|
},
|
|
});
|
|
}
|