Add Google cal extneral calendar id to booking reference (#2671)
* Set google cal event id to use our uid * Save calendar external id to bookingRef * Pass external calendar ids to update and delete * Create migration * Fix type errors * Fix prisma url Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> Co-authored-by: Omar López <zomars@me.com>
This commit is contained in:
@@ -51,6 +51,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
select: {
|
||||
uid: true,
|
||||
type: true,
|
||||
externalCalendarId: true,
|
||||
},
|
||||
},
|
||||
payment: true,
|
||||
@@ -163,11 +164,14 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse)
|
||||
|
||||
const apiDeletes = async.mapLimit(bookingToDelete.user.credentials, 5, async (credential: Credential) => {
|
||||
const bookingRefUid = bookingToDelete.references.filter((ref) => ref.type === credential.type)[0]?.uid;
|
||||
const bookingExternalCalendarId = bookingToDelete.references.filter(
|
||||
(ref) => ref.type === credential.type
|
||||
)[0]?.externalCalendarId;
|
||||
if (bookingRefUid) {
|
||||
if (credential.type.endsWith("_calendar")) {
|
||||
const calendar = getCalendar(credential);
|
||||
|
||||
return calendar?.deleteEvent(bookingRefUid, evt);
|
||||
return calendar?.deleteEvent(bookingRefUid, evt, bookingExternalCalendarId);
|
||||
} else if (credential.type.endsWith("_video")) {
|
||||
return deleteMeeting(credential, bookingRefUid);
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import type {
|
||||
IntegrationCalendar,
|
||||
NewCalendarEventType,
|
||||
} from "@calcom/types/Calendar";
|
||||
import type { PartialReference } from "@calcom/types/EventManager";
|
||||
|
||||
import getAppKeysFromSlug from "../../_utils/getAppKeysFromSlug";
|
||||
|
||||
@@ -162,7 +163,7 @@ export default class GoogleCalendarService implements Calendar {
|
||||
});
|
||||
}
|
||||
|
||||
async updateEvent(uid: string, event: CalendarEvent): Promise<any> {
|
||||
async updateEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise<any> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const auth = await this.auth;
|
||||
const myGoogleAuth = await auth.getToken();
|
||||
@@ -194,9 +195,7 @@ export default class GoogleCalendarService implements Calendar {
|
||||
calendar.events.update(
|
||||
{
|
||||
auth: myGoogleAuth,
|
||||
calendarId: event.destinationCalendar?.externalId
|
||||
? event.destinationCalendar.externalId
|
||||
: "primary",
|
||||
calendarId: externalCalendarId ? externalCalendarId : event.destinationCalendar?.externalId,
|
||||
eventId: uid,
|
||||
sendNotifications: true,
|
||||
sendUpdates: "all",
|
||||
@@ -214,7 +213,7 @@ export default class GoogleCalendarService implements Calendar {
|
||||
});
|
||||
}
|
||||
|
||||
async deleteEvent(uid: string, event: CalendarEvent): Promise<void> {
|
||||
async deleteEvent(uid: string, event: CalendarEvent, externalCalendarId: string): Promise<void> {
|
||||
return new Promise(async (resolve, reject) => {
|
||||
const auth = await this.auth;
|
||||
const myGoogleAuth = await auth.getToken();
|
||||
@@ -225,9 +224,7 @@ export default class GoogleCalendarService implements Calendar {
|
||||
calendar.events.delete(
|
||||
{
|
||||
auth: myGoogleAuth,
|
||||
calendarId: event.destinationCalendar?.externalId
|
||||
? event.destinationCalendar.externalId
|
||||
: "primary",
|
||||
calendarId: externalCalendarId ? externalCalendarId : event.destinationCalendar?.externalId,
|
||||
eventId: uid,
|
||||
sendNotifications: true,
|
||||
sendUpdates: "all",
|
||||
|
||||
@@ -128,7 +128,8 @@ export const createEvent = async (credential: Credential, calEvent: CalendarEven
|
||||
export const updateEvent = async (
|
||||
credential: Credential,
|
||||
calEvent: CalendarEvent,
|
||||
bookingRefUid: string | null
|
||||
bookingRefUid: string | null,
|
||||
externalCalendarId: string | null
|
||||
): Promise<EventResult> => {
|
||||
const uid = getUid(calEvent);
|
||||
const calendar = getCalendar(credential);
|
||||
@@ -139,7 +140,7 @@ export const updateEvent = async (
|
||||
const updatedResult =
|
||||
calendar && bookingRefUid
|
||||
? await calendar
|
||||
.updateEvent(bookingRefUid, calEvent)
|
||||
.updateEvent(bookingRefUid, calEvent, externalCalendarId)
|
||||
.then(() => (success = true))
|
||||
.catch((e) => {
|
||||
log.error("updateEvent failed", e, calEvent);
|
||||
|
||||
@@ -146,6 +146,7 @@ export default class EventManager {
|
||||
meetingId: result.createdEvent?.id.toString(),
|
||||
meetingPassword: result.createdEvent?.password,
|
||||
meetingUrl: result.createdEvent?.url,
|
||||
externalCalendarId: evt.destinationCalendar?.externalId,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -188,6 +189,7 @@ export default class EventManager {
|
||||
meetingId: true,
|
||||
meetingPassword: true,
|
||||
meetingUrl: true,
|
||||
externalCalendarId: true,
|
||||
},
|
||||
},
|
||||
destinationCalendar: true,
|
||||
@@ -354,7 +356,11 @@ export default class EventManager {
|
||||
? booking.references.filter((ref) => ref.type === credential.type && !!ref.uid)[0]?.uid
|
||||
: null;
|
||||
|
||||
return updateEvent(credential, event, bookingRefUid);
|
||||
const bookingExternalCalendarId = booking.references
|
||||
? booking.references.filter((ref) => ref.type === credential.type)[0].externalCalendarId
|
||||
: null;
|
||||
|
||||
return updateEvent(credential, event, bookingRefUid, bookingExternalCalendarId!);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
-- AlterTable
|
||||
ALTER TABLE "BookingReference" ADD COLUMN "externalCalendarId" TEXT;
|
||||
@@ -223,6 +223,7 @@ model BookingReference {
|
||||
meetingUrl String?
|
||||
booking Booking? @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
||||
bookingId Int?
|
||||
externalCalendarId String?
|
||||
deleted Boolean?
|
||||
}
|
||||
|
||||
|
||||
8
packages/types/Calendar.d.ts
vendored
8
packages/types/Calendar.d.ts
vendored
@@ -140,9 +140,13 @@ export interface IntegrationCalendar extends Ensure<Partial<SelectedCalendar>, "
|
||||
export interface Calendar {
|
||||
createEvent(event: CalendarEvent): Promise<NewCalendarEventType>;
|
||||
|
||||
updateEvent(uid: string, event: CalendarEvent): Promise<Event | Event[]>;
|
||||
updateEvent(
|
||||
uid: string,
|
||||
event: CalendarEvent,
|
||||
externalCalendarId?: string | null
|
||||
): Promise<Event | Event[]>;
|
||||
|
||||
deleteEvent(uid: string, event: CalendarEvent): Promise<unknown>;
|
||||
deleteEvent(uid: string, event: CalendarEvent, externalCalendarId?: string | null): Promise<unknown>;
|
||||
|
||||
getAvailability(
|
||||
dateFrom: string,
|
||||
|
||||
1
packages/types/EventManager.d.ts
vendored
1
packages/types/EventManager.d.ts
vendored
@@ -8,6 +8,7 @@ export interface PartialReference {
|
||||
meetingId?: string | null;
|
||||
meetingPassword?: string | null;
|
||||
meetingUrl?: string | null;
|
||||
externalCalendarId?: string | null;
|
||||
}
|
||||
|
||||
export interface EventResult {
|
||||
|
||||
Reference in New Issue
Block a user