{"version":3,"file":"index.cjs","names":[],"sources":["../../src/lib/index.ts"],"sourcesContent":["import type { ICalCalendar } from 'ical-generator';\n\nimport ical from 'ical-generator';\n\nimport {\n    type RequestParams,\n    type ResponseClasses,\n    type ResponseCourse,\n    type ResponseData,\n} from './types.js';\n\nexport default class FitnessFirstIcalProxy {\n    static createCalendar(courses: ResponseClasses): ICalCalendar {\n        const cal = ical({\n            name: 'Fitness First',\n            prodId: {\n                company: 'sebbo.net',\n                product: 'fitness-first-ical-proxy',\n            },\n            ttl: 60 * 60 * 6,\n        });\n\n        Object.entries(courses).forEach(([key, classes]) => {\n            const day = key.split('_')[0];\n\n            const allCourses: ResponseCourse[] = Array.isArray(classes)\n                ? classes\n                : Object.values(classes).flat();\n\n            allCourses.forEach((course: ResponseCourse) => {\n                const start = new Date(day + 'T' + course.time.from + 'Z');\n                const end = new Date(day + 'T' + course.time.to + 'Z');\n\n                cal.createEvent({\n                    end,\n                    floating: true,\n                    id: course.id,\n                    location: course.club,\n                    start,\n                    summary: course.title,\n                    url: course.url,\n                });\n            });\n        });\n\n        return cal;\n    }\n\n    static async getCourses(params: RequestParams): Promise<ResponseClasses> {\n        const url =\n            'https://www.fitnessfirst.de/magicline/api/class-shedule/' +\n            this.paramToString(params.club_id) +\n            '/' +\n            this.paramToString(params.category_id) +\n            '/' +\n            this.paramToString(params.class_id) +\n            '/' +\n            this.paramToString(params.daytime_id);\n\n        const res = await fetch(url);\n        const response = (await res.json()) as ResponseData;\n\n        // Kinderschwimmen @ Gendarmenmarkt\n        if (\n            params.club_id === '96' &&\n            (params.category_id === 'aqua' || !params.category_id)\n        ) {\n            Object.entries(response.classes).forEach(([key, classes]) => {\n                if (key.split('_', 2)[1] === 'sa') {\n                    const event = {\n                        category: 'Aqua',\n                        club: 'Berlin - Gendarmenmarkt',\n                        id: `kinderschwimmen-${key}`,\n                        time: {\n                            from: '09:00:00',\n                            to: '12:15:00',\n                        },\n                        title: 'Kinderschwimmen',\n                        url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n                    };\n\n                    if (Array.isArray(classes)) {\n                        response.classes[key] = {\n                            before_noon: [event],\n                        };\n                    } else {\n                        classes.before_noon = classes.before_noon || [];\n                        classes.before_noon.push(event);\n                    }\n                }\n                if (key.split('_', 2)[1] === 'th') {\n                    const event = {\n                        category: 'Aqua',\n                        club: 'Berlin - Gendarmenmarkt',\n                        id: `kinderschwimmen-${key}`,\n                        time: {\n                            from: '15:00:00',\n                            to: '17:15:00',\n                        },\n                        title: 'Kinderschwimmen',\n                        url: 'https://www.fitnessfirst.de/news/kinderschwimmen-1635593849',\n                    };\n\n                    if (Array.isArray(classes)) {\n                        response.classes[key] = {\n                            before_noon: [event],\n                        };\n                    } else {\n                        classes.before_noon = classes.before_noon || [];\n                        classes.before_noon.push(event);\n                    }\n                }\n            });\n        }\n\n        return response.classes;\n    }\n\n    static paramToString(\n        value: Array<number | string> | string | undefined,\n    ): string {\n        if (typeof value === 'string') {\n            return value;\n        }\n        if (typeof value === 'undefined' || value.length === 0) {\n            return 'all';\n        }\n\n        return value.map((v) => v.toString()).join('-');\n    }\n\n    static async request(params: RequestParams): Promise<ICalCalendar> {\n        const courses = await this.getCourses(params);\n        return this.createCalendar(courses);\n    }\n}\n"],"mappings":"+FAWA,IAAqB,EAArB,KAA2C,CACvC,OAAO,eAAe,EAAwC,CAC1D,IAAM,GAAA,EAAA,EAAA,QAAA,CAAW,CACb,KAAM,gBACN,OAAQ,CACJ,QAAS,YACT,QAAS,0BACb,EACA,IAAK,KAAU,CACnB,CAAC,EAyBD,OAvBA,OAAO,QAAQ,CAAO,CAAC,CAAC,SAAS,CAAC,EAAK,KAAa,CAChD,IAAM,EAAM,EAAI,MAAM,GAAG,CAAC,CAAC,IAEU,MAAM,QAAQ,CAAO,EACpD,EACA,OAAO,OAAO,CAAO,CAAC,CAAC,KAAK,EAAA,CAEvB,QAAS,GAA2B,CAC3C,IAAM,EAAQ,IAAI,KAAK,EAAM,IAAM,EAAO,KAAK,KAAO,GAAG,EACnD,EAAM,IAAI,KAAK,EAAM,IAAM,EAAO,KAAK,GAAK,GAAG,EAErD,EAAI,YAAY,CACZ,MACA,SAAU,GACV,GAAI,EAAO,GACX,SAAU,EAAO,KACjB,QACA,QAAS,EAAO,MAChB,IAAK,EAAO,GAChB,CAAC,CACL,CAAC,CACL,CAAC,EAEM,CACX,CAEA,aAAa,WAAW,EAAiD,CACrE,IAAM,EACF,2DACA,KAAK,cAAc,EAAO,OAAO,EACjC,IACA,KAAK,cAAc,EAAO,WAAW,EACrC,IACA,KAAK,cAAc,EAAO,QAAQ,EAClC,IACA,KAAK,cAAc,EAAO,UAAU,EAGlC,EAAY,MAAM,MADN,MAAM,CAAG,EAAA,CACC,KAAK,EAuDjC,OAnDI,EAAO,UAAY,OAClB,EAAO,cAAgB,QAAU,CAAC,EAAO,cAE1C,OAAO,QAAQ,EAAS,OAAO,CAAC,CAAC,SAAS,CAAC,EAAK,KAAa,CACzD,GAAI,EAAI,MAAM,IAAK,CAAC,CAAC,CAAC,KAAO,KAAM,CAC/B,IAAM,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmB,IACvB,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQ,CAAO,EACrB,EAAS,QAAQ,GAAO,CACpB,YAAa,CAAC,CAAK,CACvB,GAEA,EAAQ,YAAc,EAAQ,aAAe,CAAC,EAC9C,EAAQ,YAAY,KAAK,CAAK,EAEtC,CACA,GAAI,EAAI,MAAM,IAAK,CAAC,CAAC,CAAC,KAAO,KAAM,CAC/B,IAAM,EAAQ,CACV,SAAU,OACV,KAAM,0BACN,GAAI,mBAAmB,IACvB,KAAM,CACF,KAAM,WACN,GAAI,UACR,EACA,MAAO,kBACP,IAAK,6DACT,EAEI,MAAM,QAAQ,CAAO,EACrB,EAAS,QAAQ,GAAO,CACpB,YAAa,CAAC,CAAK,CACvB,GAEA,EAAQ,YAAc,EAAQ,aAAe,CAAC,EAC9C,EAAQ,YAAY,KAAK,CAAK,EAEtC,CACJ,CAAC,EAGE,EAAS,OACpB,CAEA,OAAO,cACH,EACM,CAQN,OAPI,OAAO,GAAU,SACV,EAEA,IAAU,QAAe,EAAM,SAAW,EAC1C,MAGJ,EAAM,IAAK,GAAM,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,CAClD,CAEA,aAAa,QAAQ,EAA8C,CAC/D,IAAM,EAAU,MAAM,KAAK,WAAW,CAAM,EAC5C,OAAO,KAAK,eAAe,CAAO,CACtC,CACJ"}