diff options
Diffstat (limited to 'src/Models/Device.php')
-rw-r--r-- | src/Models/Device.php | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/src/Models/Device.php b/src/Models/Device.php new file mode 100644 index 0000000..2b09c6b --- /dev/null +++ b/src/Models/Device.php @@ -0,0 +1,150 @@ +<?php + +namespace App\Models; + +use App\Database; +use App\Support\ConnectsToDatabase; + +class Device implements ConnectsToDatabase +{ + public function __construct( + private string $id, + private string $userId, + private string $name + ) + {} + + /** + * @param array<string,mixed> $row The row from the database + */ + public static function fromDatabase(array $row): self + { + return new self( + $row["id"], + $row["user_id"], + $row["name"] + ); + } + + public static function fetch(string $id = "", string $userId = ""): ?self + { + if (! empty($id) && empty($userId)) { + throw new \InvalidArgumentException("Can't fetch device without user id."); + } + + $row = []; + + if (! empty($userId)) { + if (! empty($id)) { + $row = Database::getInstance()->query( + <<<SQL + select * from devices where id=:id and user_id=:user_id + SQL, + [ + "id" => $id, + "user_id" => $userId, + ] + )->fetch(); + } else { + $row = Database::getInstance()->query( + <<<SQL + select * from devices where user_id=:user_id + SQL, + [ + "user_id" => $userId, + ] + )->fetch(); + } + } + + if (empty($row)) { + return null; + } + + return self::fromDatabase($row); + } + + public static function fetchAll(string $userId = ""): array + { + if (empty($userId)) { + throw new \InvalidArgumentException("missing user id"); + } + + $devices = []; + $rows = Database::getInstance()->query( + <<<SQL + select * from devices + where user_id=:user_id + SQL, + [ + "user_id" => $userId, + ] + )->fetchAll(); + + foreach ($rows as $row) { + $devices[] = Device::fromDatabase($row); + } + + return $devices; + } + + public static function new(string $userId, string $deviceId = "", string $initialDisplayName = ""): self + { + $deviceId = $deviceId ?: md5($userId . random_bytes(512)); + $initialDisplayName = $initialDisplayName ?: "capybara"; + + $accessToken = md5($userId . random_bytes(512)); + $refreshToken = md5($userId . random_bytes(512)); + + return new self( + $deviceId, + $userId, + $initialDisplayName, + $accessToken, + $refreshToken, + ); + } + + public function insert(): bool + { + return Database::getInstance()->query( + <<<SQL + insert into devices (id, user_id, name, access_token, refresh_token) + values (:id, :user_id, :name, :access_token, :refresh_token) + SQL, + [ + "id" => $this->id, + "user_id" => $this->userId, + "name" => $this->name, + "access_token" => $this->accessToken, + "refresh_token" => $this->refreshToken, + ] + ); + } + + public function update(): bool + {} + + public function delete(): bool + {} + + public function getId(): string + { + return $this->id; + } + + public function getName(): string + { + return $this->name; + } + + public function getAccessToken(): string + { + return $this->accessToken; + } + + public function getRefreshToken(): string + { + return $this->refreshToken; + } +} |