mirror of
https://github.com/elyby/accounts.git
synced 2024-12-27 23:50:19 +05:30
95 lines
2.5 KiB
PHP
95 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 $legacy_id
|
|
* @property array $scopes
|
|
* @property integer $created_at
|
|
*
|
|
* Relations:
|
|
* @property-read OauthClient $client
|
|
* @property-read Account $account
|
|
* @property-read OauthRefreshToken[] $refreshTokens
|
|
*/
|
|
class OauthSession extends ActiveRecord {
|
|
|
|
public static function tableName(): string {
|
|
return 'oauth_sessions';
|
|
}
|
|
|
|
public function behaviors(): array {
|
|
return [
|
|
[
|
|
'class' => TimestampBehavior::class,
|
|
'updatedAtAttribute' => false,
|
|
],
|
|
];
|
|
}
|
|
|
|
public function getClient(): ActiveQuery {
|
|
return $this->hasOne(OauthClient::class, ['id' => 'client_id']);
|
|
}
|
|
|
|
public function getAccount(): ActiveQuery {
|
|
return $this->hasOne(Account::class, ['id' => 'owner_id']);
|
|
}
|
|
|
|
public function getRefreshTokens(): ActiveQuery {
|
|
return $this->hasMany(OauthRefreshToken::class, ['account_id' => 'account_id', 'client_id' => 'client_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 {
|
|
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";
|
|
}
|
|
|
|
}
|