*/ public function __invoke(GetStudentHomeworkQuery $query): array { $tenantId = TenantId::fromString($query->tenantId); $classId = $this->studentClassReader->currentClassId($query->studentId, $tenantId); if ($classId === null) { return []; } $homeworks = $this->homeworkRepository->findByClass(ClassId::fromString($classId), $tenantId); if ($query->subjectId !== null) { $filterSubjectId = $query->subjectId; $homeworks = array_values(array_filter( $homeworks, static fn (Homework $h): bool => (string) $h->subjectId === $filterSubjectId, )); } usort($homeworks, static fn (Homework $a, Homework $b): int => $a->dueDate <=> $b->dueDate); return $this->enrichHomeworks($homeworks, $query->tenantId); } /** * @param array $homeworks * * @return array */ private function enrichHomeworks(array $homeworks, string $tenantId): array { if ($homeworks === []) { return []; } $subjectIds = array_values(array_unique( array_map(static fn (Homework $h): string => (string) $h->subjectId, $homeworks), )); $teacherIds = array_values(array_unique( array_map(static fn (Homework $h): string => (string) $h->teacherId, $homeworks), )); $subjects = $this->displayReader->subjectDisplay($tenantId, ...$subjectIds); $teacherNames = $this->displayReader->teacherNames($tenantId, ...$teacherIds); $homeworkIds = array_map(static fn (Homework $h): HomeworkId => $h->id, $homeworks); $attachmentMap = $this->attachmentRepository->hasAttachments(...$homeworkIds); return array_map( static fn (Homework $h): StudentHomeworkDto => StudentHomeworkDto::fromDomain( $h, $subjects[(string) $h->subjectId]['name'] ?? '', $subjects[(string) $h->subjectId]['color'] ?? null, $teacherNames[(string) $h->teacherId] ?? '', $attachmentMap[(string) $h->id] ?? false, ), $homeworks, ); } }