@openinc/parse-server-opendash
Version:
Parse Server Cloud Code for open.INC Stack.
125 lines (124 loc) • 4.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CalendarManager = void 0;
const tenantID = process.env.MICROSOFT_TENANT_ID;
const clientID = process.env.MICROSOFT_CLIENT_ID;
const clientSecret = process.env.MICROSOFT_CLIENT_SECRET;
const userMail = process.env.MICROSOFT_USER_EMAIL;
/**
* Manager for calendar operations via Microsoft Graph API
*/
class CalendarManager {
constructor() {
this.isValid = !!(tenantID && clientID && clientSecret && userMail);
}
async getAccess() {
if (!this.isValid)
return null;
console.log("Getting access token...");
try {
const params = new URLSearchParams();
params.append("client_id", clientID);
params.append("client_secret", clientSecret);
params.append("scope", "https://graph.microsoft.com/.default");
params.append("grant_type", "client_credentials");
const response = await fetch(`https://login.microsoftonline.com/${tenantID}/oauth2/v2.0/token`, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
body: params.toString(),
});
const data = await response.json();
console.log("Access token fetched successfully:", data);
return data;
}
catch (error) {
console.error("Error fetching access token:", error);
return null;
}
}
/**
* Create a new event in the calendar
* @param event The event data to create
* @returns the created event response
*/
async createEvent(event) {
if (!userMail || !tenantID || !clientID || !clientSecret)
return;
const accessData = await this.getAccess();
if (!accessData?.access_token)
return;
const res = await fetch(`https://graph.microsoft.com/v1.0/users/${encodeURIComponent(userMail)}/events`, {
method: "POST",
headers: {
Authorization: `Bearer ${accessData.access_token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(event),
});
const data = (await res.json());
console.log("Event creation response:", data);
return data;
}
/**
* Update an event in the calendar
* @param eventId The ID of the event to update
* @param event The updated event data
* @returns
*/
async updateEvent(eventId, event) {
const accessData = await this.getAccess();
if (!accessData?.access_token)
return;
const res = await fetch(`https://graph.microsoft.com/v1.0/users/${encodeURIComponent(userMail)}/events/${eventId}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${accessData.access_token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(event),
});
const data = await res.json();
console.log("Event update response:", data);
return data;
}
/**
* Delete an event from the calendar
* @param eventId The ID of the event to delete
* @returns whether the deletion was successful
*/
async deleteEvent(eventId) {
const accessData = await this.getAccess();
if (!accessData?.access_token)
return;
// on successful deletion, Microsoft Graph returns 204 No Content, so no JSON to parse
const res = await fetch(`https://graph.microsoft.com/v1.0/users/${encodeURIComponent(userMail)}/events/${eventId}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${accessData.access_token}`,
},
});
console.log("Event deletion response:", res);
return res.ok;
}
/**
* Fetch all events in calendar
* @returns the list of events
*/
async fetchEvents() {
const accessData = await this.getAccess();
if (!accessData?.access_token)
return;
const res = await fetch(`https://graph.microsoft.com/v1.0/users/${encodeURIComponent(userMail)}/events`, {
method: "GET",
headers: {
Authorization: `Bearer ${accessData.access_token}`,
},
});
const data = await res.json();
console.log("Calendar events:", data);
return data;
}
}
exports.CalendarManager = CalendarManager;