import { Request, Response } from "express"; import CalendarService from "../service/calendarService"; import CalendarTypeService from "../service/calendarTypeService"; import { calendar } from "../entity/calendar"; import { createEvents } from "ics"; import moment from "moment"; import InternalException from "../exceptions/internalException"; import CalendarFactory from "../factory/admin/calendar"; /** * @description get all calendar items by types or nscdr * @summary passphrase is passed as value pair like `type:passphrase` * @param req {Request} Express req object * @param res {Response} Express res object * @returns {Promise<*>} */ export async function getCalendarItemsByTypes(req: Request, res: Response): Promise { let types = Array.isArray(req.query.types) ? req.query.types : [req.query.types]; let output = (req.query.output as "ics" | "json") ?? "ics"; if (output != "ics" && output != "json") { throw new InternalException("set output query value to `ics` or `json` (defaults to `ics`)"); } types = types.filter((t) => t); let items: Array = []; if (types.length != 0) { let typeIds = await CalendarTypeService.getByTypes((types as Array).map((t) => t.split(":")[0])); typeIds = typeIds.filter( (ti) => ti.passphrase == null || ti.passphrase == "" || ti.passphrase == (types as Array).find((t) => t.includes(ti.type)).split(":")[1] ); items = await CalendarService.getByTypes(typeIds.map((t) => t.id)); } else { items = await CalendarService.getByTypeNSCDR(); } if (output == "json") { res.json(CalendarFactory.mapToBase(items)); } else { let events = createEvents( items.map((i) => ({ calName: process.env.CLUB_NAME, uid: i.id, sequence: 1, ...(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], 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", url: "https://www.ff-merching.de", alarms: [ { action: "display", description: "Erinnerung", trigger: { minutes: 30, before: true, }, }, ], })) ); res.type("ics").send(events.value); } }