/** * @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; }