*/ private array $schedules = []; public function create(CreateScheduleDto $dto): Schedule { $id = count($this->schedules) + 1; $assignments = []; foreach ($dto->assignments as $assignmentDto) { $assignments[] = new ScheduleAssignment( id: count($assignments) + 1, name: $assignmentDto->name, kind: $assignmentDto->kind, path: $assignmentDto->path, scheduledDate: $assignmentDto->scheduledDate, position: $assignmentDto->position, ); } $schedule = new Schedule( id: $id, user: $dto->user, setName: $dto->setName, elementKind: $dto->elementKind, startDate: $dto->startDate, targetDate: $dto->targetDate, assignments: $assignments, ); $this->schedules[$id] = $schedule; return $this->copy($schedule); } public function findForUser(int $id, User $user): ?Schedule { $schedule = $this->schedules[$id] ?? null; if ($schedule === null || $schedule->getUser()->getId() !== $user->getId() ) { return null; } return $this->copy($schedule); } public function findAllForUser(User $user): array { $schedules = array_filter( $this->schedules, function (Schedule $schedule) use ($user): bool { return $schedule->getUser()->getId() === $user->getId(); }, ); krsort($schedules); return array_map(function (Schedule $schedule): Schedule { return $this->copy($schedule); }, array_values($schedules)); } private function copy(Schedule $schedule): Schedule { $assignments = array_map( function (ScheduleAssignment $assignment): ScheduleAssignment { return new ScheduleAssignment( id: $assignment->getId(), name: $assignment->getName(), kind: $assignment->getKind(), path: $assignment->getPath(), scheduledDate: $assignment->getScheduledDate(), position: $assignment->getPosition(), ); }, $schedule->getAssignments(), ); return new Schedule( id: $schedule->getId(), user: $schedule->getUser(), setName: $schedule->getSetName(), elementKind: $schedule->getElementKind(), startDate: $schedule->getStartDate(), targetDate: $schedule->getTargetDate(), assignments: $assignments, ); } }