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