import { CalendarEvent } from "./calendarClient"; import { v5 as uuidv5 } from "uuid"; import short from "short-uuid"; import { stripHtml } from "./emails/helpers"; const translator = short(); export default class CalEventParser { calEvent: CalendarEvent; constructor(calEvent: CalendarEvent) { this.calEvent = calEvent; } /** * Returns a link to reschedule the given booking. */ public getRescheduleLink(): string { return process.env.BASE_URL + "/reschedule/" + this.getUid(); } /** * Returns a link to cancel the given booking. */ public getCancelLink(): string { return process.env.BASE_URL + "/cancel/" + this.getUid(); } /** * Returns a unique identifier for the given calendar event. */ public getUid(): string { return translator.fromUUID(uuidv5(JSON.stringify(this.calEvent), uuidv5.URL)); } /** * Returns a footer section with links to change the event (as HTML). */ public getChangeEventFooterHtml(): string { return `

Need to change this event?
Cancel: ${this.getCancelLink()}
Reschedule: ${this.getRescheduleLink()} `; } /** * Returns a footer section with links to change the event (as plain text). */ public getChangeEventFooter(): string { return stripHtml(this.getChangeEventFooterHtml()); } /** * Returns an extended description with all important information (as HTML). * * @protected */ public getRichDescriptionHtml(): string { return ( ` Event Type:
${this.calEvent.type}

Invitee Email:
${this.calEvent.attendees[0].email}

` + (this.calEvent.location ? ` Location:
${this.calEvent.location}

` : "") + `Invitee Time Zone:
${this.calEvent.attendees[0].timeZone}

Additional notes:
${this.calEvent.description} ` + this.getChangeEventFooterHtml() ); } /** * Returns an extended description with all important information (as plain text). * * @protected */ public getRichDescription(): string { return stripHtml(this.getRichDescriptionHtml()); } /** * Returns a calendar event with rich description. */ public asRichEvent(): CalendarEvent { const eventCopy: CalendarEvent = { ...this.calEvent }; eventCopy.description = this.getRichDescriptionHtml(); return eventCopy; } }