Files
api/common/Service/Login.php
2022-06-13 21:36:52 -04:00

91 lines
2.9 KiB
PHP

<?php
namespace Incoviba\API\Common\Service;
use Carbon\Carbon;
use Incoviba\Mapper\User as UserMapper;
use Incoviba\Mapper\Login as LoginMapper;
use Incoviba\Mapper\Config as ConfigMapper;
use Incoviba\Model\Auth\User;
class Login
{
protected UserMapper $userMapper;
protected LoginMapper $loginMapper;
protected ConfigMapper $configMapper;
public function __construct(UserMapper $userMapper, LoginMapper $loginMapper, ConfigMapper $configMapper)
{
$this->userMapper = $userMapper;
$this->loginMapper = $loginMapper;
$this->configMapper = $configMapper;
}
public function setToken(User $user, string $selector, string $token)
{
$this->logout($user);
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
$data = [
'user_id' => $user->id,
'time' => (new \DateTimeImmutable())->format('Y-m-d H:i:s '),
'selector' => $selector,
'token' => $token,
'status' => 1
];
$status = false;
try {
$login = $this->loginMapper->create($data);
$status = $this->loginMapper->save($login);
} catch (\PDOException $e) {
$login = false;
}
$output = [
'input' => $data,
'login' => $login,
'logged_in' => $status
];
if ($login !== false) {
$output['expires'] = $login->time->modify("+{$expiration->value} second")->getTimestamp();
}
return $output;
}
public function logout(User $user): bool
{
$logins = $this->validLogins($user);
if ($logins === false or count($logins) === 0) {
return true;
}
$bool = true;
foreach ($logins as $login) {
$login->status = false;
$bool &= $this->loginMapper->save($login);
}
return $bool;
}
public function validLogins(User $user): bool|array {
return $this->loginMapper->fetchActiveByUser($user->id);
}
public function validate($request): bool
{
list($selector, $token) = explode(':', $request->token);
$login = $this->loginMapper->fetchBySelector($selector);
if (!$login or !$login->status or !password_verify($token, $login->token)) {
return false;
}
$expiration = $this->configMapper->fetchByName('cookie_expiration_time');
if ((Carbon::createFromTimestamp($login->time->getTimestamp()))->diffInSeconds() > $expiration->value) {
$login->status = false;
$this->loginMapper->save($login);
return false;
}
return true;
}
public function getUser($request): User|bool
{
list($selector, $token) = explode(':', $request->token);
$login = $this->loginMapper->fetchBySelector($selector);
if (!$login or !$login->status) {
return false;
}
return $login->user;
}
}