Files
pfadi-bussle/lib/googlecalendar.ts
2022-06-23 22:43:00 +02:00

106 lines
2.4 KiB
TypeScript

import { google } from 'googleapis'
import { getBaseURL } from '../helpers/url'
import { Booking } from '../db/booking'
import { getDays } from '../helpers/date'
import { log } from '../helpers/log'
const calendarId = process.env.GOOGLE_CALENDAR_ID
let credentials: object
try {
credentials = JSON.parse(process.env.GOOGLE_SERVICE_ACCOUNT_KEY_JSON)
} catch (error) {
log.error(
'Unable to parse process.env.GOOGLE_SERVICE_ACCOUNT_KEY_JSON - invalid JSON?'
)
throw error
}
const auth = new google.auth.GoogleAuth({
credentials,
scopes: ['https://www.googleapis.com/auth/calendar'],
})
const calendar = google.calendar({
version: 'v3',
auth,
})
export async function getBookedDays() {
const { data } = await calendar.events.list({
calendarId,
timeMin: new Date().toISOString(),
timeZone: 'utc',
})
return (
data.items
// ignore non all-day events
.filter((event) => !!event.start.date)
.flatMap((event) =>
getDays({
startDate: new Date(event.start.date),
endDate: new Date(event.end.date),
endDateExclusive: true,
})
)
)
}
function getSummary(booking: Partial<Booking>): string {
let summary = ''
if (booking.org) {
summary += `${booking.org} - `
}
summary += booking.name
return summary
}
function getDescription(booking: Booking): string {
const bookingUrl = `${getBaseURL()}/admin/booking/${booking.uuid}`
return `Managelink ${bookingUrl}`
}
export async function createCalendarEvent(booking: Booking): Promise<Booking> {
const response = await calendar.events.insert(
{
calendarId,
requestBody: {
summary: getSummary(booking),
description: getDescription(booking),
start: { date: booking.startDate },
end: { date: booking.endDate },
},
},
{}
)
booking.calendarEventId = response.data.id
return booking
}
export async function deleteCalendarEvent(booking: Booking) {
await calendar.events.delete({
calendarId,
eventId: booking.calendarEventId,
// TODO: really useful?
sendNotifications: true,
})
booking.calendarEventId = null
}
//export async function patchCalendarEvent(booking: { calendarEventId: string } & Partial<Booking> ) : Promise<Booking> {
// const response = await calendar.events.patch({
// calendarId,
// eventId: booking.calendarEventId,
// });
//
// return booking;
//}