numberOfTimesCreateCalled++; $id = $this->nextId(); $scheduledNode = new ScheduledNode( id: $id, date: $dto->date, plan: $dto->plan, node: $dto->node, completed: false, ); $this->existingScheduledNodes[$id] = $scheduledNode; return $scheduledNode; } public function update(ScheduledNode $node): ScheduledNode { $this->existingScheduledNodes[$node->getId()] = $node; return new ScheduledNode( id: $node->getId(), date: $node->getDate(), plan: $node->getPlan(), node: $node->getNode(), completed: $node->getCompleted() ); } public function find(int $id): ?ScheduledNode { return array_find( $this->existingScheduledNodes, function (ScheduledNode $scheduledNode) use ($id) { return $scheduledNode->getId() === $id; } ); } public function getNumberOfTimesCreateCalled(): int { return $this->numberOfTimesCreateCalled; } private function nextId(): int { return count($this->existingScheduledNodes); } public function findByUser(User $user): array { $scheduledNodes = array_filter( $this->existingScheduledNodes, function (ScheduledNode $node) use ($user) { return $node->getPlan()->getUser()->getId() === $user->getId(); } ); return array_map( function (ScheduledNode $node) { return new ScheduledNode( id: $node->getId(), date: $node->getDate(), plan: $node->getPlan(), node: $node->getNode(), completed: $node->getCompleted(), ); }, $scheduledNodes, ); } }