api.emotionhero.com/src/Api/ScoreControllerProvider.php

144 lines
5.2 KiB
PHP
Raw Normal View History

2016-09-01 12:15:17 +02:00
<?php
namespace EmotionHero\Api;
use EmotionHero\Application as EH;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;
use Silex\Api\ControllerProviderInterface;
use EmotionHero\Models;
class ScoreControllerProvider implements ControllerProviderInterface
{
/** @var EH */
protected $_eh;
public function __construct()
{
$this->_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');
});
2016-09-04 12:54:48 +02:00
$controllers->get('/games/{gameId}', function(Request $request, Application $app) {
$game = $request->attributes->get('game');
2016-09-04 13:36:41 +02:00
if(empty($game)) {
2016-09-04 14:01:30 +02:00
return new CustomJsonResponse(['message' => 'Game not found'], function($data) use ($app){return $app['serializer']->serialize($data, 'json');}, 404);
2016-09-04 13:36:41 +02:00
}
2016-09-04 14:01:30 +02:00
2016-09-04 14:03:48 +02:00
return new CustomJsonResponse($game, $app['serializer.json'], 200);
2016-09-04 12:54:48 +02:00
})
->bind('game')
->convert('game', function($game, Request $request) use ($app){ return $app['entity.manager']->getRepository(Models\Game::class)->find($request->attributes->get('gameId'));});
2016-09-04 00:12:00 +02:00
/**
* Expects a full game + hits in the request
*/
2016-09-04 12:54:48 +02:00
$controllers->post('/games', function (Request $request, Application $app) {
2016-09-04 17:53:50 +02:00
2016-09-04 00:12:00 +02:00
$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);
}
2016-09-04 00:25:38 +02:00
$game = new Models\Game();
2016-09-04 00:12:00 +02:00
$game->setUser($user);
$game->setLevel($level);
2016-09-04 00:25:38 +02:00
$game->setOriginalGameAt(new \DateTime($data['time']));
$map_hits = [];
2016-09-04 00:12:00 +02:00
foreach($data['hits'] as $data_hit) {
2016-09-04 00:25:38 +02:00
$hit = new Models\Hit();
$target = $this->_eh->getEm()->getRepository(Models\Target::class)->findOneBy(['position' => $data_hit['target_index'], 'level' => $level]);
2016-09-04 00:12:00 +02:00
if(empty($target)){
return new JsonResponse(['success' => false, 'message' => "Invalid target for hit"], 400);
}
2016-09-04 00:55:36 +02:00
$hit->setTarget($target);
$hit->setScore($data_hit['score']);
2016-09-04 00:12:00 +02:00
// attributes
2016-09-04 14:51:10 +02:00
$hit->getAttributes()->setGlasses($data_hit['glasses']);
2016-09-04 14:54:47 +02:00
foreach($hit->getAttributes()::$ATTRIBUTES as $attribute) {
$hit->getAttributes()->setAttribute($attribute, $data_hit[$attribute]);
2016-09-04 00:12:00 +02:00
}
// emotions
2016-09-04 14:54:47 +02:00
foreach($hit->getEmotions()::$EMOTIONS as $emotion) {
$hit->getEmotions()->setEmotion($emotion, $data_hit['emotions'][$emotion]);
2016-09-04 00:12:00 +02:00
}
//expressions
2016-09-04 14:54:47 +02:00
foreach($hit->getExpressions()::$EXPRESSIONS as $expression) {
$hit->getExpressions()->setExpression($expression, $data_hit['expressions'][$expression]);
2016-09-04 00:12:00 +02:00
}
//points
foreach(range(0, 33) as $i) {
2016-09-04 16:48:23 +02:00
$hit->getPoints()->setPoint($i, $data_hit['points']["$i"]['x'], $data_hit['points']["$i"]['y']);
2016-09-04 00:12:00 +02:00
}
2016-09-04 00:25:38 +02:00
2016-09-04 12:54:48 +02:00
2016-09-04 01:00:08 +02:00
// set game appends hit to game
$hit->setGame($game);
2016-09-04 00:25:38 +02:00
$map_hits[$data_hit['id']] = $hit;
2016-09-04 00:12:00 +02:00
}
$this->_eh->getEm()->persist($game);
$this->_eh->getEm()->flush();
2016-09-04 00:25:38 +02:00
$hits_array = [];
foreach($map_hits as $hit_player_id => $hit) {
$hits_array[$hit_player_id] = $hit->getId();
}
2016-09-04 00:12:00 +02:00
2016-09-10 02:30:28 +02:00
$achievement_ids = [];
foreach($game->getAchievements() as $achievement) {
$achievement_ids[] = $achievement->getId();
}
$achievement_ids = [2]; // override for test purpose
return new JsonResponse(['success' => true, 'id' => $game->getId(), 'hits' => $hits_array, 'achievements' => $achievement_ids], 200);
2016-09-01 12:15:17 +02:00
});
return $controllers;
}
2016-09-04 17:53:50 +02:00
}