190 lines
4.5 KiB
PHP
190 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace frontend\modules\api\services;
|
|
|
|
|
|
use DateTime;
|
|
use Exception;
|
|
use frontend\modules\api\models\tg_bot\forms\TgBotDialogForm;
|
|
use frontend\modules\api\models\profile\User;
|
|
use frontend\modules\api\models\tg_bot\UserTgBotDialog;
|
|
use frontend\modules\api\models\tg_bot\UserTgBotToken;
|
|
use Yii;
|
|
|
|
class UserTgBotTokenService
|
|
{
|
|
const CHARACTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
|
/**
|
|
* @param int $userId
|
|
* @return UserTgBotToken
|
|
* @throws Exception
|
|
*/
|
|
public function getToken(int $userId)
|
|
{
|
|
$model = UserTgBotToken::findOne(['user_id' => $userId]);
|
|
if (!empty($model)) {
|
|
return $this->checkExpiredAtTime($model);
|
|
}
|
|
|
|
return $this->createToken($userId);
|
|
}
|
|
|
|
/**
|
|
* @param string $token
|
|
* @return User|string[]
|
|
* @throws Exception
|
|
*/
|
|
public function getUserByToken(string $token)
|
|
{
|
|
$model = UserTgBotToken::findOne(['token' => $token]);
|
|
if (!empty($model) ) {
|
|
|
|
$currentTime = new DateTime();
|
|
|
|
if ($currentTime < new DateTime($model->expired_at)) {
|
|
return $model->user;
|
|
} else {
|
|
return ['error' => 'The token is expired!'];
|
|
}
|
|
|
|
}
|
|
|
|
return ['error' => 'Token not found!'];
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
* @throws Exception
|
|
*/
|
|
private function generateToken(): string
|
|
{
|
|
$length = Yii::$app->params['tgBotTokenLength'];
|
|
$charactersLength = strlen($this::CHARACTERS);
|
|
do {
|
|
$value = '';
|
|
for ($i = 0; $i < $length; $i++) {
|
|
$value .= $this::CHARACTERS[random_int(0, $charactersLength - 1)];
|
|
}
|
|
} while ( UserTgBotToken::checkExistsByToken($value));
|
|
|
|
return $value;
|
|
}
|
|
|
|
/**
|
|
* @param int $userId
|
|
* @return UserTgBotToken
|
|
* @throws Exception
|
|
*/
|
|
private function createToken(int $userId): UserTgBotToken
|
|
{
|
|
$model = new UserTgBotToken();
|
|
$model->user_id = $userId;
|
|
$model->token = $this->generateToken();
|
|
$model->expired_at = $this->generateExpiredAtTime();
|
|
|
|
if (!$model->save()) {
|
|
throw new \Exception('Токен не сохранен');
|
|
}
|
|
|
|
return $model;
|
|
}
|
|
|
|
/**
|
|
* @return false|string
|
|
*/
|
|
private function generateExpiredAtTime()
|
|
{
|
|
return date("Y-m-d H:i:s",strtotime(date("Y-m-d H:i:s")) + Yii::$app->params['tgBotTokenValidityTime']);
|
|
}
|
|
|
|
/**
|
|
* @param UserTgBotToken $model
|
|
* @return UserTgBotToken
|
|
* @throws Exception
|
|
*/
|
|
private function checkExpiredAtTime(UserTgBotToken $model)
|
|
{
|
|
$currentTime = new DateTime();
|
|
|
|
if ($currentTime > new DateTime($model->expired_at)) {
|
|
$this->updateExpiredAtTime($model);
|
|
}
|
|
|
|
return $model;
|
|
}
|
|
|
|
/**
|
|
* @param UserTgBotToken $model
|
|
* @return UserTgBotToken
|
|
* @throws Exception
|
|
*/
|
|
private function updateExpiredAtTime(UserTgBotToken $model)
|
|
{
|
|
$model->token = $this->generateToken();
|
|
$model->expired_at = $this->generateExpiredAtTime();
|
|
|
|
if (!$model->save()) {
|
|
throw new \Exception('Токен не сохранен');
|
|
}
|
|
|
|
return $model;
|
|
}
|
|
|
|
/**
|
|
* @param array $params
|
|
* @return TgBotDialogForm|string[]
|
|
* @throws Exception
|
|
*/
|
|
public function createDialog(array $params)
|
|
{
|
|
$form = new TgBotDialogForm();
|
|
$form->load($params);
|
|
|
|
if (!$form->validate()){
|
|
return $form;
|
|
}
|
|
|
|
$dialog = new UserTgBotDialog();
|
|
$dialog->user_id = $form->userId;
|
|
$dialog->dialog_id = $form->dialogId;
|
|
|
|
if (!$dialog->save()) {
|
|
throw new Exception('User dont save');
|
|
}
|
|
|
|
return ['status' => 'success'];
|
|
}
|
|
|
|
/**
|
|
* @param string $userId
|
|
* @return array
|
|
* @throws Exception
|
|
*/
|
|
public function getDialogIdByUserId(string $userId)
|
|
{
|
|
$model = UserTgBotDialog::findOne(['user_id' => $userId]);
|
|
|
|
if (!$model) {
|
|
throw new \Exception('dialog_id не найден!');
|
|
}
|
|
|
|
return ['dialog_id' => $model->dialog_id];
|
|
}
|
|
|
|
/**
|
|
* @param string $dialogId
|
|
* @return array
|
|
* @throws Exception
|
|
*/
|
|
public function getUserIdByDialogId(string $dialogId)
|
|
{
|
|
$model = UserTgBotDialog::findOne(['dialog_id' => $dialogId]);
|
|
|
|
if (!$model) {
|
|
throw new \Exception('user_id не найден!');
|
|
}
|
|
|
|
return ['user_id' => $model->user_id];
|
|
}
|
|
} |