*/ private array $clients = []; public function add(Client ...$clients): self { foreach ($clients as $client) { $this->clients[$client->id->value] = $client; } return $this; } public function clear(): void { $this->clients = []; } #[\Override] public function find(ClientId $id): ?Client { return $this->clients[$id->value] ?? null; } #[\Override] public function persist(Client $client): void { $this->clients[$client->id->value] = $client; } #[\Override] public function delete(Client $client): void { unset($this->clients[$client->id->value]); } #[\Override] public function findByIdentifier(ClientIdentifier $identifier): ?Client { foreach ($this->clients as $client) { if ($client->identifier->equals($identifier)) { return $client; } } return null; } #[\Override] public function search(string $query, Pagination $pagination): Paginated { $trimmed = strtolower(trim($query)); if ($trimmed === '') { return new Paginated($pagination, [], 0); } $matches = []; foreach ($this->clients as $client) { $nameMatches = str_contains(strtolower($client->name->value), $trimmed); $slugMatches = str_contains(strtolower(Str::slug($client->name->value)), $trimmed); $identifierMatches = str_contains(strtolower($client->identifier->value), $trimmed); $idMatches = str_contains(strtolower($client->id->value), $trimmed); if ($nameMatches || $slugMatches || $identifierMatches || $idMatches) { $matches[] = $client; } } $total = count($matches); $offset = $pagination->from(); $limit = $pagination->pageSize(); $paged = array_slice($matches, $offset, $limit); return new Paginated($pagination, $paged, $total); } #[\Override] public function existsByName(ClientName $name): bool { $slug = Str::slug($name->value); foreach ($this->clients as $client) { if (Str::slug($client->name->value) === $slug) { return true; } } return false; } #[\Override] public function findAll(Pagination $pagination): Paginated { $items = array_values($this->clients); $total = count($items); $offset = $pagination->from(); $limit = $pagination->pageSize(); $paged = array_slice($items, $offset, $limit); return new Paginated($pagination, $paged, $total); } }