Files
calendar/packages/lib/server/repository/destinationCalendar.ts
T
Lauris SkraucisandGitHub 35022a0478 fix: get v2/calendars existing record conflict (#22286)
* refactor: upsert destination calendar

* test: v2 connected calendars

* chore: bump libraries

* refactor: have only createIfNotExistsForUser

* refactor: exclude eventTypeId from user calendar search

* chore: bump libraries
2025-07-14 08:01:43 +00:00

111 lines
2.8 KiB
TypeScript

import type { Prisma } from "@prisma/client";
import logger from "@calcom/lib/logger";
import { prisma } from "@calcom/prisma";
import { buildCredentialPayloadForPrisma } from "../buildCredentialPayloadForCalendar";
const log = logger.getSubLogger({ prefix: ["DestinationCalendarRepository"] });
export class DestinationCalendarRepository {
static async create(data: Prisma.DestinationCalendarCreateInput) {
return await prisma.destinationCalendar.create({
data,
});
}
static async createIfNotExistsForUser(
data: { userId: number } & Prisma.DestinationCalendarUncheckedCreateInput
) {
const conflictingCalendar = await DestinationCalendarRepository.findConflictingForUser(data);
if (conflictingCalendar) {
return conflictingCalendar;
}
return await prisma.destinationCalendar.create({
data,
});
}
static async getByUserId(userId: number) {
return await prisma.destinationCalendar.findFirst({
where: {
userId,
},
});
}
static async getByEventTypeId(eventTypeId: number) {
return await prisma.destinationCalendar.findFirst({
where: {
eventTypeId,
},
});
}
static async find({ where }: { where: Prisma.DestinationCalendarWhereInput }) {
return await prisma.destinationCalendar.findFirst({
where,
});
}
private static async findConflictingForUser(data: {
userId: number;
integration: string;
externalId: string;
}) {
return await DestinationCalendarRepository.find({
where: {
userId: data.userId,
integration: data.integration,
externalId: data.externalId,
eventTypeId: null,
},
});
}
static async upsert({
where,
update,
create,
}: {
where: Prisma.DestinationCalendarUpsertArgs["where"];
update: {
integration?: string;
externalId?: string;
credentialId?: number | null;
primaryEmail?: string | null;
delegationCredentialId?: string | null;
};
create: {
integration: string;
externalId: string;
credentialId: number | null;
primaryEmail?: string | null;
delegationCredentialId?: string | null;
};
}) {
log.debug("upsert", { where, update, create });
const credentialPayloadForUpdate = buildCredentialPayloadForPrisma({
credentialId: update.credentialId,
delegationCredentialId: update.delegationCredentialId,
});
const credentialPayloadForCreate = buildCredentialPayloadForPrisma({
credentialId: create.credentialId,
delegationCredentialId: create.delegationCredentialId,
});
return await prisma.destinationCalendar.upsert({
where,
update: {
...update,
...credentialPayloadForUpdate,
},
create: {
...create,
...credentialPayloadForCreate,
},
});
}
}