diff --git a/libs/api-admentum/lib/apiAdmentum.ts b/libs/api-admentum/lib/apiAdmentum.ts index 19f804ab..30122899 100644 --- a/libs/api-admentum/lib/apiAdmentum.ts +++ b/libs/api-admentum/lib/apiAdmentum.ts @@ -29,7 +29,12 @@ import { DateTime, FixedOffsetZone } from 'luxon' import * as html from 'node-html-parser' import { fakeFetcher } from './fake/fakeFetcher' import { checkStatus, DummyStatusChecker } from './loginStatus' -import { extractMvghostRequestBody, parseCalendarItem } from './parse/parsers' +import { + extractMvghostRequestBody, + parseTimetableData, + parseScheduleEventData, + parseBreaksData, + } from './parse/parsers' import { bankIdInitUrl, bankIdCheckUrl, @@ -204,7 +209,7 @@ export class ApiAdmentum extends EventEmitter implements Api { const now = DateTime.local() const [year, week] = now.toISOWeekDate().split('-') const isoWeek = week.replace('W', '') - + const fetchUrl = apiUrls.overview( 'get-week-data', year.toString(), @@ -216,94 +221,25 @@ export class ApiAdmentum extends EventEmitter implements Api { 'x-requested-with': 'XMLHttpRequest', }, }) + const calendarItems: CalendarItem[] = [] + const overviewJson = await overviewResponse.json() - console.log('get-week-data response', overviewJson) - const schedule_events = (await overviewJson)?.data?.schedule_events // .breaks: [] | .assignments: [] - if (!schedule_events) { - return Promise.resolve([]) - } - /* -"url": "https://skola.admentum.se/api/v1/schedule_event_instances/2990834/", - "id": 2990834, - "school_id": 824, - "start_date": "2023-08-07", - "end_date": "2023-08-07", - "schedule_event": { - "url": "https://skola.admentum.se/api/v1/schedule_events/148722/", - "id": 148722, - "eid": null, - "schedule_id": 4385, - "name": "Engelska", - "start_time": "08:00:00", - "end_time": "09:30:00", - "rooms": [ - { - "url": "https://skola.admentum.se/api/v1/rooms/7200/", - "id": 7200 - } - ], - "teachers": [ - { - "url": "https://skola.admentum.se/api/v1/users/437302/", - "id": 437302 - } - ], - "schedule_groups": [], - "primary_groups": [ - { - "url": "https://skola.admentum.se/api/v1/primary_groups/36874/", - "id": 36874 - } - ], - "weekly_interval": "" - } - */ - return Promise.resolve([]) + + const scheduleEventJson = (await overviewJson)?.data?.schedule_events // .breaks: [] | .assignments: [] + const schedule_events = parseScheduleEventData(scheduleEventJson) + calendarItems.push(...schedule_events) + + const breaks = (await overviewJson)?.data?.breaks + const break_events = parseBreaksData(breaks); + calendarItems.push(...break_events) + + return calendarItems } catch (e) { console.error('Error fetching overview', e) return Promise.resolve([]) } } - async getScheduledEvents(child: EtjanstChild): Promise { - if (!this.isLoggedIn) { - throw new Error('Not logged in...') - } - console.log('get calendar') - const fetchUrl = apiUrls.schedule_events - console.log('fetching calendar', fetchUrl) - const eventsResponse = await this.fetch('scheduled-events', fetchUrl, { - method: 'GET', - headers: { - Accept: 'application/json, text/plain, */*', - }, - }) - - if (eventsResponse.status === 403) { - console.error('Not allwed. Error headers', eventsResponse.headers) - return [] - } - if (eventsResponse.status !== 200) { - console.error('Error headers', eventsResponse.headers) - throw new Error( - 'Could not fetch children. Response code: ' + eventsResponse.status - ) - } - - const eventsResponseJson = await eventsResponse.json() - console.log('eventsResponseJson', eventsResponseJson) - return [] - // const fetchUrl = apiUrls.schedule_events - // const events = await this.fetch('scheduled-events', fetchUrl, { - // method: 'GET', - // headers: { - // 'Accept': 'application/json, text/plain, */*', - // }, - // }).then(res => res.json()).then(json => json.results) - - // return events.map(parseScheduleEvent)*/ - } - // eslint-disable-next-line @typescript-eslint/no-unused-vars getClassmates(_child: EtjanstChild): Promise { // TODO: We could get this from the events a child is associated with... @@ -463,7 +399,7 @@ export class ApiAdmentum extends EventEmitter implements Api { console.log('fetching timetable', fetchUrl) const calendarResponse = await this.fetch('get-calendar', fetchUrl) const calendarResponseJson = await calendarResponse.json() - const timetableEntries = parseCalendarItem(calendarResponseJson) + const timetableEntries = parseTimetableData(calendarResponseJson) return timetableEntries } diff --git a/libs/api-admentum/lib/parse/parsers.ts b/libs/api-admentum/lib/parse/parsers.ts index 26c46612..7bc908b9 100644 --- a/libs/api-admentum/lib/parse/parsers.ts +++ b/libs/api-admentum/lib/parse/parsers.ts @@ -71,6 +71,69 @@ export const parseScheduleEvent = (({ allDay?: start_time === '00:00:00' && end_time === '23:59:00' }) */ +/* OVERVIEW: +"status": 200, + "data": { + "year": 2023, + "week": 38, + "assignments": [], + "breaks": [ + { + "id": 11031, + "break_type": 1, + "break_period": 1, + "name": "Studiedag", + "date": "2023-09-21", + "week": null, + "start_date": null, + "end_date": null + } + ], + "schedule_events": [ + { + "id": 3110610, + "name": "Utvecklingssamtal", + "formatted_time": "Heldag", + "formatted_date": "2023-09-22" + } + ] + } +} +*/ +export const parseBreaksData = (jsonData: any): CalendarItem[] => { + const breakItems: CalendarItem[] = [] + if (jsonData) { + jsonData.forEach((event: { id: any; name: any; date: any, start_date: any; end_date: any }) => { + breakItems.push({ + id: event.id, + title: event.name, + startDate: event.start_date || event.date, + endDate: event.end_date || event.date, + } as CalendarItem) + }); + } else { + console.error("Failed to parse breaks, no breaks found in json data.") + } + return breakItems; +} + +export const parseScheduleEventData = (jsonData: any): CalendarItem[] => { + const calendarItems: CalendarItem[] = [] + if (jsonData) { + jsonData.forEach((event: { id: any; name: any; formatted_date: any; formatted_time: any }) => { + calendarItems.push({ + id: event.id, + title: event.name, + startDate: event.formatted_date, + endDate: event.formatted_date, + allDay: event.formatted_time === 'Heldag', + } as CalendarItem) + }); + } else { + console.error("Failed to parse schedule events, no schedule events found in json data.") + } + return calendarItems; +} enum DayOfWeek { 'Måndag'= 1, @@ -82,7 +145,7 @@ enum DayOfWeek { 'Söndag'= 7, } -export const parseCalendarItem = (jsonData: any): any => { +export const parseTimetableData = (jsonData: any): any => { const timetableEntries: TimetableEntry[] = [] if (jsonData && jsonData.days && Array.isArray(jsonData.days) && jsonData.days.length > 0) { jsonData.days.forEach((day: { name: string, lessons: any[] }) => { @@ -100,7 +163,7 @@ export const parseCalendarItem = (jsonData: any): any => { }); }) } else { - console.error("Failed to parse calendar item, no days found in json data.") + console.error("Failed to parse timetable, no days found in json data.") } return timetableEntries; }