diff options
Diffstat (limited to 'src/Models/Tokens.php')
| -rw-r--r-- | src/Models/Tokens.php | 137 | 
1 files changed, 134 insertions, 3 deletions
| diff --git a/src/Models/Tokens.php b/src/Models/Tokens.php index a94c876..4ad8e1d 100644 --- a/src/Models/Tokens.php +++ b/src/Models/Tokens.php @@ -2,6 +2,7 @@  namespace App\Models; +use App\Database;  use App\Support\ConnectsToDatabase;  class Tokens implements ConnectsToDatabase @@ -9,7 +10,9 @@ class Tokens implements ConnectsToDatabase    public function __construct(      private string $accessToken,      private string $refreshToken, +    private \DateTime $expiresAt,      private string $userId, +    private \DateTime $createdAt,      private string $deviceId = "",    )    {} @@ -19,23 +22,151 @@ class Tokens implements ConnectsToDatabase      return new self(        $row["access_token"],        $row["refresh_token"], +      new \DateTime($row["expires_at"]),        $row["user_id"], +      new \DateTime($row["created_at"]),        $row["device_id"],      );    } -  public static function fetch(): ?self -  {} +  public static function fetch(string $userId = "", string $deviceId = "", bool $isExpired = false): ?self +  { +    if (empty($userId)) { +      throw new \InvalidArgumentException("missing user id"); +    } + +    $isExpiredSql = ""; +    if ($isExpired) { +      $isExpiredSql = "and expires_at <= current_timestamp"; +    } else { +      $isExpiredSql = "and expires_at > current_timestamp"; +    } + +    $row = []; +    if (empty($deviceId)) { +      $row = Database::getInstance()->query( +        <<<SQL +          select * from tokens +          where user_id=:user_id and device_id is null +          $isExpiredSql +        SQL, +        [ +          "user_id" => $userId, +        ] +      )->fetch(); +    } else { +      $row = Database::getInstance()->query( +        <<<SQL +          select * from tokens +          where user_id=:user_id and device_id=:device_id +          $isExpiredSql +        SQL, +        [ +          "user_id" => $userId, +          "device_id" => $deviceId, +        ] +      )->fetch(); +    } + +    if (empty($row)) { +      return null; +    } + +    return self::fromDatabase($row); +  }    public static function fetchAll(): array    {} +  public static function fetchWithRefreshToken(string $refreshToken): ?self +  { +    $row = Database::getInstance()->query( +      <<<SQL +        select * from tokens +        where refresh_token=:refresh_token +        order by created_at desc +      SQL, +      [ +        "refresh_token" => $refreshToken, +      ] +    )->fetch(); + +    if (empty($row)) { +      return null; +    } + +    return self::fromDatabase($row); +  } + +  public static function new(string $userId, string $deviceId, string $expiryTime = ""): self +  { +    $expiryTime = ($expiryTime ?: ($_ENV["TOKEN_DEFAULT_LIFETIME"] ?? "")) ?: "5min"; + +    return new self( +      md5($userId . random_bytes(512)), +      md5($userId . random_bytes(512)), +      (new \DateTime("now"))->modify("+$expiryTime"), +      $userId, +      new \DateTime("now"), +      $deviceId, +    ); +  } +    public function insert(): bool -  {} +  { +    return !! Database::getInstance()->query(<<<SQL +      insert into tokens (access_token, refresh_token, expires_at, user_id, device_id, created_at) +      values (:access_token, :refresh_token, to_timestamp(:expires_at), :user_id, :device_id, to_timestamp(:created_at)) +    SQL, [ +      "access_token" => $this->accessToken, +      "refresh_token" => $this->refreshToken, +      "expires_at" => $this->expiresAt->format("U.v"), +      "user_id" => $this->userId, +      "device_id" => $this->deviceId, +      "created_at" => $this->createdAt->format("U.v"), +    ]); +  }    public function update(): bool    {}    public function delete(): bool    {} + +  public function getExpiresIn(): int +  { +    return intval( +      ($this->expiresAt->format("U.v") - (new \DateTime("now"))->format("U.v")) * 1000.0 +    ); +  } + +  public function getAccessToken(): string +  { +    return $this->accessToken; +  } + +  public function getRefreshToken(): string +  { +    return $this->refreshToken; +  } + +  public function getExpiresAt(): int +  { +    return $this->expiresAt; +  } + +  public function getUserId(): string +  { +    return $this->userId; +  } + +  public function getDeviceId(): string +  { +    return $this->deviceId; +  } + +  public function getCreatedAt(): int +  { +    return $this->createdAt; +  }  } | 
