/**
  * @param Game $game
  * @param string $eventType
  */
 private function createEvent(Game $game, $eventType)
 {
     $event = new Event();
     $event->setGame($game)->setPlayer($game->getPlayerNumber())->setType($eventType);
     $this->entityManager->persist($event);
 }
 /**
  * Example response:<pre>
  *  {"timestamp":"2016-11-11T16:21:16+0000"} # for chat
  *  {"result":"miss"} # for shot</pre>
  *
  * @ApiDoc(
  *  resource=true,
  *  description="Create new event",
  *  section="Event",
  *  statusCodes={
  *     201="Event created",
  *     400="Incorrect parameter provided",
  *     404="Game not found",
  *     409="Action not allow due to game flow restrictions"
  *  }
  * )
  *
  * @Tag(expression="'game-' ~ game.getId() ~ 'events'")
  * @Security("game.belongsToUser(user)")
  * @RequestParam(
  *     name="type",
  *     requirements=@Assert\Choice(callback = {"AppBundle\Entity\Event", "getTypes"})
  * )
  * @RequestParam(name="value", requirements=".*\S.*", allowBlank=false, default=true)
  *
  * @param ParamFetcher $paramFetcher
  * @param Game $game
  * @return Response
  */
 public function postEventAction(ParamFetcher $paramFetcher, Game $game)
 {
     $event = new Event();
     $event->setGame($game)->setPlayer($game->getPlayerNumber())->setType($paramFetcher->get('type'))->setValue($paramFetcher->get('value'));
     $data = null;
     switch ($event->getType()) {
         case Event::TYPE_CHAT:
             $event->applyCurrentTimestamp();
             $data = ['timestamp' => $event->getTimestamp()];
             break;
         case Event::TYPE_SHOT:
             $shotResult = $this->battleManager->getShotResult($event);
             $event->setValue([$event->getValue(), $shotResult]);
             $data = ['result' => $shotResult];
             break;
     }
     $this->entityManager->persist($event);
     $this->entityManager->flush();
     $view = $this->routeRedirectView('api_v1_get_game_event', ['game' => $game->getId(), 'event' => $event->getId()])->setData($data);
     return $this->handleView($view);
 }
 /**
  * @return Game
  */
 public function testAddEventShot()
 {
     $client = static::createClient();
     $client->enableProfiler();
     $user1 = $this->getUser(3);
     $user2 = $this->getUser(4);
     $game = new Game();
     $game->setLoggedUser($user1)->setUser1($user1)->setUser2($user2)->setUser1Ships(['A1', 'C2', 'D2', 'F2', 'H2', 'J2', 'F5', 'F6', 'I6', 'J6', 'A7', 'B7', 'C7', 'F7', 'F8', 'I9', 'J9', 'E10', 'F10', 'G10'])->setUser2Ships(['A10', 'C2', 'D2', 'F2', 'H2', 'J2', 'F5', 'F6', 'I6', 'J6', 'A7', 'B7', 'C7', 'F7', 'F8', 'I9', 'J9', 'E10', 'F10', 'G10']);
     // starting game
     $event1 = new Event();
     $event1->setGame($game)->setPlayer(1)->setType(Event::TYPE_START_GAME)->setValue(true);
     $event2 = new Event();
     $event2->setGame($game)->setPlayer(2)->setType(Event::TYPE_START_GAME)->setValue(true);
     $entityManager = $this->getEntityManager();
     $entityManager->persist($game);
     $entityManager->persist($event1);
     $entityManager->persist($event2);
     $entityManager->flush();
     $apiKey = $this->getUserApiKey(3);
     $body = ['type' => Event::TYPE_SHOT, 'value' => $game->getUser2Ships()[0]];
     $client->request('POST', sprintf('/v1/games/%d/events', $game->getId()), [], [], ['CONTENT_TYPE' => 'application/json', 'HTTP_ACCEPT' => 'application/json', 'HTTP_AUTHORIZATION' => 'Bearer ' . $apiKey], json_encode($body));
     $response = $client->getResponse();
     $jsonResponse = json_decode($response->getContent(), true);
     $this->validateAddEvent($response);
     /** @var DoctrineDataCollector $doctrineDataCollector */
     $doctrineDataCollector = $client->getProfile()->getCollector('db');
     // SELECT user, SELECT game, SELECT event (getAttackerShots), SELECT event (has game started), SELECT event (whoseTurn), START TRANSACTION, INSERT event, COMMIT
     $this->assertEquals(8, $doctrineDataCollector->getQueryCount());
     $this->assertEquals(['result' => BattleManager::SHOT_RESULT_SUNK], $jsonResponse, $response);
     return $game;
 }