96 lines
1.9 KiB
TypeScript
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)
|
|
)
|
|
}
|