FrankProjects/UltimateWarfare

View on GitHub
src/Controller/Game/LoginController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace FrankProjects\UltimateWarfare\Controller\Game;

use FrankProjects\UltimateWarfare\Entity\Player;
use FrankProjects\UltimateWarfare\Entity\User;
use FrankProjects\UltimateWarfare\Repository\PlayerRepository;
use RuntimeException;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;
use Throwable;

final class LoginController extends BaseGameController
{
    public function login(RequestStack $requestStack): RedirectResponse
    {
        try {
            $user = $this->getLoginUser();
        } catch (Throwable $e) {
            $this->addFlash('error', $e->getMessage());
            return $this->redirectToRoute('Site/Login');
        }

        $players = $user->getPlayers();

        if ($players->count() === 0 || ($players->first() instanceof Player) === false) {
            return $this->redirectToRoute('Game/Story/Chapter1', ['page' => 1]);
        }
        $player = $players->first();
        $requestStack->getSession()->set('playerId', $player->getId());
        return $this->redirectToRoute('Game/Headquarter');
    }

    public function loginForPlayer(RequestStack $requestStack, int $playerId, PlayerRepository $playerRepository): RedirectResponse
    {
        try {
            $user = $this->getLoginUser();
        } catch (Throwable $e) {
            $this->addFlash('error', $e->getMessage());
            return $this->redirectToRoute('Site/Login');
        }

        $player = $playerRepository->find($playerId);

        if ($player === null) {
            return $this->redirectToRoute('Game/Login');
        }

        if ($player->getUser()->getId() != $user->getId()) {
            return $this->redirectToRoute('Game/Login');
        }

        $requestStack->getSession()->set('playerId', $player->getId());
        return $this->redirectToRoute('Game/Headquarter');
    }

    private function getLoginUser(): User
    {
        $user = $this->getUser();
        if (!is_object($user) || !$user instanceof User) {
            throw new RuntimeException('You are not logged in!');
        }

        if ($user->isEnabled() !== true) {
            throw new RuntimeException('Your account is not enabled!');
        }

        if ($user->getActive() !== true) {
            throw new RuntimeException('You are banned!');
        }

        return $user;
    }
}