mirror of
https://github.com/elyby/accounts.git
synced 2024-11-19 19:53:08 +05:30
100 lines
2.5 KiB
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";
|
|
}
|
|
|
|
}
|