From d55aaeafe0c32171c06584c0070553dd1a8e9b7a Mon Sep 17 00:00:00 2001 From: Valentin Chmara Date: Mon, 6 May 2024 22:14:18 +0200 Subject: [PATCH] fix: [CAL-3578] [CAL-2733] check events in the calendar when checking availability --- .../zohocalendar/lib/CalendarService.ts | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/packages/app-store/zohocalendar/lib/CalendarService.ts b/packages/app-store/zohocalendar/lib/CalendarService.ts index a06f8b4a10158..121806c5ab376 100644 --- a/packages/app-store/zohocalendar/lib/CalendarService.ts +++ b/packages/app-store/zohocalendar/lib/CalendarService.ts @@ -56,6 +56,11 @@ export default class ZohoCalendarService implements Calendar { const token = await res.json(); + // Revert if access_token is not present + if (!token.access_token) { + throw new Error("Invalid token response"); + } + const key: ZohoAuthCredentials = { access_token: token.access_token, refresh_token: zohoCredentials.refresh_token, @@ -260,6 +265,37 @@ export default class ZohoCalendarService implements Calendar { ); } + private async getUnavailability( + range: { start: string; end: string }, + calendarId: string + ): Promise> { + const query = stringify({ + range: JSON.stringify(range), + }); + this.log.debug("getUnavailability query", query); + try { + // List all events within the range + const response = await this.fetcher(`/calendars/${calendarId}/events?${query}`); + const data = await this.handleData(response, this.log); + + // Check for no data scenario + if (!data.events || data.events.length === 0) return []; + + return ( + data.events + .filter((event: any) => event.isprivate === false) + .map((event: any) => { + const start = dayjs(event.dateandtime.start, "YYYYMMDD[T]HHmmssZ").utc().toISOString(); + const end = dayjs(event.dateandtime.end, "YYYYMMDD[T]HHmmssZ").utc().toISOString(); + return { start, end }; + }) || [] + ); + } catch (error) { + this.log.error(error); + return []; + } + } + async getAvailability( dateFrom: string, dateTo: string, @@ -296,7 +332,22 @@ export default class ZohoCalendarService implements Calendar { originalEndDate.format("YYYYMMDD[T]HHmmss[Z]"), userInfo.Email ); - return busyData; + + const unavailabilityData = await Promise.all( + queryIds.map((calendarId) => + this.getUnavailability( + { + start: originalStartDate.format("YYYYMMDD[T]HHmmss[Z]"), + end: originalEndDate.format("YYYYMMDD[T]HHmmss[Z]"), + }, + calendarId + ) + ) + ); + + const unavailability = unavailabilityData.flat(); + + return busyData.concat(unavailability); } else { // Zoho only supports 31 days of freebusy data const busyData = []; @@ -317,6 +368,22 @@ export default class ZohoCalendarService implements Calendar { )) ); + const unavailabilityData = await Promise.all( + queryIds.map((calendarId) => + this.getUnavailability( + { + start: startDate.format("YYYYMMDD[T]HHmmss[Z]"), + end: endDate.format("YYYYMMDD[T]HHmmss[Z]"), + }, + calendarId + ) + ) + ); + + const unavailability = unavailabilityData.flat(); + + busyData.push(...unavailability); + startDate = endDate.add(1, "minutes"); endDate = startDate.add(30, "days"); }