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