src/Controller/KoehandelController.php line 17

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\Routing\Annotation\Route;
  5. use Symfony\Component\HttpFoundation\Request;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use App\Entity\Game;
  8. class KoehandelController extends AbstractController
  9. {
  10.     /**
  11.      * @Route("/", methods={"GET"}, name="index")
  12.      */
  13.     public function index() {
  14.         return $this->render('koehandel/index.html.twig');
  15.     }
  16.     /**
  17.      * Login a user by name. 
  18.      * 
  19.      * @Route("/login", methods={"POST"}, name="login")
  20.      */
  21.     public function login(Request $request) {
  22.         $data json_decode($request->getContent(), true);
  23.         $userName = isset($data['userName']) ? $data['userName'] : false;
  24.         $result in_array(strtolower($userName), $this->users());
  25.         return $this->json([
  26.             'result' => $result,
  27.             'userName' => $userName
  28.         ]);
  29.     }
  30.     /**
  31.      * Returns the gamestate.
  32.      * 
  33.      * @Route("/gamestate", methods={"GET"}, name="gamestate")
  34.      */
  35.     public function gamestate(Request $request) {
  36.         // We currently only support 1 game, with id 1
  37.         // Find its database record
  38.         $game $this->getDoctrine()
  39.             ->getRepository(Game::class)
  40.             ->find(1);
  41.         // If there is no database record yet, create it
  42.         if (!$game) {
  43.             $game = new Game();
  44.             $game->setTurn('jantien');
  45.             $history = [];
  46.             array_push($history, ['user' => 'menno''move' => '-']);
  47.             array_push($history, ['user' => 'silvan''move' => '-']);
  48.             array_push($history, ['user' => 'jantien''move' => '-']);
  49.             $game->setHistory(json_encode($history));
  50.             $entityManager $this->getDoctrine()->getManager();
  51.             $entityManager->persist($game);
  52.             $entityManager->flush();
  53.         }
  54.         // Return gamestate
  55.         $gamestate = [
  56.             'turn' => $game->getTurn(),
  57.             'history' => json_decode($game->getHistory(), true)
  58.         ];
  59.         return $this->json([
  60.             'gamestate' => $gamestate
  61.         ]);
  62.     }
  63.     /**
  64.      * A user submits a move. 
  65.      * 
  66.      * @Route("/move", methods={"POST"}, name="move")
  67.      */
  68.     public function move(Request $request) {
  69.         try {
  70.             // Get input params
  71.             $data json_decode($request->getContent(), true);
  72.             $userName = isset($data['userName']) ? strtolower($data['userName']) : false;
  73.             $move = isset($data['move']) ? $data['move'] : false;
  74.             // Validate input params
  75.             if (!$this->validUser($userName)) {
  76.                 throw new \Exception('Invalid user');
  77.             }
  78.             if (!$this->validMove($move)) {
  79.                 throw new \Exception('Invalid move');
  80.             }
  81.             // Get current game data from database
  82.             $game $this->getDoctrine()
  83.                 ->getRepository(Game::class)
  84.                 ->find(1);
  85.             // Verify that it is this user's turn
  86.             if($game->getTurn() != $userName) {
  87.                 throw new \Exception("Je bent niet aan de beurt.");
  88.             }
  89.             // Handle the move
  90.             // Remove the last entry from the game history and 
  91.             // insert this move as the first entry
  92.             $history json_decode($game->getHistory(), true);
  93.             array_pop($history);
  94.             array_unshift($history, ['user' => $userName'move' => $move]);
  95.             // Determine wich user has the next turn
  96.             $turn $this->nextTurn($game->getTurn());
  97.             $game->setTurn($turn);
  98.             // Store game data to the database
  99.             $game->setHistory(json_encode($history));
  100.             $entityManager $this->getDoctrine()->getManager();
  101.             $entityManager->persist($game);
  102.             $entityManager->flush();
  103.             // Return success
  104.             return $this->json([
  105.                 'result' => true
  106.             ]);
  107.         } catch (\Exception $e) {
  108.             // Oops, something is wrong.
  109.             return $this->json([
  110.                 'result' => false,
  111.                 'message' => $e->getMessage()
  112.             ]);
  113.         }
  114.     }
  115.     /**
  116.      * Return the users. 
  117.      */
  118.     protected function users() {
  119.         return ['jantien''silvan''menno'];
  120.     }
  121.     /**
  122.      * Return the moves. 
  123.      */
  124.     protected function moves() {
  125.         return ['veilen''koehandel'];
  126.     }
  127.     /**
  128.      * Return whether a user is valid. 
  129.      */
  130.     protected function validUser($user) {
  131.         return in_array(strtolower($user), $this->users());
  132.     }
  133.     /**
  134.      * Return whether a move is valid. 
  135.      */
  136.     protected function validMove($move) {
  137.         return in_array($move$this->moves());
  138.     }
  139.     /**
  140.      * Given a player whose turn it is, who is the next player? 
  141.      */
  142.     protected function nextTurn($turn) {
  143.         switch ($turn) {
  144.             case 'jantien':
  145.                 return 'silvan';
  146.                 break;
  147.             case 'silvan':
  148.                 return 'menno';
  149.                 break;
  150.             case 'menno':
  151.                 return 'jantien';
  152.                 break;
  153.         }
  154.     }
  155. }