evwiki/src/Infrastructure/PostgreSQL/Repository/CarRevisionRepository/PostgreSQLCarRevisionRepository.php
2025-06-02 06:37:37 +02:00

86 lines
2.6 KiB
PHP

<?php
namespace App\Infrastructure\PostgreSQL\Repository\CarRevisionRepository;
use App\Domain\Model\CarRevision;
use App\Domain\Model\CarRevisionCollection;
use App\Domain\Model\Value\CarRevisionId;
use App\Domain\Model\Value\CarModelId;
use App\Domain\Repository\CarRevisionRepository;
use Doctrine\DBAL\Connection;
final class PostgreSQLCarRevisionRepository implements CarRevisionRepository
{
public function __construct(
private readonly Connection $connection,
) {}
public function findAll(): CarRevisionCollection
{
$sql = 'SELECT * FROM car_revisions ORDER BY name ASC';
$result = $this->connection->executeQuery($sql);
$carRevisions = [];
$mapper = new ModelMapper();
foreach ($result->fetchAllAssociative() as $row) {
$carRevisions[] = $mapper->map($row);
}
return new CarRevisionCollection($carRevisions);
}
public function findById(CarRevisionId $carRevisionId): ?CarRevision
{
$sql = 'SELECT * FROM car_revisions WHERE id = ?';
$result = $this->connection->executeQuery($sql, [$carRevisionId->value]);
$row = $result->fetchAssociative();
if ($row === false) {
return null;
}
$mapper = new ModelMapper();
return $mapper->map($row);
}
public function findByCarModelId(CarModelId $carModelId): CarRevisionCollection
{
$sql = 'SELECT * FROM car_revisions WHERE car_model_id = ? ORDER BY name ASC';
$result = $this->connection->executeQuery($sql, [$carModelId->value]);
$carRevisions = [];
$mapper = new ModelMapper();
foreach ($result->fetchAllAssociative() as $row) {
$carRevisions[] = $mapper->map($row);
}
return new CarRevisionCollection($carRevisions);
}
public function save(CarRevision $carRevision): void
{
$sql = 'INSERT INTO car_revisions (id, car_model_id, name) VALUES (?, ?, ?) ON CONFLICT (id) DO UPDATE SET car_model_id = EXCLUDED.car_model_id, name = EXCLUDED.name';
$this->connection->executeStatement($sql, [
$carRevision->carRevisionId->value,
$carRevision->carModelId->value,
$carRevision->name
]);
return;
}
public function delete(CarRevision $carRevision): void
{
$sql = 'DELETE FROM car_revisions WHERE id = ?';
$this->connection->executeStatement($sql, [$carRevision->carRevisionId->value]);
}
public function deleteAll(): void
{
$this->connection->executeStatement('DELETE FROM car_revisions');
}
}