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; +  } +} | 
