63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { createEvents } from "ics";
|
|
import { calendar } from "../entity/club/calendar";
|
|
import moment from "moment";
|
|
import { CLUB_NAME, CLUB_WEBSITE, MAIL_USERNAME } from "../env.defaults";
|
|
|
|
export abstract class CalendarHelper {
|
|
public static buildICS(entries: Array<calendar>): { error?: Error; value?: string } {
|
|
return createEvents(
|
|
entries.map((i) => ({
|
|
calName: process.env.CLUB_NAME,
|
|
uid: i.id,
|
|
sequence: i.sequence,
|
|
...(i.allDay
|
|
? {
|
|
start: moment(i.starttime)
|
|
.format("YYYY-M-D")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number],
|
|
end: moment(i.endtime)
|
|
.format("YYYY-M-D")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number],
|
|
}
|
|
: {
|
|
start: moment(i.starttime)
|
|
.format("YYYY-M-D-H-m")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number, number, number],
|
|
end: moment(i.endtime)
|
|
.format("YYYY-M-D-H-m")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number, number, number],
|
|
}),
|
|
title: i.title,
|
|
description: i.content,
|
|
location: i.location,
|
|
categories: [i.type.type],
|
|
organizer: { name: CLUB_NAME, email: MAIL_USERNAME },
|
|
created: moment(i.createdAt)
|
|
.format("YYYY-M-D-H-m")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number, number, number],
|
|
lastModified: moment(i.updatedAt)
|
|
.format("YYYY-M-D-H-m")
|
|
.split("-")
|
|
.map((a) => parseInt(a)) as [number, number, number, number, number],
|
|
transp: "OPAQUE" as "OPAQUE",
|
|
status: "CONFIRMED",
|
|
...(CLUB_WEBSITE != "" ? { url: CLUB_WEBSITE } : {}),
|
|
alarms: [
|
|
{
|
|
action: "display",
|
|
summary: "Erinnerung",
|
|
trigger: {
|
|
minutes: 30,
|
|
before: true,
|
|
},
|
|
},
|
|
],
|
|
}))
|
|
);
|
|
}
|
|
}
|