feca-mailshots-plugin/feca_mailshots_plugin/src/Repository/MailshotQueryRepository.php

78 lines
2.7 KiB
PHP

<?php
declare(strict_types=1);
namespace FecaMailshots\Repository;
use FecaMailshots\Infrastructure\DatabaseRouter;
use PDO;
final class MailshotQueryRepository
{
private DatabaseRouter $router;
public function __construct(DatabaseRouter $router)
{
$this->router = $router;
}
/** @return list<array<string, mixed>> */
public function all(): array
{
$sql = 'SELECT ID, name, LEFT(COALESCE(dsl_text, \'\'), 1000) AS dsl_text, OCTET_LENGTH(dsl_text) AS dsl_byte_size, updated_at FROM mailshot_queries ORDER BY name ASC';
return $this->router->mailshotsPdo()->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
/** @return list<string> */
public function names(): array
{
$rows = $this->router->mailshotsPdo()->query('SELECT name FROM mailshot_queries ORDER BY name ASC')->fetchAll(PDO::FETCH_ASSOC);
return array_map(static fn(array $row): string => (string) ($row['name'] ?? ''), $rows);
}
public function find(int $id): ?array
{
$stmt = $this->router->mailshotsPdo()->prepare('SELECT ID, name, dsl_text, updated_at FROM mailshot_queries WHERE ID = :id');
$stmt->execute(['id' => $id]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row === false ? null : $row;
}
public function findByName(string $name): ?array
{
$stmt = $this->router->mailshotsPdo()->prepare('SELECT ID, name, dsl_text, updated_at FROM mailshot_queries WHERE name = :name');
$stmt->execute(['name' => $name]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
return $row === false ? null : $row;
}
/** @param array{name:string,dsl_text:string} $data */
public function create(array $data): int
{
$stmt = $this->router->mailshotsPdo()->prepare('INSERT INTO mailshot_queries (name, dsl_text, `sql`) VALUES (:name, :dsl_text, :sql)');
$stmt->execute([
'name' => $data['name'],
'dsl_text' => $data['dsl_text'],
'sql' => '',
]);
return (int) $this->router->mailshotsPdo()->lastInsertId();
}
/** @param array{name:string,dsl_text:string} $data */
public function update(int $id, array $data): void
{
$stmt = $this->router->mailshotsPdo()->prepare('UPDATE mailshot_queries SET name = :name, dsl_text = :dsl_text WHERE ID = :id');
$stmt->execute([
'id' => $id,
'name' => $data['name'],
'dsl_text' => $data['dsl_text'],
]);
}
public function delete(int $id): void
{
$stmt = $this->router->mailshotsPdo()->prepare('DELETE FROM mailshot_queries WHERE ID = :id');
$stmt->execute(['id' => $id]);
}
}