skolplattformen-backup/libs/api-skolplattformen/lib/parse/timetable.ts

96 lines
1.9 KiB
TypeScript

import { TimetableEntry } from '@skolplattformen/api'
import parse, { Language } from '@skolplattformen/curriculum'
import { DateTime } from 'luxon'
const calculateDate = (
year: number,
weekNumber: number,
weekday: number,
time: string
): string => {
const [hours, minutes, seconds] = time.split(':')
return DateTime.local()
.set({
weekYear: year,
weekNumber,
weekday,
hour: parseInt(hours, 10),
minute: parseInt(minutes, 10),
second: parseInt(seconds, 10),
millisecond: 0,
})
.toISO()
}
interface TimetableResponseEntry {
guidId: string
texts: string[]
timeStart: string
timeEnd: string
dayOfWeekNumber: number
blockName: string
}
export interface TimetableResponse {
error: string | null
data: {
textList: any[]
boxList: any[]
lineList: any[]
lessonInfo: TimetableResponseEntry[]
}
exception: any
validation: any[]
}
interface EntryParser {
(
args: TimetableResponseEntry,
year: number,
week: number,
lang: Language
): TimetableEntry
}
export const timetableEntry: EntryParser = (
{
guidId,
texts: [code, teacher, location],
timeStart,
timeEnd,
dayOfWeekNumber,
blockName,
},
year,
week,
lang
) => ({
...parse(code, lang),
id: guidId,
blockName,
dayOfWeek: dayOfWeekNumber,
location,
teacher,
timeEnd,
timeStart,
dateStart: calculateDate(year, week, dayOfWeekNumber, timeStart),
dateEnd: calculateDate(year, week, dayOfWeekNumber, timeEnd),
})
export const timetable = (
response: TimetableResponse,
year: number,
week: number,
lang: Language
) => {
if (response.error) {
throw new Error(response.error)
}
if (!response.data.lessonInfo) {
throw new Error('Empty lessonInfo received')
}
return response.data.lessonInfo.map((entry) =>
timetableEntry(entry, year, week, lang)
)
}