/**
  * Delete user squad
  * @return ApiResponse
  */
 public function delete()
 {
     $squadId = $this->params('id', 0);
     $squadRepository = $this->getEntityManager()->getRepository('Frontend\\Squads\\Entity\\Squad');
     $userSquad = $squadRepository->findOneBy(array('user' => $this->getApiIdentity(), 'id' => $squadId));
     if (!$userSquad) {
         $errorResponse = new ApiResponse();
         if ($squadId <= 0) {
             $errorResponse->setStatusCode(400);
             $errorResponse->setErrorMessage('missing parameter id');
         } else {
             $errorResponse->setStatusCode(404);
             $errorResponse->setErrorMessage('squad not found');
         }
         return $errorResponse;
     }
     $this->getEntityManager()->remove($userSquad);
     $this->getEntityManager()->flush();
     return new ApiResponse(null, null, 200);
 }
 /**
  * On API Dispatch
  *
  * @param MvcEvent $e
  * @return ApiResponse|mixed
  * @throws \Zend\View\Exception\DomainException
  * @throws \Exception
  */
 public function onDispatch(MvcEvent $e)
 {
     $apiResponse = new ApiResponse();
     /** @var GenericHeader $apiRequestKey */
     if ($apiRequestKey = $this->requestApiKey()) {
         /** @var Key $key */
         $apiKeyRepository = $this->getEntityManager()->getRepository('Frontend\\Api\\Entity\\Key');
         if ($key = $apiKeyRepository->findOneBy(array('key' => $apiRequestKey))) {
             // check for limit reset
             $key->checkForRateReset();
             // show key limit usage
             $apiResponse->getHeaders()->addHeaders(array('X-RateLimit-Limit' => $key->getLimit(), 'X-RateLimit-Remaining' => $key->getRemainingRate(), 'X-RateLimit-Reset' => $key->getNextRateReset()->getTimestamp()));
             // check if key banned
             if (!$key->getStatus()) {
                 $apiResponse->setErrorMessage('API key banned');
                 $apiResponse->setStatusCode(403);
                 return $apiResponse;
             }
             // check key limit
             if ($key->isLimitExceeded()) {
                 $apiResponse->setErrorMessage('API limit exceeded');
                 $apiResponse->setStatusCode(429);
                 return $apiResponse;
             }
             // set the current api user
             $this->setApiIdentity($key->getUser());
             // all fine get work done
             $routeMatch = $e->getRouteMatch();
             if (!$routeMatch) {
                 throw new DomainException('Missing route matches; unsure how to retrieve action');
             }
             $action = $routeMatch->getParam('action', array('not-found'));
             $requestMethod = $_SERVER['REQUEST_METHOD'];
             if (is_string($action)) {
                 $apiResponse->setStatusCode(400);
                 switch ($action) {
                     case 'selectVersion':
                         $apiResponse->setErrorMessage('please specific api version /api/v[versionNumber]');
                         break;
                     case 'selectResource':
                         $apiResponse->setErrorMessage('no url resource path found');
                 }
                 return $apiResponse;
             }
             // fix for inject template listener
             $actionRequest = isset($action[$requestMethod]) ? $action[$requestMethod] : false;
             $routeMatch->setParam('action', $action);
             // add allow request methods
             $apiResponse->getHeaders()->addHeaders(array('Allow' => implode(',', array_keys($action)), 'Content-Type' => 'application/json'));
             if ($requestMethod == 'POST' || $requestMethod == 'PUT') {
                 $result = $this->validatePostData();
                 if ($result !== true) {
                     $apiResponse->setErrorMessage($result);
                     $apiResponse->setStatusCode(400);
                     return $apiResponse;
                 }
             }
             if (!$actionRequest || !method_exists($this, $actionRequest)) {
                 // invalid request
                 $apiResponse->setErrorMessage('method not supported');
                 $apiResponse->setStatusCode(501);
                 return $apiResponse;
             }
             /** @var ApiResponse $actionResponse */
             $actionResponse = $this->{$actionRequest}();
             if ($actionResponse instanceof ApiResponse) {
                 if (!$actionResponse->hasError()) {
                     // update successfully api request to key
                     $key->update();
                     $this->getEntityManager()->flush();
                 }
                 $actionResponse->getHeaders()->addHeaders($apiResponse->getHeaders());
                 return $actionResponse;
             } else {
                 throw new \Exception('Invalid API response');
             }
         } else {
             $apiResponse->setErrorMessage('api key invalid');
             $apiResponse->setStatusCode(403);
             return $apiResponse;
         }
     }
     // something is invalid with the key error
     $apiResponse->setErrorMessage('api key not found');
     $apiResponse->setStatusCode(401);
     return $apiResponse;
 }