feat: fetch week data

This commit is contained in:
William Ryder 2023-10-06 15:17:16 +02:00
parent f1c622ef60
commit ef5e5601c2
2 changed files with 85 additions and 86 deletions

View File

@ -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<CalendarItem[]> {
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<Classmate[]> {
// 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
}

View File

@ -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;
}