accounts/common/models/OauthSession.php

100 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
namespace common\models;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveQuery;
use yii\db\ActiveRecord;
/**
* Fields:
* @property int $account_id
* @property string $client_id
* @property int|null $legacy_id
* @property array $scopes
* @property int $created_at
* @property int|null $revoked_at
* @property int $last_used_at
*
* Relations:
* @property-read OauthClient|null $client
* @property-read Account $account
*
* Mixins:
* @mixin TimestampBehavior
*/
class OauthSession extends ActiveRecord {
public static function tableName(): string {
return 'oauth_sessions';
}
public function behaviors(): array {
return [
[
'class' => TimestampBehavior::class,
'updatedAtAttribute' => false,
],
];
}
public function isRevoked(): bool {
return $this->revoked_at > $this->last_used_at;
}
public function getClient(): ActiveQuery {
return $this->hasOne(OauthClient::class, ['id' => 'client_id']);
}
public function getAccount(): ActiveQuery {
return $this->hasOne(Account::class, ['id' => 'account_id']);
}
public function getScopes(): array {
if (empty($this->scopes) && $this->legacy_id !== null) {
return Yii::$app->redis->smembers($this->getLegacyRedisScopesKey());
}
return (array)$this->scopes;
}
/**
* In the early period of the project existence, the refresh tokens related to the current session
* were stored in Redis. This method allows to get a list of these tokens.
*
* @return array of refresh tokens (ids)
*/
public function getLegacyRefreshTokens(): array {
// TODO: it seems that this method isn't used anywhere
if ($this->legacy_id === null) {
return [];
}
return Yii::$app->redis->smembers($this->getLegacyRedisRefreshTokensKey());
}
public function beforeDelete(): bool {
if (!parent::beforeDelete()) {
return false;
}
if ($this->legacy_id !== null) {
Yii::$app->redis->del($this->getLegacyRedisScopesKey());
Yii::$app->redis->del($this->getLegacyRedisRefreshTokensKey());
}
return true;
}
private function getLegacyRedisScopesKey(): string {
return "oauth:sessions:{$this->legacy_id}:scopes";
}
private function getLegacyRedisRefreshTokensKey(): string {
return "oauth:sessions:{$this->legacy_id}:refresh:tokens";
}
}