@remcostoeten/fync
Version:
Unified TypeScript library for 9 popular APIs with consistent functional architecture
199 lines • 7.56 kB
JavaScript
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