diff --git a/src/Repository/NameserverRepository.php b/src/Repository/NameserverRepository.php index dc4e6f1..09204f9 100644 --- a/src/Repository/NameserverRepository.php +++ b/src/Repository/NameserverRepository.php @@ -6,249 +6,257 @@ use App\Controller\DatabaseConnection; use App\Entity\Nameserver; use PDO; use PDOException; +use SodiumException; /** * */ class NameserverRepository { - public function __construct(private readonly DatabaseConnection $databaseConnection) - { - } - - - /** - * @return array - */ - public function findAll(): array - { - $nameservers = []; - $sql = " - SELECT id, name, a, aaaa, apikey + public function __construct(private readonly DatabaseConnection $databaseConnection) + { + // no body + } + + + /** + * @return array|null + */ + public function findAll(): ?array + { + $nameservers = []; + $sql = " + SELECT id, name, a, aaaa, apikey, apikey_prefix FROM " . DatabaseConnection::TABLE_NAMESERVERS . " ORDER BY name"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->execute(); - while ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { - $nameserver = new Nameserver(name: $result['name'], id: $result['id'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey']); - $nameservers[] = $nameserver; - } - return $nameservers; - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @return \App\Entity\Nameserver - */ - public function findFirst(): Nameserver - { - $nameservers = []; - $sql = " - SELECT id, name, a, aaaa, apikey + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->execute(); + while ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { + $nameserver = new Nameserver(name: $result['name'], id: $result['id'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey'], apikeyPrefix: $result['apikey_prefix']); + $nameservers[] = $nameserver; + } + return $nameservers; + } catch (PDOException $e) { + exit($e->getMessage()); + } + } + + + /** + * @return Nameserver|null + */ + public function findFirst(): ?Nameserver + { + $sql = " + SELECT id, name, a, aaaa, apikey, apikey_prefix FROM " . DatabaseConnection::TABLE_NAMESERVERS . " ORDER BY name"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->execute(); - $result = $statement->fetch(mode: PDO::FETCH_ASSOC); - return new Nameserver(name: $result['name'], id: $result['id'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey']); - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @param int $id - * - * @return null|\App\Entity\Nameserver - */ - public function findByID(int $id): ?Nameserver - { - $sql = " - SELECT id, name, a, aaaa, apikey + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->execute(); + $result = $statement->fetch(mode: PDO::FETCH_ASSOC); + return new Nameserver(name: $result['name'], id: $result['id'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey'], apikeyPrefix: $result['apikey_prefix']); + } catch (PDOException $e) { + exit($e->getMessage()); + } + } + + + /** + * @param int $id + * + * @return null|Nameserver + */ + public function findByID(int $id): ?Nameserver + { + $sql = " + SELECT id, name, a, aaaa, apikey, apikey_prefix FROM . " . DatabaseConnection::TABLE_NAMESERVERS . " WHERE id = :id"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->bindParam(param: ':id', var: $id); - $statement->execute(); - if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { - return new Nameserver(name: $result['name'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey']); - } else { - return null; - } - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @param String $name - * - * @return \App\Entity\Nameserver|bool - */ - public function findByName(string $name): Nameserver|bool - { - $sql = " - SELECT id, name, a, aaaa, apikey + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->bindParam(param: ':id', var: $id); + $statement->execute(); + if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { + return new Nameserver(name: $result['name'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey'], apikeyPrefix: $result['apikey_prefix']); + } else { + return null; + } + } catch (PDOException $e) { + exit($e->getMessage()); + } + } + + + /** + * @param String $name + * + * @return Nameserver|null + */ + public function findByName(string $name): ?Nameserver + { + $sql = " + SELECT id, name, a, aaaa, apikey, apikey_prefix FROM " . DatabaseConnection::TABLE_NAMESERVERS . " WHERE name = :name"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->bindParam(param: ':name', var: $name); - $statement->execute(); - if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { - return new Nameserver(name: $result['name'], a: $result['a'], aaaa: $result['aaaa']); - } else { - return false; - } - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @param \App\Entity\Nameserver $nameserver - * - * @return string|false - */ - public function insert(Nameserver $nameserver): bool|string - { - $sql = " - INSERT INTO " . DatabaseConnection::TABLE_NAMESERVERS . " (name, a, aaaa, apikey) - VALUES (:name, :a, :aaaa, :apikey)"; - - try { - $name = $nameserver->getName(); - $a = $nameserver->getA(); - $aaaa = $nameserver->getAaaa(); - $apikey = $nameserver->getApikey(); - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->bindParam(param: ':name', var: $name); - $statement->bindParam(param: ':a', var: $a); - $statement->bindParam(param: ':aaaa', var: $aaaa); - $statement->bindParam(param: ':apikey', var: $apikey); - $statement->execute(); - - return $this->databaseConnection->getConnection()->lastInsertId(); - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @param Int $id - * @param String $name - * @param String $a - * @param String $aaaa - * @param String $apikey - * - * @return false|int - */ - public function update(int $id, string $name, string $a, string $aaaa, string $apikey): bool|int - { - $current = $this->findByID(id: $id); - - /* doesn't work - $statement = " - INSERT INTO domains(id, name, a, aaaa) - VALUES(:id, :name, :a, :aaaa) - ON DUPLICATE KEY UPDATE - name=COALESCE(VALUES(name), :name), - a=COALESCE(:a, a), - aaaa=COALESCE(:aaaa, aaaa)"; - */ - - if (empty($name)) { - $name = $current->getName(); - } - if (empty($a)) { - $a = $current->getA(); - } - if (empty($aaaa)) { - $aaaa = $current->getAaaa(); - } - if (empty($apikey)) { - $apikey = $current->getApikey(); - } - - $sql = " + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->bindParam(param: ':name', var: $name); + $statement->execute(); + if ($result = $statement->fetch(mode: PDO::FETCH_ASSOC)) { + return new Nameserver(name: $result['name'], a: $result['a'], aaaa: $result['aaaa'], apikey: $result['apikey'], apikeyPrefix: $result['apikey_prefix']); + } else { + return null; + } + } catch (PDOException $e) { + exit($e->getMessage()); + } + } + + + /** + * @param Nameserver $nameserver + * + * @return int|null + */ + public function insert(Nameserver $nameserver): ?int + { + $name = $nameserver->getName(); + $a = $nameserver->getA(); + $aaaa = $nameserver->getAaaa(); + $apikey = $nameserver->getApikey(); + $apikeyPrefix = $nameserver->getApikeyPrefix(); + + + $sql = " + INSERT INTO " . DatabaseConnection::TABLE_NAMESERVERS . " (name, a, aaaa, apikey, apikey_prefix) + VALUES (:name, :a, :aaaa, :apikey, :apikey_prefix)"; + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->bindParam(param: ':name', var: $name); + $statement->bindParam(param: ':a', var: $a); + $statement->bindParam(param: ':aaaa', var: $aaaa); + $statement->bindParam(param: ':apikey', var: $apikey); + $statement->bindParam(param: ':apikey_prefix', var: $apikeyPrefix); + $statement->execute(); + + return intval(value: $this->databaseConnection->getConnection()->lastInsertId()); + } catch (PDOException $e) { + exit($e->getMessage() . PHP_EOL); + } + } + + + /** + * @param Nameserver $nameserver + * @return false|int + */ + public function update(Nameserver $nameserver): bool|int + { + $id = $nameserver->getId(); + $name = $nameserver->getName(); + $a = $nameserver->getA(); + $aaaa = $nameserver->getAaaa(); + $apikey = $nameserver->getApikey(); + $apikeyPrefix = $nameserver->getApikeyPrefix(); + $passphrase = $nameserver->getPassphrase(); + + $current = $this->findByID(id: $id); + + + if (empty($name)) { + $name = $current->getName(); + } + if (empty($a)) { + $a = $current->getA(); + } + if (empty($aaaa)) { + $aaaa = $current->getAaaa(); + } + + if (empty($passphrase)) { + $apikey = $current->getApikey(); + $apikeyPrefix = $current->getApikeyPrefix(); + } + + + $sql = " UPDATE " . DatabaseConnection::TABLE_NAMESERVERS . " SET name = :name, a = :a, aaaa = :aaaa, - apikey = :apikey + apikey = :apikey, + apikey_prefix = :apikey_prefix WHERE id = :id"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->bindParam(param: 'id', var: $id); - $statement->bindParam(param: 'name', var: $name); - $statement->bindParam(param: 'a', var: $a); - $statement->bindParam(param: 'aaaa', var: $aaaa); - $statement->bindParam(param: 'apikey', var: $apikey); - $statement->execute(); - - return $statement->rowCount(); - } catch (PDOException $e) { - echo $e->getMessage(); - return false; - } - } - - - /** - * @param $id - * - * @return int - */ - public function delete($id): int - { - $sql = " + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->bindParam(param: 'id', var: $id); + $statement->bindParam(param: 'name', var: $name); + $statement->bindParam(param: 'a', var: $a); + $statement->bindParam(param: 'aaaa', var: $aaaa); + $statement->bindParam(param: 'apikey', var: $apikey); + $statement->bindParam(param: 'apikey_prefix', var: $apikeyPrefix); + $statement->execute(); + try { + sodium_memzero(string: $apikey); + } catch(SodiumException $e) { + die($e->getMessage() . PHP_EOL); + } + return intval(value: $statement->rowCount()); + } catch (PDOException $e) { + echo $e->getMessage(); + return false; + } + } + + + /** + * @param $id + * + * @return int|null + */ + public function delete($id): ?int + { + $sql = " DELETE FROM " . DatabaseConnection::TABLE_NAMESERVERS . " WHERE id = :id"; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->bindParam(param: 'id', var: $id); - $statement->execute(); - - return $statement->rowCount(); - } catch (PDOException $e) { - exit($e->getMessage()); - } - } - - - /** - * @param String $field - * - * @return int - */ - public function getLongestEntry(string $field): int - { - $sql = " + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->bindParam(param: 'id', var: $id); + $statement->execute(); + + return $statement->rowCount(); + } catch (PDOException $e) { + exit($e->getMessage()); + } + } + + + /** + * @param String $field + * + * @return int + */ + public function getLongestEntry(string $field): int + { + $sql = " SELECT MAX(LENGTH(" . $field . ")) as length FROM " . DatabaseConnection::TABLE_NAMESERVERS; - - try { - $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); - $statement->execute(); - $result = $statement->fetch(); - return $result['length']; - } catch (PDOException $e) { - exit($e->getMessage()); - } - } + + try { + $statement = $this->databaseConnection->getConnection()->prepare(query: $sql); + $statement->execute(); + $result = $statement->fetch(); + return $result['length']; + } catch (PDOException $e) { + exit($e->getMessage()); + } + } }