diff --git a/composer.json b/composer.json index 2801d03..f6a1293 100644 --- a/composer.json +++ b/composer.json @@ -10,7 +10,7 @@ } ], "require": { - "esoko/soko-web": "0.4", + "esoko/soko-web": "0.6.1", "fzaninotto/faker": "^1.9" }, "require-dev": { diff --git a/composer.lock b/composer.lock index ed062aa..0422b2e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,15 +4,15 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5e355d5efeb34e7e0ad2a69b1ec109d6", + "content-hash": "8b291ef6518a20a7cdd71ac2c19763d8", "packages": [ { "name": "esoko/soko-web", - "version": "v0.4", + "version": "0.6.1", "source": { "type": "git", "url": "https://git.esoko.eu/esoko/soko-web.git", - "reference": "948b36c80d324e07339a543d97b9e629487f3a45" + "reference": "445774e59a4891b2e67d151b0cf7b7b880c40e48" }, "require": { "phpmailer/phpmailer": "^6.8", @@ -33,7 +33,7 @@ "GNU GPL 3.0" ], "description": "Lightweight web framework", - "time": "2023-04-16T18:52:06+00:00" + "time": "2023-04-19T22:24:31+00:00" }, { "name": "fzaninotto/faker", diff --git a/main.php b/main.php index f3a2309..c97b24b 100644 --- a/main.php +++ b/main.php @@ -15,9 +15,11 @@ $dotenv->load(); class Container { static SokoWeb\Interfaces\Database\IConnection $dbConnection; - static SokoWeb\Routing\RouteCollection $routeCollection; + static SokoWeb\Interfaces\PersistentData\IPersistentDataManager $persistentDataManager; + static SokoWeb\Interfaces\Routing\IRouteCollection $routeCollection; static SokoWeb\Interfaces\Session\ISessionHandler $sessionHandler; static SokoWeb\Interfaces\Request\IRequest $request; } Container::$dbConnection = new SokoWeb\Database\Mysql\Connection($_ENV['DB_HOST'], $_ENV['DB_USER'], $_ENV['DB_PASSWORD'], $_ENV['DB_NAME']); +Container::$persistentDataManager = new SokoWeb\PersistentData\PersistentDataManager(Container::$dbConnection); diff --git a/src/Cli/AddUserCommand.php b/src/Cli/AddUserCommand.php index 8e6036f..2d719f9 100644 --- a/src/Cli/AddUserCommand.php +++ b/src/Cli/AddUserCommand.php @@ -1,7 +1,6 @@ saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); } catch (\Exception $e) { $output->writeln('Adding user failed!'); $output->writeln(''); diff --git a/src/Cli/MaintainDatabaseCommand.php b/src/Cli/MaintainDatabaseCommand.php index a7e6758..f828b39 100644 --- a/src/Cli/MaintainDatabaseCommand.php +++ b/src/Cli/MaintainDatabaseCommand.php @@ -4,7 +4,6 @@ use DateTime; use SokoWeb\Database\Query\Modify; use SokoWeb\Database\Query\Select; use SokoWeb\Interfaces\Database\IResultSet; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\Repository\MultiRoomRepository; use MapGuesser\Repository\UserConfirmationRepository; use MapGuesser\Repository\UserPasswordResetterRepository; @@ -16,8 +15,6 @@ use Symfony\Component\Console\Output\OutputInterface; class MaintainDatabaseCommand extends Command { - private PersistentDataManager $pdm; - private UserRepository $userRepository; private UserConfirmationRepository $userConfirmationRepository; @@ -32,7 +29,6 @@ class MaintainDatabaseCommand extends Command { parent::__construct(); - $this->pdm = new PersistentDataManager(); $this->userRepository = new UserRepository(); $this->userConfirmationRepository = new UserConfirmationRepository(); $this->userPasswordResetterRepository = new UserPasswordResetterRepository(); @@ -77,19 +73,19 @@ class MaintainDatabaseCommand extends Command //TODO: these can be in some wrapper class $userConfirmation = $this->userConfirmationRepository->getByUser($user); if ($userConfirmation !== null) { - $this->pdm->deleteFromDb($userConfirmation); + \Container::$persistentDataManager->deleteFromDb($userConfirmation); } $userPasswordResetter = $this->userPasswordResetterRepository->getByUser($user); if ($userPasswordResetter !== null) { - $this->pdm->deleteFromDb($userPasswordResetter); + \Container::$persistentDataManager->deleteFromDb($userPasswordResetter); } foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) { - $this->pdm->deleteFromDb($userPlayedPlace); + \Container::$persistentDataManager->deleteFromDb($userPlayedPlace); } - $this->pdm->deleteFromDb($user); + \Container::$persistentDataManager->deleteFromDb($user); } \Container::$dbConnection->commit(); @@ -98,14 +94,14 @@ class MaintainDatabaseCommand extends Command private function deleteExpiredPasswordResetters(): void { foreach ($this->userPasswordResetterRepository->getAllExpired() as $passwordResetter) { - $this->pdm->deleteFromDb($passwordResetter); + \Container::$persistentDataManager->deleteFromDb($passwordResetter); } } private function deleteExpiredRooms(): void { foreach ($this->multiRoomRepository->getAllExpired() as $multiRoom) { - $this->pdm->deleteFromDb($multiRoom); + \Container::$persistentDataManager->deleteFromDb($multiRoom); } } diff --git a/src/Controller/GameController.php b/src/Controller/GameController.php index db6b35c..ef3fd5f 100644 --- a/src/Controller/GameController.php +++ b/src/Controller/GameController.php @@ -3,7 +3,6 @@ use DateTime; use Faker\Factory; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; -use SokoWeb\Interfaces\Request\IRequest; use SokoWeb\Response\HtmlContent; use SokoWeb\Response\JsonContent; use SokoWeb\Interfaces\Response\IContent; @@ -13,7 +12,6 @@ use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\MultiRoom; use MapGuesser\PersistentData\Model\PlaceInChallenge; use MapGuesser\PersistentData\Model\UserInChallenge; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\Repository\ChallengeRepository; use MapGuesser\Repository\MapRepository; use MapGuesser\Repository\MultiRoomRepository; @@ -25,10 +23,6 @@ class GameController implements IAuthenticationRequired { const NUMBER_OF_ROUNDS = 5; - private IRequest $request; - - private PersistentDataManager $pdm; - private MultiConnector $multiConnector; private MultiRoomRepository $multiRoomRepository; @@ -41,10 +35,8 @@ class GameController implements IAuthenticationRequired private UserInChallengeRepository $userInChallengeRepository; - public function __construct(IRequest $request) + public function __construct() { - $this->request = $request; - $this->pdm = new PersistentDataManager(); $this->multiConnector = new MultiConnector(); $this->multiRoomRepository = new MultiRoomRepository(); $this->mapRepository = new MapRepository(); @@ -60,14 +52,14 @@ class GameController implements IAuthenticationRequired public function getGame(): IContent { - $mapId = (int) $this->request->query('mapId'); + $mapId = (int) \Container::$request->query('mapId'); return new HtmlContent('game', ['mapId' => $mapId]); } public function getNewMultiGame(): IRedirect { - $mapId = (int) $this->request->query('mapId'); + $mapId = (int) \Container::$request->query('mapId'); $map = $this->mapRepository->getById($mapId); $roomId = bin2hex(random_bytes(3)); $token = $this->getMultiToken($roomId); @@ -83,7 +75,7 @@ class GameController implements IAuthenticationRequired $room->setMembersArray(['owner' => $token, 'all' => []]); $room->setUpdatedDate(new DateTime()); - $this->pdm->saveToDb($room); + \Container::$persistentDataManager->saveToDb($room); $this->multiConnector->sendMessage('create_room', ['roomId' => $roomId]); @@ -97,14 +89,14 @@ class GameController implements IAuthenticationRequired public function getMultiGame(): IContent { - $roomId = $this->request->query('roomId'); + $roomId = \Container::$request->query('roomId'); return new HtmlContent('game', ['roomId' => $roomId]); } public function getChallenge(): IContent { - $challengeToken = $this->request->query('challengeToken'); + $challengeToken = \Container::$request->query('challengeToken'); return new HtmlContent('game', ['challengeToken' => $challengeToken]); } @@ -121,27 +113,27 @@ class GameController implements IAuthenticationRequired $challenge->setToken($challengeToken); $challenge->setCreatedDate(new DateTime()); - if ($this->request->post('timerEnabled') !== null && $this->request->post('timeLimit') !== null) { - $challenge->setTimeLimit($this->request->post('timeLimit')); + if (\Container::$request->post('timerEnabled') !== null && \Container::$request->post('timeLimit') !== null) { + $challenge->setTimeLimit(\Container::$request->post('timeLimit')); } - if ($this->request->post('timeLimitType') !== null) { - $challenge->setTimeLimitType($this->request->post('timeLimitType')); + if (\Container::$request->post('timeLimitType') !== null) { + $challenge->setTimeLimitType(\Container::$request->post('timeLimitType')); } - if ($this->request->post('noMove') !== null) { + if (\Container::$request->post('noMove') !== null) { $challenge->setNoMove(true); } - if ($this->request->post('noPan') !== null) { + if (\Container::$request->post('noPan') !== null) { $challenge->setNoPan(true); } - if ($this->request->post('noZoom') !== null) { + if (\Container::$request->post('noZoom') !== null) { $challenge->setNoZoom(true); } - $this->pdm->saveToDb($challenge); + \Container::$persistentDataManager->saveToDb($challenge); // save owner/creator - $session = $this->request->session(); + $session = \Container::$request->session(); $userId = $session->get('userId'); $userInChallenge = new UserInChallenge(); @@ -150,11 +142,11 @@ class GameController implements IAuthenticationRequired $userInChallenge->setTimeLeft($challenge->getTimeLimit()); $userInChallenge->setIsOwner(true); - $this->pdm->saveToDb($userInChallenge); + \Container::$persistentDataManager->saveToDb($userInChallenge); // select places - $mapId = (int) $this->request->post('mapId'); + $mapId = (int) \Container::$request->post('mapId'); // $map = $this->mapRepository->getById($mapId); $places = $this->placeRepository->getRandomNPlaces($mapId, static::NUMBER_OF_ROUNDS, $userId); @@ -165,7 +157,7 @@ class GameController implements IAuthenticationRequired $placeInChallenge->setPlace($place); $placeInChallenge->setChallenge($challenge); $placeInChallenge->setRound($round++); - $this->pdm->saveToDb($placeInChallenge); + \Container::$persistentDataManager->saveToDb($placeInChallenge); } return new JsonContent(['challengeToken' => dechex($challengeToken)]); @@ -173,9 +165,9 @@ class GameController implements IAuthenticationRequired public function prepareGame(): IContent { - $mapId = (int) $this->request->query('mapId'); + $mapId = (int) \Container::$request->query('mapId'); $map = $this->mapRepository->getById($mapId); - $session = $this->request->session(); + $session = \Container::$request->session(); if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) { $session->set('state', [ @@ -198,8 +190,8 @@ class GameController implements IAuthenticationRequired public function prepareMultiGame(): IContent { - $roomId = $this->request->query('roomId'); - $userName = $this->request->post('userName'); + $roomId = \Container::$request->query('roomId'); + $userName = \Container::$request->post('userName'); if (empty($userName)) { $faker = Factory::create(); $userName = $faker->userName; @@ -228,7 +220,7 @@ class GameController implements IAuthenticationRequired $room->setMembersArray($members); $room->setUpdatedDate(new DateTime()); - $this->pdm->saveToDb($room); + \Container::$persistentDataManager->saveToDb($room); $this->multiConnector->sendMessage('join_room', [ 'roomId' => $roomId, @@ -248,8 +240,8 @@ class GameController implements IAuthenticationRequired public function prepareChallenge(): IContent { - $challengeToken_str = $this->request->query('challengeToken'); - $session = $this->request->session(); + $challengeToken_str = \Container::$request->query('challengeToken'); + $session = \Container::$request->session(); $userId = $session->get('userId'); if (!isset($userId)) @@ -270,7 +262,7 @@ class GameController implements IAuthenticationRequired $userInChallenge->setUserId($userId); $userInChallenge->setChallenge($challenge); $userInChallenge->setTimeLeft($challenge->getTimeLimit()); - $this->pdm->saveToDb($userInChallenge); + \Container::$persistentDataManager->saveToDb($userInChallenge); } $map = $this->mapRepository->getByChallenge($challenge); @@ -284,7 +276,7 @@ class GameController implements IAuthenticationRequired private function getMultiToken(string $roomId): string { - $session = $this->request->session(); + $session = \Container::$request->session(); if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) { $token = bin2hex(random_bytes(16)); diff --git a/src/Controller/GameFlowController.php b/src/Controller/GameFlowController.php index da076a8..ff74dca 100644 --- a/src/Controller/GameFlowController.php +++ b/src/Controller/GameFlowController.php @@ -2,12 +2,10 @@ use DateTime; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; -use SokoWeb\Interfaces\Request\IRequest; use MapGuesser\Util\Geo\Position; use SokoWeb\Response\JsonContent; use SokoWeb\Interfaces\Response\IContent; use MapGuesser\Multi\MultiConnector; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Guess; use MapGuesser\PersistentData\Model\Map; @@ -27,10 +25,6 @@ class GameFlowController implements IAuthenticationRequired const NUMBER_OF_ROUNDS = 5; const MAX_SCORE = 1000; - private IRequest $request; - - private PersistentDataManager $pdm; - private MultiConnector $multiConnector; private MultiRoomRepository $multiRoomRepository; @@ -45,10 +39,8 @@ class GameFlowController implements IAuthenticationRequired private GuessRepository $guessRepository; - public function __construct(IRequest $request) + public function __construct() { - $this->request = $request; - $this->pdm = new PersistentDataManager(); $this->multiConnector = new MultiConnector(); $this->multiRoomRepository = new MultiRoomRepository(); $this->placeRepository = new PlaceRepository(); @@ -65,8 +57,8 @@ class GameFlowController implements IAuthenticationRequired public function initialData(): IContent { - $mapId = (int) $this->request->query('mapId'); - $session = $this->request->session(); + $mapId = (int) \Container::$request->query('mapId'); + $session = \Container::$request->session(); if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) { return new JsonContent(['error' => 'no_session_found']); @@ -103,8 +95,8 @@ class GameFlowController implements IAuthenticationRequired public function multiInitialData(): IContent { - $roomId = $this->request->query('roomId'); - $session = $this->request->session(); + $roomId = \Container::$request->query('roomId'); + $session = \Container::$request->session(); if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) { return new JsonContent(['error' => 'no_session_found']); @@ -122,7 +114,7 @@ class GameFlowController implements IAuthenticationRequired $this->startNewGame($state, $state['mapId']); $room->setStateArray($state); $room->setUpdatedDate(new DateTime()); - $this->pdm->saveToDb($room); + \Container::$persistentDataManager->saveToDb($room); } $places = []; @@ -221,9 +213,9 @@ class GameFlowController implements IAuthenticationRequired public function challengeInitialData(): IContent { - $session = $this->request->session(); + $session = \Container::$request->session(); $userId = $session->get('userId'); - $challengeToken_str = $this->request->query('challengeToken'); + $challengeToken_str = \Container::$request->query('challengeToken'); $userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, [Challenge::class]); if (!isset($userInChallenge)) { @@ -245,15 +237,15 @@ class GameFlowController implements IAuthenticationRequired public function guess(): IContent { - $mapId = (int) $this->request->query('mapId'); - $session = $this->request->session(); + $mapId = (int) \Container::$request->query('mapId'); + $session = \Container::$request->session(); if (!($state = $session->get('state')) || $state['mapId'] !== $mapId) { return new JsonContent(['error' => 'no_session_found']); } $last = $state['rounds'][$state['currentRound']]; - $guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng')); + $guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng')); $result = $this->evaluateGuess($last['position'], $guessPosition, $state['area']); $last['guessPosition'] = $guessPosition; @@ -286,7 +278,7 @@ class GameFlowController implements IAuthenticationRequired // save the selected place for the round in UserPlayedPlace private function saveVisit($placeId): void { - $session = $this->request->session(); + $session = \Container::$request->session(); $userId = $session->get('userId'); if (isset($userId)) { @@ -299,14 +291,14 @@ class GameFlowController implements IAuthenticationRequired $userPlayedPlace->incrementOccurrences(); } $userPlayedPlace->setLastTimeDate(new DateTime()); - $this->pdm->saveToDb($userPlayedPlace); + \Container::$persistentDataManager->saveToDb($userPlayedPlace); } } public function multiGuess(): IContent { - $roomId = $this->request->query('roomId'); - $session = $this->request->session(); + $roomId = \Container::$request->query('roomId'); + $session = \Container::$request->session(); if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) { return new JsonContent(['error' => 'no_session_found']); @@ -316,7 +308,7 @@ class GameFlowController implements IAuthenticationRequired $state = $room->getStateArray(); $last = $state['rounds'][$state['currentRound']]; - $guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng')); + $guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng')); $result = $this->evaluateGuess($last['position'], $guessPosition, $state['area']); $responseFromMulti = $this->multiConnector->sendMessage('guess', [ @@ -342,9 +334,9 @@ class GameFlowController implements IAuthenticationRequired public function challengeGuess(): IContent { - $session = $this->request->session(); + $session = \Container::$request->session(); $userId = $session->get('userId'); - $challengeToken_str = $this->request->query('challengeToken'); + $challengeToken_str = \Container::$request->query('challengeToken'); $userInChallenge = $this->userInChallengeRepository->getByUserIdAndToken($userId, $challengeToken_str, [Challenge::class]); if (!isset($userInChallenge)) { @@ -362,8 +354,8 @@ class GameFlowController implements IAuthenticationRequired $response = $this->prepareChallengeResponse($userId, $challenge, $nextRound); $response['position'] = $currentPlace->getPosition()->toArray(); - if ($this->request->post('lat') && $this->request->post('lng')) { - $guessPosition = new Position((float) $this->request->post('lat'), (float) $this->request->post('lng')); + if (\Container::$request->post('lat') && \Container::$request->post('lng')) { + $guessPosition = new Position((float) \Container::$request->post('lat'), (float) \Container::$request->post('lng')); $result = $this->evaluateGuess($currentPlace->getPosition(), $guessPosition, $map->getArea()); // save guess @@ -373,7 +365,7 @@ class GameFlowController implements IAuthenticationRequired $guess->setPosition($guessPosition); $guess->setDistance($result['distance']); $guess->setScore($result['score']); - $this->pdm->saveToDb($guess); + \Container::$persistentDataManager->saveToDb($guess); $response['result'] = $result; @@ -384,11 +376,11 @@ class GameFlowController implements IAuthenticationRequired // save user relevant state of challenge $userInChallenge->setCurrentRound($nextRound); - $timeLeft = $this->request->post('timeLeft'); + $timeLeft = \Container::$request->post('timeLeft'); if (isset($timeLeft)) { $userInChallenge->setTimeLeft(intval($timeLeft)); } - $this->pdm->saveToDb($userInChallenge); + \Container::$persistentDataManager->saveToDb($userInChallenge); if ($challenge->getTimeLimitType() === 'game' && isset($timeLeft)) { $timeLimit = max(10, intval($timeLeft)); @@ -406,8 +398,8 @@ class GameFlowController implements IAuthenticationRequired public function multiNextRound(): IContent { - $roomId = $this->request->query('roomId'); - $session = $this->request->session(); + $roomId = \Container::$request->query('roomId'); + $session = \Container::$request->session(); if (!($multiState = $session->get('multiState')) || $multiState['roomId'] !== $roomId) { return new JsonContent(['error' => 'no_session_found']); @@ -428,7 +420,7 @@ class GameFlowController implements IAuthenticationRequired $room->setStateArray($state); $room->setUpdatedDate(new DateTime()); - $this->pdm->saveToDb($room); + \Container::$persistentDataManager->saveToDb($room); return new JsonContent(['ok' => true]); } @@ -443,7 +435,7 @@ class GameFlowController implements IAuthenticationRequired private function startNewGame(array &$state, int $mapId): void { - $session = $this->request->session(); + $session = \Container::$request->session(); $userId = $session->get('userId'); $places = $this->placeRepository->getRandomNPlaces($mapId, static::NUMBER_OF_ROUNDS, $userId); diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index 5ba1f77..5629c34 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -1,6 +1,5 @@ request = $request; - } - public function getIndex(): IRedirect { return new Redirect(\Container::$routeCollection->getRoute('maps')->generateLink(), IRedirect::TEMPORARY); @@ -24,6 +16,6 @@ class HomeController { // session starts with the request, this method just sends valid data to the client - return new JsonContent(['antiCsrfToken' => $this->request->session()->get('anti_csrf_token')]); + return new JsonContent(['antiCsrfToken' => \Container::$request->session()->get('anti_csrf_token')]); } } diff --git a/src/Controller/LoginController.php b/src/Controller/LoginController.php index 7705413..566f218 100644 --- a/src/Controller/LoginController.php +++ b/src/Controller/LoginController.php @@ -3,7 +3,6 @@ use DateInterval; use DateTime; use SokoWeb\Http\Request; -use SokoWeb\Interfaces\Request\IRequest; use SokoWeb\Interfaces\Response\IContent; use SokoWeb\Interfaces\Response\IRedirect; use SokoWeb\Mailing\Mail; @@ -11,7 +10,6 @@ use SokoWeb\OAuth\GoogleOAuth; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\UserConfirmation; use MapGuesser\PersistentData\Model\UserPasswordResetter; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\Repository\UserConfirmationRepository; use MapGuesser\Repository\UserPasswordResetterRepository; use MapGuesser\Repository\UserPlayedPlaceRepository; @@ -24,10 +22,6 @@ use SokoWeb\Util\JwtParser; class LoginController { - private IRequest $request; - - private PersistentDataManager $pdm; - private UserRepository $userRepository; private UserConfirmationRepository $userConfirmationRepository; @@ -38,22 +32,20 @@ class LoginController private string $redirectUrl; - public function __construct(IRequest $request) + public function __construct() { - $this->request = $request; - $this->pdm = new PersistentDataManager(); $this->userRepository = new UserRepository(); $this->userConfirmationRepository = new UserConfirmationRepository(); $this->userPasswordResetterRepository = new UserPasswordResetterRepository(); $this->userPlayedPlaceRepository = new UserPlayedPlaceRepository(); - $this->redirectUrl = $this->request->session()->has('redirect_after_login') ? - $this->request->session()->get('redirect_after_login') : + $this->redirectUrl = \Container::$request->session()->has('redirect_after_login') ? + \Container::$request->session()->get('redirect_after_login') : \Container::$routeCollection->getRoute('index')->generateLink(); } public function getLoginForm() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } @@ -66,13 +58,13 @@ class LoginController $state = bin2hex(random_bytes(16)); $nonce = bin2hex(random_bytes(16)); - $this->request->session()->set('oauth_state', $state); - $this->request->session()->set('oauth_nonce', $nonce); + \Container::$request->session()->set('oauth_state', $state); + \Container::$request->session()->set('oauth_nonce', $nonce); $oAuth = new GoogleOAuth(new Request()); $url = $oAuth->getDialogUrl( $state, - $this->request->getBase() . \Container::$routeCollection->getRoute('login-google-action')->generateLink(), + \Container::$request->getBase() . \Container::$routeCollection->getRoute('login-google-action')->generateLink(), $nonce ); @@ -81,13 +73,13 @@ class LoginController public function getSignupForm() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - if ($this->request->session()->has('tmp_user_data')) { - $tmpUserData = $this->request->session()->get('tmp_user_data'); + if (\Container::$request->session()->has('tmp_user_data')) { + $tmpUserData = \Container::$request->session()->get('tmp_user_data'); $data = ['email' => $tmpUserData['email']]; } else { @@ -104,16 +96,16 @@ class LoginController public function getSignupWithGoogleForm() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - if (!$this->request->session()->has('google_user_data')) { + if (!\Container::$request->session()->has('google_user_data')) { return new Redirect(\Container::$routeCollection->getRoute('login-google')->generateLink(), IRedirect::TEMPORARY); } - $userData = $this->request->session()->get('google_user_data'); + $userData = \Container::$request->session()->get('google_user_data'); $user = $this->userRepository->getByEmail($userData['email']); @@ -122,12 +114,12 @@ class LoginController public function getRequestPasswordResetForm() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - return new HtmlContent('login/password_reset_request', ['email' => $this->request->query('email')]); + return new HtmlContent('login/password_reset_request', ['email' => \Container::$request->query('email')]); } public function getRequestPasswordResetSuccess(): IContent @@ -137,12 +129,12 @@ class LoginController public function getResetPasswordForm() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - $token = $this->request->query('token'); + $token = \Container::$request->query('token'); $resetter = $this->userPasswordResetterRepository->getByToken($token); if ($resetter === null || $resetter->getExpiresDate() < new DateTime()) { @@ -156,15 +148,15 @@ class LoginController public function login(): IContent { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); } - $user = $this->userRepository->getByEmail($this->request->post('email')); + $user = $this->userRepository->getByEmail(\Container::$request->post('email')); if ($user === null) { - if (strlen($this->request->post('password')) < 6) { + if (strlen(\Container::$request->post('password')) < 6) { return new JsonContent([ 'error' => [ 'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!' @@ -173,10 +165,10 @@ class LoginController } $tmpUser = new User(); - $tmpUser->setPlainPassword($this->request->post('password')); + $tmpUser->setPlainPassword(\Container::$request->post('password')); - $this->request->session()->set('tmp_user_data', [ - 'email' => $this->request->post('email'), + \Container::$request->session()->set('tmp_user_data', [ + 'email' => \Container::$request->post('email'), 'password_hashed' => $tmpUser->getPassword() ]); @@ -198,7 +190,7 @@ class LoginController ]); } - if (!$user->checkPassword($this->request->post('password'))) { + if (!$user->checkPassword(\Container::$request->post('password'))) { return new JsonContent([ 'error' => [ 'errorText' => 'The given password is wrong. You can validate($this->request->post('g-recaptcha-response')); + $captchaResponse = $captchaValidator->validate(\Container::$request->post('g-recaptcha-response')); if (!$captchaResponse['success']) { return new JsonContent(['error' => ['errorText' => 'reCAPTCHA challenge failed. Please try again!']]); } } - if (filter_var($this->request->post('email'), FILTER_VALIDATE_EMAIL) === false) { + if (filter_var(\Container::$request->post('email'), FILTER_VALIDATE_EMAIL) === false) { return new JsonContent(['error' => ['errorText' => 'The given email address is not valid.']]); } - if ($this->request->session()->has('tmp_user_data')) { - $tmpUserData = $this->request->session()->get('tmp_user_data'); + if (\Container::$request->session()->has('tmp_user_data')) { + $tmpUserData = \Container::$request->session()->get('tmp_user_data'); $tmpUser = new User(); $tmpUser->setPassword($tmpUserData['password_hashed']); - if (!$tmpUser->checkPassword($this->request->post('password'))) { + if (!$tmpUser->checkPassword(\Container::$request->post('password'))) { return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]); } } else { - if (strlen($this->request->post('password')) < 6) { + if (strlen(\Container::$request->post('password')) < 6) { return new JsonContent([ 'error' => [ 'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!' @@ -336,19 +328,17 @@ class LoginController ]); } - if ($this->request->post('password') !== $this->request->post('password_confirm')) { + if (\Container::$request->post('password') !== \Container::$request->post('password_confirm')) { return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]); } } $user = new User(); - $user->setEmail($this->request->post('email')); - $user->setPlainPassword($this->request->post('password')); + $user->setEmail(\Container::$request->post('email')); + $user->setPlainPassword(\Container::$request->post('password')); $user->setCreatedDate(new DateTime()); - \Container::$dbConnection->startTransaction(); - - $this->pdm->saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); $token = bin2hex(random_bytes(16)); @@ -357,25 +347,23 @@ class LoginController $confirmation->setToken($token); $confirmation->setLastSentDate(new DateTime()); - $this->pdm->saveToDb($confirmation); - - \Container::$dbConnection->commit(); + \Container::$persistentDataManager->saveToDb($confirmation); $this->sendConfirmationEmail($user->getEmail(), $token, $user->getCreatedDate()); - $this->request->session()->delete('tmp_user_data'); + \Container::$request->session()->delete('tmp_user_data'); return new JsonContent(['success' => true]); } public function signupWithGoogle(): IContent { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); } - $userData = $this->request->session()->get('google_user_data'); + $userData = \Container::$request->session()->get('google_user_data'); $user = $this->userRepository->getByEmail($userData['email']); @@ -392,14 +380,14 @@ class LoginController $user->setActive(true); $user->setGoogleSub($userData['sub']); - $this->pdm->saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); if ($sendWelcomeEmail) { $this->sendWelcomeEmail($user->getEmail()); } - $this->request->session()->delete('google_user_data'); - $this->request->setUser($user); + \Container::$request->session()->delete('google_user_data'); + \Container::$request->setUser($user); $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); @@ -407,43 +395,39 @@ class LoginController public function resetSignup(): IContent { - $this->request->session()->delete('tmp_user_data'); + \Container::$request->session()->delete('tmp_user_data'); return new JsonContent(['success' => true]); } public function resetGoogleSignup(): IContent { - $this->request->session()->delete('google_user_data'); + \Container::$request->session()->delete('google_user_data'); return new JsonContent(['success' => true]); } public function activate() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - $confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32)); + $confirmation = $this->userConfirmationRepository->getByToken(substr(\Container::$request->query('token'), 0, 32)); if ($confirmation === null) { return new HtmlContent('login/activate'); } - \Container::$dbConnection->startTransaction(); - - $this->pdm->deleteFromDb($confirmation); + \Container::$persistentDataManager->deleteFromDb($confirmation); $user = $this->userRepository->getById($confirmation->getUserId()); $user->setActive(true); - $this->pdm->saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); - \Container::$dbConnection->commit(); - - $this->request->setUser($user); + \Container::$request->setUser($user); $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); @@ -451,37 +435,33 @@ class LoginController public function cancel() { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new Redirect($this->redirectUrl, IRedirect::TEMPORARY); } - $confirmation = $this->userConfirmationRepository->getByToken(substr($this->request->query('token'), 0, 32)); + $confirmation = $this->userConfirmationRepository->getByToken(substr(\Container::$request->query('token'), 0, 32)); if ($confirmation === null) { return new HtmlContent('login/cancel', ['success' => false]); } - \Container::$dbConnection->startTransaction(); - - $this->pdm->deleteFromDb($confirmation); + \Container::$persistentDataManager->deleteFromDb($confirmation); $user = $this->userRepository->getById($confirmation->getUserId()); foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) { - $this->pdm->deleteFromDb($userPlayedPlace); + \Container::$persistentDataManager->deleteFromDb($userPlayedPlace); } - $this->pdm->deleteFromDb($user); - - \Container::$dbConnection->commit(); + \Container::$persistentDataManager->deleteFromDb($user); return new HtmlContent('login/cancel', ['success' => true]); } public function requestPasswordReset(): IContent { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new JsonContent([ 'redirect' => [ @@ -491,18 +471,18 @@ class LoginController } if (!empty($_ENV['RECAPTCHA_SITEKEY'])) { - if (!$this->request->post('g-recaptcha-response')) { + if (!\Container::$request->post('g-recaptcha-response')) { return new JsonContent(['error' => ['errorText' => 'Please check "I\'m not a robot" in the reCAPTCHA box!']]); } $captchaValidator = new CaptchaValidator(); - $captchaResponse = $captchaValidator->validate($this->request->post('g-recaptcha-response')); + $captchaResponse = $captchaValidator->validate(\Container::$request->post('g-recaptcha-response')); if (!$captchaResponse['success']) { return new JsonContent(['error' => ['errorText' => 'reCAPTCHA challenge failed. Please try again!']]); } } - $user = $this->userRepository->getByEmail($this->request->post('email')); + $user = $this->userRepository->getByEmail(\Container::$request->post('email')); if ($user === null) { return new JsonContent([ @@ -541,15 +521,11 @@ class LoginController $passwordResetter->setToken($token); $passwordResetter->setExpiresDate($expires); - \Container::$dbConnection->startTransaction(); - if ($existingResetter !== null) { - $this->pdm->deleteFromDb($existingResetter); + \Container::$persistentDataManager->deleteFromDb($existingResetter); } - $this->pdm->saveToDb($passwordResetter); - - \Container::$dbConnection->commit(); + \Container::$persistentDataManager->saveToDb($passwordResetter); $this->sendPasswordResetEmail($user->getEmail(), $token, $expires); @@ -559,7 +535,7 @@ class LoginController public function resetPassword(): IContent { - if ($this->request->user() !== null) { + if (\Container::$request->user() !== null) { $this->deleteRedirectUrl(); return new JsonContent([ 'redirect' => [ @@ -568,7 +544,7 @@ class LoginController ]); } - $token = $this->request->query('token'); + $token = \Container::$request->query('token'); $resetter = $this->userPasswordResetterRepository->getByToken($token); if ($resetter === null || $resetter->getExpiresDate() < new DateTime()) { @@ -579,7 +555,7 @@ class LoginController ]); } - if (strlen($this->request->post('password')) < 6) { + if (strlen(\Container::$request->post('password')) < 6) { return new JsonContent([ 'error' => [ 'errorText' => 'The given password is too short. Please choose a password that is at least 6 characters long!' @@ -587,22 +563,18 @@ class LoginController ]); } - if ($this->request->post('password') !== $this->request->post('password_confirm')) { + if (\Container::$request->post('password') !== \Container::$request->post('password_confirm')) { return new JsonContent(['error' => ['errorText' => 'The given passwords do not match.']]); } - \Container::$dbConnection->startTransaction(); - - $this->pdm->deleteFromDb($resetter); + \Container::$persistentDataManager->deleteFromDb($resetter); $user = $this->userRepository->getById($resetter->getUserId()); - $user->setPlainPassword($this->request->post('password')); + $user->setPlainPassword(\Container::$request->post('password')); - $this->pdm->saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); - \Container::$dbConnection->commit(); - - $this->request->setUser($user); + \Container::$request->setUser($user); $this->deleteRedirectUrl(); return new JsonContent(['success' => true]); @@ -615,9 +587,9 @@ class LoginController $mail->setSubject('Welcome to ' . $_ENV['APP_NAME'] . ' - Activate your account'); $mail->setBodyFromTemplate('signup', [ 'EMAIL' => $email, - 'ACTIVATE_LINK' => $this->request->getBase() . + 'ACTIVATE_LINK' => \Container::$request->getBase() . \Container::$routeCollection->getRoute('signup.activate')->generateLink(['token' => $token]), - 'CANCEL_LINK' => $this->request->getBase() . + 'CANCEL_LINK' => \Container::$request->getBase() . \Container::$routeCollection->getRoute('signup.cancel')->generateLink(['token' => $token]), 'ACTIVATABLE_UNTIL' => (clone $created)->add(new DateInterval('P1D'))->format('Y-m-d H:i T') ]); @@ -634,7 +606,7 @@ class LoginController $confirmation->setLastSentDate(new DateTime()); - $this->pdm->saveToDb($confirmation); + \Container::$persistentDataManager->saveToDb($confirmation); $this->sendConfirmationEmail($user->getEmail(), $confirmation->getToken(), $user->getCreatedDate()); @@ -659,7 +631,7 @@ class LoginController $mail->setSubject($_ENV['APP_NAME'] . ' - Password reset'); $mail->setBodyFromTemplate('password-reset', [ 'EMAIL' => $email, - 'RESET_LINK' => $this->request->getBase() . + 'RESET_LINK' => \Container::$request->getBase() . \Container::$routeCollection->getRoute('password-reset')->generateLink(['token' => $token]), 'EXPIRES' => $expires->format('Y-m-d H:i T') ]); @@ -668,6 +640,6 @@ class LoginController private function deleteRedirectUrl(): void { - $this->request->session()->delete('redirect_after_login'); + \Container::$request->session()->delete('redirect_after_login'); } } diff --git a/src/Controller/MapAdminController.php b/src/Controller/MapAdminController.php index 47a972f..dd9467b 100644 --- a/src/Controller/MapAdminController.php +++ b/src/Controller/MapAdminController.php @@ -4,13 +4,11 @@ use DateTime; use SokoWeb\Interfaces\Authentication\IUser; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; use SokoWeb\Interfaces\Authorization\ISecured; -use SokoWeb\Interfaces\Request\IRequest; use SokoWeb\Interfaces\Response\IContent; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Map; use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\PlaceInChallenge; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\Repository\ChallengeRepository; use MapGuesser\Repository\GuessRepository; use MapGuesser\Repository\MapRepository; @@ -27,10 +25,6 @@ class MapAdminController implements IAuthenticationRequired, ISecured { private static string $unnamedMapName = '[unnamed map]'; - private IRequest $request; - - private PersistentDataManager $pdm; - private MapRepository $mapRepository; private PlaceRepository $placeRepository; @@ -45,10 +39,8 @@ class MapAdminController implements IAuthenticationRequired, ISecured private UserInChallengeRepository $userInChallengeRepository; - public function __construct(IRequest $request) + public function __construct() { - $this->request = $request; - $this->pdm = new PersistentDataManager(); $this->mapRepository = new MapRepository(); $this->placeRepository = new PlaceRepository(); $this->userPlayedPlaceRepository = new UserPlayedPlaceRepository(); @@ -65,12 +57,12 @@ class MapAdminController implements IAuthenticationRequired, ISecured public function authorize(): bool { - return $this->request->user()->hasPermission(IUser::PERMISSION_ADMIN); + return \Container::$request->user()->hasPermission(IUser::PERMISSION_ADMIN); } public function getMapEditor(): IContent { - $mapId = (int) $this->request->query('mapId'); + $mapId = (int) \Container::$request->query('mapId'); if ($mapId) { $map = $this->mapRepository->getById($mapId); @@ -93,7 +85,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured public function getPlace(): IContent { - $placeId = (int) $this->request->query('placeId'); + $placeId = (int) \Container::$request->query('placeId'); $place = $this->placeRepository->getById($placeId); @@ -102,16 +94,14 @@ class MapAdminController implements IAuthenticationRequired, ISecured public function saveMap(): IContent { - $mapId = (int) $this->request->query('mapId'); - - \Container::$dbConnection->startTransaction(); + $mapId = (int) \Container::$request->query('mapId'); if ($mapId) { $map = $this->mapRepository->getById($mapId); } else { $map = new Map(); $map->setName(self::$unnamedMapName); - $this->pdm->saveToDb($map); + \Container::$persistentDataManager->saveToDb($map); } if (isset($_POST['added'])) { @@ -133,7 +123,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured $place->setPanoIdCachedTimestampDate(new DateTime('-1 day')); } - $this->pdm->saveToDb($place); + \Container::$persistentDataManager->saveToDb($place); $addedIds[] = ['tempId' => $placeRaw['id'], 'id' => $place->getId()]; } @@ -155,7 +145,7 @@ class MapAdminController implements IAuthenticationRequired, ISecured )); $place->setPanoIdCachedTimestampDate(new DateTime('-1 day')); - $this->pdm->saveToDb($place); + \Container::$persistentDataManager->saveToDb($place); } } @@ -184,26 +174,20 @@ class MapAdminController implements IAuthenticationRequired, ISecured $map->setUnlisted((bool)$_POST['unlisted']); } - $this->pdm->saveToDb($map); - - \Container::$dbConnection->commit(); + \Container::$persistentDataManager->saveToDb($map); return new JsonContent(['mapId' => $map->getId(), 'added' => $addedIds]); } public function deleteMap(): IContent { - $mapId = (int) $this->request->query('mapId'); + $mapId = (int) \Container::$request->query('mapId'); $map = $this->mapRepository->getById($mapId); - \Container::$dbConnection->startTransaction(); - $this->deletePlaces($map); - $this->pdm->deleteFromDb($map); - - \Container::$dbConnection->commit(); + \Container::$persistentDataManager->deleteFromDb($map); return new JsonContent(['success' => true]); } @@ -211,14 +195,14 @@ class MapAdminController implements IAuthenticationRequired, ISecured private function deletePlace(Place $place): void { foreach ($this->userPlayedPlaceRepository->getAllByPlace($place) as $userPlayedPlace) { - $this->pdm->deleteFromDb($userPlayedPlace); + \Container::$persistentDataManager->deleteFromDb($userPlayedPlace); } foreach ($this->challengeRepository->getAllByPlace($place) as $challenge) { $this->deleteChallenge($challenge); } - $this->pdm->deleteFromDb($place); + \Container::$persistentDataManager->deleteFromDb($place); } private function deletePlaces(Map $map): void @@ -231,18 +215,18 @@ class MapAdminController implements IAuthenticationRequired, ISecured private function deleteChallenge(Challenge $challenge): void { foreach ($this->userInChallengeRepository->getAllByChallenge($challenge) as $userInChallenge) { - $this->pdm->deleteFromDb($userInChallenge); + \Container::$persistentDataManager->deleteFromDb($userInChallenge); } foreach ($this->guessRepository->getAllInChallenge($challenge, [PlaceInChallenge::class]) as $guess) { - $this->pdm->deleteFromDb($guess); + \Container::$persistentDataManager->deleteFromDb($guess); } foreach ($this->placeInChallengeRepository->getAllByChallenge($challenge) as $placeInChallenge) { - $this->pdm->deleteFromDb($placeInChallenge); + \Container::$persistentDataManager->deleteFromDb($placeInChallenge); } - $this->pdm->deleteFromDb($challenge); + \Container::$persistentDataManager->deleteFromDb($challenge); } private function calculateMapBounds(Map $map): Bounds diff --git a/src/Controller/MapsController.php b/src/Controller/MapsController.php index 704d9a3..45505e9 100644 --- a/src/Controller/MapsController.php +++ b/src/Controller/MapsController.php @@ -4,19 +4,11 @@ use SokoWeb\Database\Query\Select; use SokoWeb\Database\RawExpression; use SokoWeb\Interfaces\Authentication\IUser; use SokoWeb\Interfaces\Database\IResultSet; -use SokoWeb\Interfaces\Request\IRequest; use SokoWeb\Interfaces\Response\IContent; use SokoWeb\Response\HtmlContent; class MapsController { - private IRequest $request; - - public function __construct(IRequest $request) - { - $this->request = $request; - } - public function getMaps(): IContent { //TODO: from repository - count should be added @@ -37,7 +29,7 @@ class MapsController $select->groupBy(['maps', 'id']); $select->orderBy('name'); - $user = $this->request->user(); + $user = \Container::$request->user(); $isAdmin = $user !== null && $user->hasPermission(IUser::PERMISSION_ADMIN); if (!$isAdmin) { $select->where(['maps', 'unlisted'], '=', false); diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 0fcb69f..2058690 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -3,11 +3,9 @@ use DateTime; use SokoWeb\Http\Request; use SokoWeb\Interfaces\Authentication\IAuthenticationRequired; -use SokoWeb\Interfaces\Request\IRequest; use SokoWeb\Interfaces\Response\IContent; use SokoWeb\Interfaces\Response\IRedirect; use SokoWeb\OAuth\GoogleOAuth; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\PersistentData\Model\User; use MapGuesser\Repository\GuessRepository; use MapGuesser\Repository\UserConfirmationRepository; @@ -21,10 +19,6 @@ use SokoWeb\Util\JwtParser; class UserController implements IAuthenticationRequired { - private IRequest $request; - - private PersistentDataManager $pdm; - private UserConfirmationRepository $userConfirmationRepository; private UserPasswordResetterRepository $userPasswordResetterRepository; @@ -35,10 +29,8 @@ class UserController implements IAuthenticationRequired private GuessRepository $guessRepository; - public function __construct(IRequest $request) + public function __construct() { - $this->request = $request; - $this->pdm = new PersistentDataManager(); $this->userConfirmationRepository = new UserConfirmationRepository(); $this->userPasswordResetterRepository = new UserPasswordResetterRepository(); $this->userPlayedPlaceRepository = new UserPlayedPlaceRepository(); @@ -56,7 +48,7 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); return new HtmlContent('account/account', ['user' => $user->toArray()]); } @@ -66,19 +58,19 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); $state = bin2hex(random_bytes(16)); $nonce = bin2hex(random_bytes(16)); - $this->request->session()->set('oauth_state', $state); - $this->request->session()->set('oauth_nonce', $nonce); + \Container::$request->session()->set('oauth_state', $state); + \Container::$request->session()->set('oauth_nonce', $nonce); $oAuth = new GoogleOAuth(new Request()); $url = $oAuth->getDialogUrl( $state, - $this->request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink(), + \Container::$request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink(), $nonce, $user->getEmail() ); @@ -91,16 +83,16 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); - if ($this->request->query('state') !== $this->request->session()->get('oauth_state')) { + if (\Container::$request->query('state') !== \Container::$request->session()->get('oauth_state')) { return new HtmlContent('account/google_authenticate', ['success' => false]); } $oAuth = new GoogleOAuth(new Request()); $tokenData = $oAuth->getToken( - $this->request->query('code'), - $this->request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink() + \Container::$request->query('code'), + \Container::$request->getBase() . \Container::$routeCollection->getRoute('account.googleAuthenticate-action')->generateLink() ); if (!isset($tokenData['id_token'])) { @@ -110,7 +102,7 @@ class UserController implements IAuthenticationRequired $jwtParser = new JwtParser($tokenData['id_token']); $idToken = $jwtParser->getPayload(); - if ($idToken['nonce'] !== $this->request->session()->get('oauth_nonce')) { + if ($idToken['nonce'] !== \Container::$request->session()->get('oauth_nonce')) { return new HtmlContent('account/google_authenticate', ['success' => false]); } @@ -122,7 +114,7 @@ class UserController implements IAuthenticationRequired } $authenticatedWithGoogleUntil = new DateTime('+45 seconds'); - $this->request->session()->set('authenticated_with_google_until', $authenticatedWithGoogleUntil); + \Container::$request->session()->set('authenticated_with_google_until', $authenticatedWithGoogleUntil); return new HtmlContent('account/google_authenticate', [ 'success' => true, @@ -135,7 +127,7 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); return new HtmlContent('account/delete', ['user' => $user->toArray()]); } @@ -145,19 +137,19 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); if (!$this->confirmUserIdentity( $user, - $this->request->session()->get('authenticated_with_google_until'), - $this->request->post('password'), + \Container::$request->session()->get('authenticated_with_google_until'), + \Container::$request->post('password'), $error )) { return new JsonContent(['error' => ['errorText' => $error]]); } - if (strlen($this->request->post('password_new')) > 0) { - if (strlen($this->request->post('password_new')) < 6) { + if (strlen(\Container::$request->post('password_new')) > 0) { + if (strlen(\Container::$request->post('password_new')) < 6) { return new JsonContent([ 'error' => [ 'errorText' => 'The given new password is too short. Please choose a password that is at least 6 characters long!' @@ -165,7 +157,7 @@ class UserController implements IAuthenticationRequired ]); } - if ($this->request->post('password_new') !== $this->request->post('password_new_confirm')) { + if (\Container::$request->post('password_new') !== \Container::$request->post('password_new_confirm')) { return new JsonContent([ 'error' => [ 'errorText' => 'The given new passwords do not match.' @@ -173,12 +165,12 @@ class UserController implements IAuthenticationRequired ]); } - $user->setPlainPassword($this->request->post('password_new')); + $user->setPlainPassword(\Container::$request->post('password_new')); } - $this->pdm->saveToDb($user); + \Container::$persistentDataManager->saveToDb($user); - $this->request->session()->delete('authenticated_with_google_until'); + \Container::$request->session()->delete('authenticated_with_google_until'); return new JsonContent(['success' => true]); } @@ -188,46 +180,42 @@ class UserController implements IAuthenticationRequired /** * @var User $user */ - $user = $this->request->user(); + $user = \Container::$request->user(); if (!$this->confirmUserIdentity( $user, - $this->request->session()->get('authenticated_with_google_until'), - $this->request->post('password'), + \Container::$request->session()->get('authenticated_with_google_until'), + \Container::$request->post('password'), $error )) { return new JsonContent(['error' => ['errorText' => $error]]); } - \Container::$dbConnection->startTransaction(); - $userConfirmation = $this->userConfirmationRepository->getByUser($user); if ($userConfirmation !== null) { - $this->pdm->deleteFromDb($userConfirmation); + \Container::$persistentDataManager->deleteFromDb($userConfirmation); } $userPasswordResetter = $this->userPasswordResetterRepository->getByUser($user); if ($userPasswordResetter !== null) { - $this->pdm->deleteFromDb($userPasswordResetter); + \Container::$persistentDataManager->deleteFromDb($userPasswordResetter); } foreach ($this->userPlayedPlaceRepository->getAllByUser($user) as $userPlayedPlace) { - $this->pdm->deleteFromDb($userPlayedPlace); + \Container::$persistentDataManager->deleteFromDb($userPlayedPlace); } foreach ($this->userInChallengeRepository->getAllByUser($user) as $userInChallenge) { - $this->pdm->deleteFromDb($userInChallenge); + \Container::$persistentDataManager->deleteFromDb($userInChallenge); } foreach ($this->guessRepository->getAllByUser($user) as $guess) { - $this->pdm->deleteFromDb($guess); + \Container::$persistentDataManager->deleteFromDb($guess); } - $this->pdm->deleteFromDb($user); + \Container::$persistentDataManager->deleteFromDb($user); - \Container::$dbConnection->commit(); - - $this->request->session()->delete('authenticated_with_google_until'); + \Container::$request->session()->delete('authenticated_with_google_until'); return new JsonContent(['success' => true]); } diff --git a/src/PersistentData/Model/Place.php b/src/PersistentData/Model/Place.php index 71c015a..182955c 100644 --- a/src/PersistentData/Model/Place.php +++ b/src/PersistentData/Model/Place.php @@ -4,7 +4,6 @@ use DateInterval; use DateTime; use SokoWeb\PersistentData\Model\Model; use SokoWeb\Http\Request; -use SokoWeb\PersistentData\PersistentDataManager; use MapGuesser\Util\Geo\Position; use MapGuesser\Util\Panorama\Pov; @@ -163,7 +162,7 @@ class Place extends Model $this->panoIdCached = $panoId; $this->panoIdCachedTimestamp = new DateTime(); - (new PersistentDataManager())->saveToDb($this); + \Container::$persistentDataManager->saveToDb($this); return $panoId; } diff --git a/src/Repository/ChallengeRepository.php b/src/Repository/ChallengeRepository.php index 60bc42f..cc4423e 100644 --- a/src/Repository/ChallengeRepository.php +++ b/src/Repository/ChallengeRepository.php @@ -5,20 +5,12 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\User; -use SokoWeb\PersistentData\PersistentDataManager; class ChallengeRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $challengeId): ?Challenge { - return $this->pdm->selectFromDbById($challengeId, Challenge::class); + return \Container::$persistentDataManager->selectFromDbById($challengeId, Challenge::class); } public function getByToken(int $token): ?Challenge @@ -26,7 +18,7 @@ class ChallengeRepository $select = new Select(\Container::$dbConnection); $select->where('token', '=', $token); - return $this->pdm->selectFromDb($select, Challenge::class); + return \Container::$persistentDataManager->selectFromDb($select, Challenge::class); } public function getByTokenStr(string $token_str): ?Challenge @@ -50,7 +42,7 @@ class ChallengeRepository $select->innerJoin('users', ['users', 'id'], '=', ['user_in_challenge', 'user_id']); $select->where('user_id', '=', $user->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Challenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class); } public function getAllByOwner(User $user): Generator @@ -61,7 +53,7 @@ class ChallengeRepository $select->where('user_id', '=', $user->getId()); $select->where('is_owner', '=', true); - yield from $this->pdm->selectMultipleFromDb($select, Challenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class); } public function getAllByPlace(Place $place): Generator @@ -70,6 +62,6 @@ class ChallengeRepository $select->innerJoin('place_in_challenge', ['challenges', 'id'], '=', ['place_in_challenge', 'challenge_id']); $select->where('place_id', '=', $place->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Challenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Challenge::class); } } diff --git a/src/Repository/GuessRepository.php b/src/Repository/GuessRepository.php index 307429c..2baa6c8 100644 --- a/src/Repository/GuessRepository.php +++ b/src/Repository/GuessRepository.php @@ -7,23 +7,15 @@ use MapGuesser\PersistentData\Model\Guess; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\PlaceInChallenge; -use SokoWeb\PersistentData\PersistentDataManager; class GuessRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getAllByUser(User $user): Generator { $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class); } public function getAllByUserAndChallenge(User $user, Challenge $challenge): Generator @@ -33,7 +25,7 @@ class GuessRepository $select->where('user_id', '=', $user->getId()); $select->where('challenge_id', '=', $challenge->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class); } public function getByUserAndPlaceInChallenge(User $user, Challenge $challenge, Place $place): ?Guess @@ -44,7 +36,7 @@ class GuessRepository $select->where('challenge_id', '=', $challenge->getId()); $select->where('place_id', '=', $place->getId()); - return $this->pdm->selectFromDb($select, Guess::class); + return \Container::$persistentDataManager->selectFromDb($select, Guess::class); } public function getAllInChallengeByUser(int $userId, Challenge $challenge): Generator @@ -55,7 +47,7 @@ class GuessRepository $select->where('challenge_id', '=', $challenge->getId()); $select->orderBy('round'); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class); } public function getAllInChallenge(Challenge $challenge, array $withRelations = []): Generator @@ -69,7 +61,7 @@ class GuessRepository $select->where('challenge_id', '=', $challenge->getId()); $select->orderBy('round'); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class, true, $withRelations); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class, true, $withRelations); } public function getAllInChallengeByRound(int $round, Challenge $challenge, array $withRelations = []): Generator @@ -83,7 +75,7 @@ class GuessRepository $select->where('challenge_id', '=', $challenge->getId()); $select->where('round', '=', $round); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class, true, $withRelations); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class, true, $withRelations); } public function getAllByPlace(Place $place): Generator @@ -92,6 +84,6 @@ class GuessRepository $select->innerJoin('place_in_challenge', ['place_in_challenge', 'id'], '=', ['guesses', 'place_in_challenge_id']); $select->where('place_id', '=', $place->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Guess::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Guess::class); } } diff --git a/src/Repository/MapRepository.php b/src/Repository/MapRepository.php index d2a1f83..680b62c 100644 --- a/src/Repository/MapRepository.php +++ b/src/Repository/MapRepository.php @@ -4,20 +4,12 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Map; use MapGuesser\PersistentData\Model\Place; -use SokoWeb\PersistentData\PersistentDataManager; class MapRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $mapId): ?Map { - return $this->pdm->selectFromDbById($mapId, Map::class); + return \Container::$persistentDataManager->selectFromDbById($mapId, Map::class); } public function getByPlace(Place $place): ?Map @@ -33,6 +25,6 @@ class MapRepository $select->where('challenge_id', '=', $challenge->getId()); $select->limit(1); - return $this->pdm->selectFromDb($select, Map::class); + return \Container::$persistentDataManager->selectFromDb($select, Map::class); } } diff --git a/src/Repository/MultiRoomRepository.php b/src/Repository/MultiRoomRepository.php index dd4a089..109938f 100644 --- a/src/Repository/MultiRoomRepository.php +++ b/src/Repository/MultiRoomRepository.php @@ -4,20 +4,12 @@ use DateTime; use Generator; use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\MultiRoom; -use SokoWeb\PersistentData\PersistentDataManager; class MultiRoomRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $id): ?MultiRoom { - return $this->pdm->selectFromDbById($id, MultiRoom::class); + return \Container::$persistentDataManager->selectFromDbById($id, MultiRoom::class); } public function getByRoomId(string $roomId): ?MultiRoom @@ -25,7 +17,7 @@ class MultiRoomRepository $select = new Select(\Container::$dbConnection); $select->where('room_id', '=', $roomId); - return $this->pdm->selectFromDb($select, MultiRoom::class); + return \Container::$persistentDataManager->selectFromDb($select, MultiRoom::class); } public function getAllExpired(): Generator @@ -33,6 +25,6 @@ class MultiRoomRepository $select = new Select(\Container::$dbConnection); $select->where('updated', '<', (new DateTime('-7 day'))->format('Y-m-d H:i:s')); - yield from $this->pdm->selectMultipleFromDb($select, MultiRoom::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, MultiRoom::class); } } diff --git a/src/Repository/PlaceInChallengeRepository.php b/src/Repository/PlaceInChallengeRepository.php index 14b16c6..0da00cb 100644 --- a/src/Repository/PlaceInChallengeRepository.php +++ b/src/Repository/PlaceInChallengeRepository.php @@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\PlaceInChallenge; -use SokoWeb\PersistentData\PersistentDataManager; class PlaceInChallengeRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getAllByPlace(Place $place, array $withRelations = []) : Generator { $select = new Select(\Container::$dbConnection); $select->where('place_id', '=', $place->getId()); - yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class, true, $withRelations); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, PlaceInChallenge::class, true, $withRelations); } public function getAllByChallenge(Challenge $challenge) : Generator @@ -29,7 +21,7 @@ class PlaceInChallengeRepository $select = new Select(\Container::$dbConnection); $select->where('challenge_id', '=', $challenge->getId()); - yield from $this->pdm->selectMultipleFromDb($select, PlaceInChallenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, PlaceInChallenge::class); } public function getByPlaceAndChallenge(Place $place, Challenge $challenge) : ?PlaceInChallenge @@ -38,7 +30,7 @@ class PlaceInChallengeRepository $select->where('place_id', '=', $place->getId()); $select->where('challenge_id', '=', $challenge->getId()); - return $this->pdm->selectFromDb($select, PlaceInChallenge::class); + return \Container::$persistentDataManager->selectFromDb($select, PlaceInChallenge::class); } public function getByRoundInChallenge(int $round, Challenge $challenge, array $withRelations = []): ?PlaceInChallenge @@ -48,6 +40,6 @@ class PlaceInChallengeRepository $select->orderBy('round'); $select->limit(1, $round); - return $this->pdm->selectFromDb($select, PlaceInChallenge::class, true, $withRelations); + return \Container::$persistentDataManager->selectFromDb($select, PlaceInChallenge::class, true, $withRelations); } } diff --git a/src/Repository/PlaceRepository.php b/src/Repository/PlaceRepository.php index fb32eb5..45319e5 100644 --- a/src/Repository/PlaceRepository.php +++ b/src/Repository/PlaceRepository.php @@ -5,20 +5,12 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\Map; use MapGuesser\PersistentData\Model\Place; -use SokoWeb\PersistentData\PersistentDataManager; class PlaceRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $placeId): ?Place { - return $this->pdm->selectFromDbById($placeId, Place::class); + return \Container::$persistentDataManager->selectFromDbById($placeId, Place::class); } public function getAllForMap(Map $map): Generator @@ -26,7 +18,7 @@ class PlaceRepository $select = new Select(\Container::$dbConnection); $select->where('map_id', '=', $map->getId()); - yield from $this->pdm->selectMultipleFromDb($select, Place::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Place::class); } //TODO: use Map and User instead of id @@ -99,7 +91,7 @@ class PlaceRepository $select->where('id', 'NOT IN', $exclude); $select->limit(1, $randomOffset); - return $this->pdm->selectFromDb($select, Place::class); + return \Container::$persistentDataManager->selectFromDb($select, Place::class); } // Never visited places @@ -186,7 +178,7 @@ class PlaceRepository $select->orderBy('round'); $select->limit(1, $round); - return $this->pdm->selectFromDb($select, Place::class); + return \Container::$persistentDataManager->selectFromDb($select, Place::class); } public function getAllInChallenge(Challenge $challenge): Generator @@ -196,7 +188,7 @@ class PlaceRepository $select->where('challenge_id', '=', $challenge->getId()); $select->orderBy('round'); - yield from $this->pdm->selectMultipleFromDb($select, Place::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, Place::class); } } diff --git a/src/Repository/UserConfirmationRepository.php b/src/Repository/UserConfirmationRepository.php index 3cd80e0..dd5970d 100644 --- a/src/Repository/UserConfirmationRepository.php +++ b/src/Repository/UserConfirmationRepository.php @@ -3,20 +3,12 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\UserConfirmation; -use SokoWeb\PersistentData\PersistentDataManager; class UserConfirmationRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $userConfirmationId): ?UserConfirmation { - return $this->pdm->selectFromDbById($userConfirmationId, UserConfirmation::class); + return \Container::$persistentDataManager->selectFromDbById($userConfirmationId, UserConfirmation::class); } public function getByToken(string $token): ?UserConfirmation @@ -24,7 +16,7 @@ class UserConfirmationRepository $select = new Select(\Container::$dbConnection); $select->where('token', '=', $token); - return $this->pdm->selectFromDb($select, UserConfirmation::class); + return \Container::$persistentDataManager->selectFromDb($select, UserConfirmation::class); } public function getByUser(User $user): ?UserConfirmation @@ -32,6 +24,6 @@ class UserConfirmationRepository $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - return $this->pdm->selectFromDb($select, UserConfirmation::class); + return \Container::$persistentDataManager->selectFromDb($select, UserConfirmation::class); } } diff --git a/src/Repository/UserInChallengeRepository.php b/src/Repository/UserInChallengeRepository.php index bd6e424..3e7d5ab 100644 --- a/src/Repository/UserInChallengeRepository.php +++ b/src/Repository/UserInChallengeRepository.php @@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Challenge; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\UserInChallenge; -use SokoWeb\PersistentData\PersistentDataManager; class UserInChallengeRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getAllByUser(User $user) : Generator { $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class); } public function getAllByChallenge(Challenge $challenge) : Generator @@ -29,7 +21,7 @@ class UserInChallengeRepository $select = new Select(\Container::$dbConnection); $select->where('challenge_id', '=', $challenge->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class); } public function getAllByChallengeWithUsers(Challenge $challenge) : Generator @@ -37,7 +29,7 @@ class UserInChallengeRepository $select = new Select(\Container::$dbConnection); $select->where('challenge_id', '=', $challenge->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserInChallenge::class, true, [User::class]); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserInChallenge::class, true, [User::class]); } public function getByUserIdAndChallenge(int $userId, Challenge $challenge): ?UserInChallenge @@ -46,7 +38,7 @@ class UserInChallengeRepository $select->where('user_id', '=', $userId); $select->where('challenge_id', '=', $challenge->getId()); - return $this->pdm->selectFromDb($select, UserInChallenge::class); + return \Container::$persistentDataManager->selectFromDb($select, UserInChallenge::class); } public function getByUserIdAndToken(int $userId, string $token_str, array $withRelations = []): ?UserInChallenge @@ -67,7 +59,7 @@ class UserInChallengeRepository $select->where('user_id', '=', $userId); $select->where('token', '=', $token); - return $this->pdm->selectFromDb($select, UserInChallenge::class, true, $withRelations); + return \Container::$persistentDataManager->selectFromDb($select, UserInChallenge::class, true, $withRelations); } public function isUserParticipatingInChallenge(int $userId, Challenge $challenge): bool diff --git a/src/Repository/UserPasswordResetterRepository.php b/src/Repository/UserPasswordResetterRepository.php index 4ed53d5..1a30b6d 100644 --- a/src/Repository/UserPasswordResetterRepository.php +++ b/src/Repository/UserPasswordResetterRepository.php @@ -5,20 +5,12 @@ use Generator; use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\UserPasswordResetter; -use SokoWeb\PersistentData\PersistentDataManager; class UserPasswordResetterRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $userConfirmationId): ?UserPasswordResetter { - return $this->pdm->selectFromDbById($userConfirmationId, UserPasswordResetter::class); + return \Container::$persistentDataManager->selectFromDbById($userConfirmationId, UserPasswordResetter::class); } public function getByToken(string $token): ?UserPasswordResetter @@ -26,7 +18,7 @@ class UserPasswordResetterRepository $select = new Select(\Container::$dbConnection); $select->where('token', '=', $token); - return $this->pdm->selectFromDb($select, UserPasswordResetter::class); + return \Container::$persistentDataManager->selectFromDb($select, UserPasswordResetter::class); } public function getByUser(User $user): ?UserPasswordResetter @@ -34,7 +26,7 @@ class UserPasswordResetterRepository $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - return $this->pdm->selectFromDb($select, UserPasswordResetter::class); + return \Container::$persistentDataManager->selectFromDb($select, UserPasswordResetter::class); } public function getAllExpired(): Generator @@ -42,6 +34,6 @@ class UserPasswordResetterRepository $select = new Select(\Container::$dbConnection); $select->where('expires', '<', (new DateTime())->format('Y-m-d H:i:s')); - yield from $this->pdm->selectMultipleFromDb($select, UserPasswordResetter::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPasswordResetter::class); } } diff --git a/src/Repository/UserPlayedPlaceRepository.php b/src/Repository/UserPlayedPlaceRepository.php index effb598..ec4230a 100644 --- a/src/Repository/UserPlayedPlaceRepository.php +++ b/src/Repository/UserPlayedPlaceRepository.php @@ -5,23 +5,15 @@ use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\User; use MapGuesser\PersistentData\Model\Place; use MapGuesser\PersistentData\Model\UserPlayedPlace; -use SokoWeb\PersistentData\PersistentDataManager; class UserPlayedPlaceRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getByUser(User $user): Generator { $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class); } public function getAllByPlace(Place $place): Generator @@ -29,7 +21,7 @@ class UserPlayedPlaceRepository $select = new Select(\Container::$dbConnection); $select->where('place_id', '=', $place->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class); } public function getAllByUser(User $user) : Generator @@ -37,7 +29,7 @@ class UserPlayedPlaceRepository $select = new Select(\Container::$dbConnection); $select->where('user_id', '=', $user->getId()); - yield from $this->pdm->selectMultipleFromDb($select, UserPlayedPlace::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, UserPlayedPlace::class); } public function getByUserIdAndPlaceId(int $userId, int $placeId) : ?UserPlayedPlace @@ -46,6 +38,6 @@ class UserPlayedPlaceRepository $select->where('user_id', '=', $userId); $select->where('place_id', '=', $placeId); - return $this->pdm->selectFromDb($select, UserPlayedPlace::class); + return \Container::$persistentDataManager->selectFromDb($select, UserPlayedPlace::class); } } diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index b683b94..2062739 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -6,20 +6,12 @@ use SokoWeb\Interfaces\Repository\IUserRepository; use SokoWeb\Database\Query\Select; use MapGuesser\PersistentData\Model\Guess; use MapGuesser\PersistentData\Model\User; -use SokoWeb\PersistentData\PersistentDataManager; class UserRepository implements IUserRepository { - private PersistentDataManager $pdm; - - public function __construct() - { - $this->pdm = new PersistentDataManager(); - } - public function getById(int $userId): ?User { - return $this->pdm->selectFromDbById($userId, User::class); + return \Container::$persistentDataManager->selectFromDbById($userId, User::class); } public function getByEmail(string $email): ?User @@ -27,7 +19,7 @@ class UserRepository implements IUserRepository $select = new Select(\Container::$dbConnection); $select->where('email', '=', $email); - return $this->pdm->selectFromDb($select, User::class); + return \Container::$persistentDataManager->selectFromDb($select, User::class); } public function getByGoogleSub(string $sub): ?User @@ -35,7 +27,7 @@ class UserRepository implements IUserRepository $select = new Select(\Container::$dbConnection); $select->where('google_sub', '=', $sub); - return $this->pdm->selectFromDb($select, User::class); + return \Container::$persistentDataManager->selectFromDb($select, User::class); } public function getAllInactiveExpired(): Generator @@ -44,7 +36,7 @@ class UserRepository implements IUserRepository $select->where('active', '=', false); $select->where('created', '<', (new DateTime('-1 day'))->format('Y-m-d H:i:s')); - yield from $this->pdm->selectMultipleFromDb($select, User::class); + yield from \Container::$persistentDataManager->selectMultipleFromDb($select, User::class); } public function getByGuess(Guess $guess): ?User diff --git a/views/error/500.php b/views/error/500.php new file mode 100644 index 0000000..6732cc3 --- /dev/null +++ b/views/error/500.php @@ -0,0 +1,11 @@ +@extends(templates/layout_normal) + +@section(main) +

500 | Internal server error

+

An error occured during processing your request. Back to start.

+ +
+
+            
+ +@endsection diff --git a/web.php b/web.php index 016302d..82776dc 100644 --- a/web.php +++ b/web.php @@ -90,7 +90,7 @@ Container::$routeCollection->group('admin', function (RouteCollection $routeColl }); if (isset($_COOKIE['COOKIES_CONSENT'])) { - Container::$sessionHandler = new DatabaseSessionHandler(); + Container::$sessionHandler = new DatabaseSessionHandler(Container::$dbConnection); session_set_save_handler(Container::$sessionHandler, true); session_start([ @@ -137,11 +137,13 @@ $appConfig = [ 'antiCsrfTokenErrorResponse' => ['error' => 'no_valid_anti_csrf_token'], 'antiCsrfTokenExceptions' => [], 'loginRouteId' => 'login', - 'error404View' => 'error/404' + 'error404View' => 'error/404', + 'error500View' => 'error/500' ]; $httpReponse = new HttpResponse( Container::$request, + Container::$dbConnection, Container::$routeCollection, $appConfig, $_SERVER['REQUEST_METHOD'],