_eh = EH::getInstance(); } public function connect(Application $app) { // creates a new controller based on the default route $controllers = $app['controllers_factory']; $controllers->get('/', function (Application $app) { return "OK"; }); $controllers->get('/levels', function (Application $app) { $levels = $this->_eh->getEm()->getRepository(Models\Level::class)->findAll(); return $app['serializer']->serialize($levels, 'json'); }); $controllers->get('/emotions', function (Application $app) { $levels = $this->_eh->getEm()->getRepository(Models\Emotion::class)->findAll(); return $app['serializer']->serialize($levels, 'json'); }); $controllers->get('/me', function (Application $app) { $token = $app['security.token_storage']->getToken(); $user = $token->getUser(); return $app['serializer']->serialize($user, 'json'); }); $controllers->get('/games/{gameId}', function(Request $request, Application $app) { $game = $request->attributes->get('game'); if(empty($game)) { return new CustomJsonResponse(['message' => 'Game not found'], function($data) use ($app){return $app['serializer']->serialize($data, 'json');}, 404); } return new CustomJsonResponse($game, $app['serializer.json'], 200); }) ->bind('game') ->convert('game', function($game, Request $request) use ($app){ return $app['entity.manager']->getRepository(Models\Game::class)->find($request->attributes->get('gameId'));}); /** * Expects a full game + hits in the request */ $controllers->post('/games', function (Request $request, Application $app) { $data = json_decode($request->getContent(), true); $token = $app['security.token_storage']->getToken(); $user = $token->getUser(); if($data == null || !isSet($data['lvl_id'])) { return new JsonResponse(['success' => false, 'message' => "Invalid JSON body"], 400); } $level = $this->_eh->getEm()->getRepository(Models\Level::class)->find($data['lvl_id']); if(empty($level)) { return new JsonResponse(['success' => false, 'message' => "Invalid level"], 400); } $game = new Models\Game(); $game->setUser($user); $game->setLevel($level); $game->setOriginalGameAt(new \DateTime($data['time'])); $map_hits = []; foreach($data['hits'] as $data_hit) { $hit = new Models\Hit(); $target = $this->_eh->getEm()->getRepository(Models\Target::class)->findOneBy(['position' => $data_hit['target_index'], 'level' => $level]); if(empty($target)){ return new JsonResponse(['success' => false, 'message' => "Invalid target for hit"], 400); } $hit->setTarget($target); $hit->setScore($data_hit['score']); // attributes $hit->getAttributes()->setGlasses($data_hit['glasses']); foreach($hit->getAttributes()::$ATTRIBUTES as $attribute) { $hit->getAttributes()->setAttribute($attribute, $data_hit[$attribute]); } // emotions foreach($hit->getEmotions()::$EMOTIONS as $emotion) { $hit->getEmotions()->setEmotion($emotion, $data_hit['emotions'][$emotion]); } //expressions foreach($hit->getExpressions()::$EXPRESSIONS as $expression) { $hit->getExpressions()->setExpression($expression, $data_hit['expressions'][$expression]); } //points foreach(range(0, 33) as $i) { $hit->setPoint($i, $data_hit['points']["$i"]['x'], $data_hit['points']["$i"]['y']); } // set game appends hit to game $hit->setGame($game); $map_hits[$data_hit['id']] = $hit; } $this->_eh->getEm()->persist($game); $this->_eh->getEm()->flush(); $hits_array = []; foreach($map_hits as $hit_player_id => $hit) { $hits_array[$hit_player_id] = $hit->getId(); } return new JsonResponse(['success' => true, 'id' => $game->getId(), 'hits' => $hits_array], 200); }); return $controllers; } }