summaryrefslogtreecommitdiff
path: root/src/Models/Device.php
diff options
context:
space:
mode:
Diffstat (limited to 'src/Models/Device.php')
-rw-r--r--src/Models/Device.php150
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;
+ }
+}