UNPKG

@remcostoeten/fync

Version:

Unified TypeScript library for 9 popular APIs with consistent functional architecture

199 lines 7.56 kB
import { createApiBuilder, defineResource } from "../core"; const GOOGLE_CALENDAR_API_BASE = "https://www.googleapis.com/calendar/v3"; const calendarListResource = defineResource({ name: "calendarList", basePath: "/users/me/calendarList", methods: { listCalendars: { path: "" }, getCalendarListEntry: { path: "/{calendarId}" }, insertCalendarListEntry: { path: "", method: "POST" }, updateCalendarListEntry: { path: "/{calendarId}", method: "PUT" }, patchCalendarListEntry: { path: "/{calendarId}", method: "PATCH" }, deleteCalendarListEntry: { path: "/{calendarId}", method: "DELETE" }, }, }); const calendarsResource = defineResource({ name: "calendars", basePath: "/calendars", methods: { getCalendar: { path: "/{calendarId}" }, insertCalendar: { path: "", method: "POST" }, updateCalendar: { path: "/{calendarId}", method: "PUT" }, patchCalendar: { path: "/{calendarId}", method: "PATCH" }, deleteCalendar: { path: "/{calendarId}", method: "DELETE" }, clearCalendar: { path: "/{calendarId}/clear", method: "POST" }, }, }); const eventsResource = defineResource({ name: "events", basePath: "/calendars/{calendarId}/events", methods: { listEvents: { path: "" }, getEvent: { path: "/{eventId}" }, insertEvent: { path: "", method: "POST" }, updateEvent: { path: "/{eventId}", method: "PUT" }, patchEvent: { path: "/{eventId}", method: "PATCH" }, deleteEvent: { path: "/{eventId}", method: "DELETE" }, moveEvent: { path: "/{eventId}/move", method: "POST" }, watchEvents: { path: "/watch", method: "POST" }, quickAddEvent: { path: "/quickAdd", method: "POST" }, getEventInstances: { path: "/{eventId}/instances" }, }, }); const freeBusyResource = defineResource({ name: "freebusy", basePath: "/freeBusy", methods: { queryFreeBusy: { path: "", method: "POST" }, }, }); const colorsResource = defineResource({ name: "colors", basePath: "/colors", methods: { getColors: { path: "" }, }, }); const aclResource = defineResource({ name: "acl", basePath: "/calendars/{calendarId}/acl", methods: { listAcl: { path: "" }, getAclRule: { path: "/{ruleId}" }, insertAclRule: { path: "", method: "POST" }, updateAclRule: { path: "/{ruleId}", method: "PUT" }, patchAclRule: { path: "/{ruleId}", method: "PATCH" }, deleteAclRule: { path: "/{ruleId}", method: "DELETE" }, }, }); const settingsResource = defineResource({ name: "settings", basePath: "/users/me/settings", methods: { listSettings: { path: "" }, getSetting: { path: "/{setting}" }, watchSettings: { path: "/watch", method: "POST" }, }, }); const resources = { calendarList: calendarListResource, calendars: calendarsResource, events: eventsResource, freebusy: freeBusyResource, colors: colorsResource, acl: aclResource, settings: settingsResource, }; const buildGoogleCalendar = createApiBuilder({ baseUrl: GOOGLE_CALENDAR_API_BASE, auth: { type: "bearer" }, headers: { "Content-Type": "application/json", }, }); export function GoogleCalendar(config) { const base = buildGoogleCalendar(config, resources); const calendar = base; calendar.getCalendars = function () { return base.calendarList.listCalendars(); }; calendar.getCalendar = function (calendarId) { return base.calendars.getCalendar({ calendarId }); }; calendar.getEvents = function (calendarId = "primary", options) { return base.events.listEvents({ calendarId, ...options }); }; calendar.getEvent = function (calendarId, eventId) { return base.events.getEvent({ calendarId, eventId }); }; calendar.getUpcomingEvents = async function (calendarId = "primary", maxResults = 10) { const now = new Date().toISOString(); const response = await base.events.listEvents({ calendarId, timeMin: now, maxResults, singleEvents: true, orderBy: "startTime", }); return response.items || []; }; calendar.getEventsInDateRange = async function (calendarId = "primary", startDate, endDate) { const response = await base.events.listEvents({ calendarId, timeMin: startDate.toISOString(), timeMax: endDate.toISOString(), singleEvents: true, orderBy: "startTime", }); return response.items || []; }; calendar.getTodaysEvents = async function (calendarId = "primary") { const today = new Date(); const startOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate()); const endOfDay = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1); return calendar.getEventsInDateRange(calendarId, startOfDay, endOfDay); }; calendar.searchEvents = async function (query, calendarId = "primary", maxResults = 25) { const response = await base.events.listEvents({ calendarId, q: query, maxResults, singleEvents: true, orderBy: "startTime", }); return response.items || []; }; calendar.getColors = function () { return base.colors.getColors(); }; calendar.getFreeBusy = function (params) { return base.freebusy.queryFreeBusy(params); }; calendar.isTimeSlotBusy = async function (calendarId, startTime, endTime) { const freeBusyResult = await base.freebusy.queryFreeBusy({ timeMin: startTime.toISOString(), timeMax: endTime.toISOString(), items: [{ id: calendarId }], }); const calendarBusy = freeBusyResult.calendars?.[calendarId]?.busy || []; return calendarBusy.length > 0; }; calendar.getAllCalendarEvents = async function (maxResults) { const calendarListResponse = await base.calendarList.listCalendars(); const calendars = calendarListResponse.items || []; const results = []; for (const cal of calendars) { if (cal.accessRole === "reader" || cal.accessRole === "writer" || cal.accessRole === "owner") { try { const eventsResponse = await base.events.listEvents({ calendarId: cal.id, maxResults, singleEvents: true, orderBy: "startTime", }); results.push({ calendar: cal, events: eventsResponse.items || [] }); } catch { } } } return results; }; calendar.createEvent = function (calendarId, event) { return base.events.insertEvent({ calendarId, ...event }); }; calendar.updateEvent = function (calendarId, eventId, event) { return base.events.updateEvent({ calendarId, eventId, ...event }); }; calendar.deleteEvent = function (calendarId, eventId) { return base.events.deleteEvent({ calendarId, eventId }); }; calendar.quickAddEvent = function (calendarId, text) { return base.events.quickAddEvent({ calendarId, text }); }; return calendar; } export { GoogleOAuth } from "./oauth"; export * from "./types"; //# sourceMappingURL=index.js.map