/** * Processes an action on raffle collection. * * @param null|array $request * @throws Exception * @return array */ private function processRaffleAction($request = null) { if ($request === null) { $request = $this->request; } $out = array(); $out['subtitle'] = _('(Listing raffles)'); $data = null; //check login if (!isset($this->access_token)) { throw new Exception('Unauthenticated request.', 401); } $this->adminDAO = isset($this->adminDAO) ? $this->adminDAO : new AdminDAO($this->client_id, $this->client_secret, $this->admin_redirect_uri, null, null, null, null, null, $this->debug); $authResponse = $this->adminDAO->authenticate(null, null, $this->adminDAO->getAccessToken()); if (isset($authResponse['authUrl'])) { throw new Exception("Auth error: Invalid admin access token.", 500); } $adminClient = $this->adminDAO->getClient(); $tableIds = $this->adminDAO->getTableIds(); $adminId = $this->adminDAO->getAdminId(); $this->user = isset($this->user) ? $this->user : new User($this->client_id, $this->client_secret, $this->redirect_uri, $this->access_token, null, null, null, $this->debug); $authResponse = $this->user->authenticate(null, null, $this->access_token); if (isset($authResponse['authUrl'])) { if (!$this->webapp) { throw new Exception("Authentication required (token found but expired/revoked).", 401); } else { return $this->processUserAction(array('collection' => 'user', 'action' => 'logout')); } } $userId = $this->user->requestUserId(); $isAdmin = $adminId === $userId ? true : false; $this->raffleDAO = isset($this->raffleDAO) ? $this->raffleDAO : new RaffleDAO($tableIds, null, $adminClient, $this->debug); $this->raffle = isset($this->raffle) ? $this->raffle : new Raffle($this->raffleDAO, $userId, $isAdmin); $request['raffleid'] = isset($request['raffleid']) ? $request['raffleid'] : (isset($request['resource']) ? trim($request['resource'], '/') : null); switch (isset($request['action']) ? $request['action'] : '') { case 'list': $filterArray = $this->getListRaffleFilterArray($userId, $isAdmin, $request); $data = $this->raffle->getList($filterArray); break; case 'create': if (!isset($request['description'])) { throw new Exception('Must specify a raffle description', 400); } $data = $this->raffle->create($request['description'], $userId); break; case 'delete': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to delete', 400); } $data = $this->raffle->delete($request['raffleid']); break; case 'join': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to join', 400); } $data = $this->raffle->join($request['raffleid'], isset($request['comment']) ? $request['comment'] : '', $userId); break; case 'leave': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to leave', 400); } $data = $this->raffle->leave($request['raffleid'], $userId); break; case 'check': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to check', 400); } $data = $this->raffle->check($request['raffleid']); break; case 'open': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to open', 400); } $data = $this->raffle->updateStatus($request['raffleid'], 'open'); break; case 'close': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to close', 400); } $data = $this->raffle->updateStatus($request['raffleid'], 'closed'); break; case 'raffle': if (!isset($request['raffleid']) || !uuid::is_valid($request['raffleid'])) { throw new Exception('Must specify a raffleid to raffle', 400); } $data = $this->raffle->raffle($request['raffleid'], isset($request['limit']) && intval($request['limit']) > 0 ? intval($request['limit']) : null); break; default: throw new Exception('The request does not contain a valid action.', 404); } $out['data'] = $data; return $out; }