diff --git a/package-lock.json b/package-lock.json index ae878fb..19c8b44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,6 +30,7 @@ "firebase-admin": "^13.0.2", "jsdom": "^26.0.0", "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", "object-hash": "^3.0.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", @@ -49,6 +50,7 @@ "@types/express": "^5.0.0", "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", + "@types/lodash": "^4.17.16", "@types/multer": "^1.4.12", "@types/node": "^22.10.9", "@types/object-hash": "^3.0.6", @@ -3946,6 +3948,13 @@ "@types/node": "*" } }, + "node_modules/@types/lodash": { + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/long": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", @@ -9602,6 +9611,8 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash.camelcase": { diff --git a/package.json b/package.json index 16b65cd..96e9037 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "firebase-admin": "^13.0.2", "jsdom": "^26.0.0", "jsonwebtoken": "^9.0.2", + "lodash": "^4.17.21", "object-hash": "^3.0.0", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", @@ -61,6 +62,7 @@ "@types/express": "^5.0.0", "@types/jest": "^29.5.14", "@types/jsdom": "^21.1.7", + "@types/lodash": "^4.17.16", "@types/multer": "^1.4.12", "@types/node": "^22.10.9", "@types/object-hash": "^3.0.6", diff --git a/src/schedule/internal/schedule-parser/schedule-parser.ts b/src/schedule/internal/schedule-parser/schedule-parser.ts index b4d598d..c699573 100644 --- a/src/schedule/internal/schedule-parser/schedule-parser.ts +++ b/src/schedule/internal/schedule-parser/schedule-parser.ts @@ -24,6 +24,7 @@ import { } from "class-validator"; import { ClassProperties } from "../../../utility/class-trasformer/class-transformer-ctor"; import { ToMap } from "create-map-transform-fn"; +import cloneDeep from "lodash/cloneDeep"; type InternalId = { /** @@ -353,74 +354,53 @@ export class ScheduleParser { private static convertGroupsToTeachers( groups: Map, ): Map { - const result = new Map(); + const teachers = new Map(); - for (const groupName of groups.keys()) { - const group = groups.get(groupName); + const days = (() => { + const group = groups.values().next().value as Group; - for (const day of group.days) { - for (const lesson of day.lessons) { - if (lesson.type !== LessonType.DEFAULT) continue; + return group.days.map((day) => { + return new TeacherDay({ + name: day.name, + street: day.street, + date: day.date, + lessons: [], + }); + }); + })(); - for (const subGroup of lesson.subGroups) { - let teacherDto: Teacher = result.get(subGroup.teacher); + const cloneDays = () => cloneDeep(days); - if (!teacherDto) { - teacherDto = new Teacher({ - name: subGroup.teacher, - days: [], - }); + for (const group of groups.values()) { + group.days.forEach((day, dayIndex) => { + for (const groupLesson of day.lessons) { + if (groupLesson.type !== LessonType.DEFAULT) continue; - result.set(subGroup.teacher, teacherDto); + for (const subGroup of groupLesson.subGroups) { + if (!teachers.has(subGroup.teacher)) { + teachers.set( + subGroup.teacher, + new Teacher({ + name: subGroup.teacher, + days: cloneDays(), + }), + ); } - let teacherDay = teacherDto.days[ - day.name - ] as TeacherDay; + const teacherDay = teachers.get(subGroup.teacher).days[ + dayIndex + ]; - if (!teacherDay) { - teacherDay = teacherDto.days[day.name] = - new TeacherDay({ - name: day.name, - date: day.date, - lessons: [], - }); - } + const lesson = cloneDeep(groupLesson) as TeacherLesson; + lesson.group = group.name; - const teacherLesson = structuredClone( - lesson, - ) as TeacherLesson; - teacherLesson.group = groupName; - - teacherDay.lessons.push(teacherLesson); + teacherDay.lessons.push(lesson); } } - } + }); } - for (const teacherName of result.keys()) { - const teacher = result.get(teacherName); - - const days = teacher.days; - - // eslint-disable-next-line @typescript-eslint/no-for-in-array - for (const dayName in days) { - const day = days[dayName]; - - // eslint-disable-next-line @typescript-eslint/no-array-delete - delete days[dayName]; - - day.lessons.sort( - (a, b) => a.time.start.valueOf() - b.time.start.valueOf(), - ); - - days.push(day); - } - - days.sort((a, b) => a.date.valueOf() - b.date.valueOf()); - } - - return result; + return teachers; } /**