serviceLocator = $serviceLocator; \Utility\Registry::setEntityManager( $this->serviceLocator->get('doctrine.entitymanager.orm_default') ); } /** * Set authentication session. * @param unknown $token */ protected function setAuth($token) { \Utility\Registry::setSession($token); $this->authenticated = true; $this->authDetails = \Utility\Registry::getAuthData(); } /** * Authenticate user. * @param string $email * @param string $pin * @return struct */ public function login($email, $pin) { $input = new \Workspace\Utility\ServiceInput('ParamSet', array( 'Login' => array( 'email' => $email, 'pin' => $pin ) )); $serviceInput = new \Workspace\Utility\ServiceInput('ServiceInput', array( 'data' => $input->pack() )); $profileService = $this->serviceLocator->get('User.Service.Profile'); $response = $profileService->deviceLogin($serviceInput->pack()); return array( 'Meta' => array_merge( array('Task' => __METHOD__), $response['Meta'] ), 'Data' => $response['Data'] ); } /** * Claim a job item from queue. * @param string $authToken * @param string $datasetName * @param integer $id * @return struct */ public function claimJob($authToken, $datasetName, $id) { #-> Session. if (!$this->setAuth($authToken)) { return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Exception', 'StatusReason' => 'Invalid session token.' ), 'Data' => array() ); } switch ($datasetName) { case 'valuations': $entityName = '\Stock\Entity\Valuation'; break; default: return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Exception', 'StatusReason' => 'Invalid dataset requested.' ), 'Data' => array() ); break; } $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); $record = $em->getRepository($entityName) ->find($id); if (is_null($record) || 1 != $record->queueStatus) { return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Fail', 'StatusReason' => 'Job not available.', 'DatasetName' => $datasetName ), 'Data' => $record->toArray() ); } $record->queueStatus = 2; $em->flush(); return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Success', 'DatasetName' => $datasetName ), 'Data' => $record->toArray() ); } /** * Retrieve a dataset. * @param string $authToken * @param string $datasetName * @return struct */ public function getDataset($authToken, $datasetName) { #-> Session. if (!$this->setAuth($authToken)) { return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Exception', 'StatusReason' => 'Invalid session token.' ), 'Data' => array() ); } $datasetName = $this->request['datasetName']; switch ($datasetName) { #-> Location case 'countries': $entityName = '\Location\Entity\Country'; break; case 'regions': $entityName = '\Location\Entity\Region'; break; case 'towns': $entityName = '\Location\Entity\Town'; break; #-> Stock case 'valuations': $entityName = '\Stock\Entity\Valuation'; break; case 'accessories': $entityName = '\Stock\Entity\Accessory'; break; case 'upholstery': $entityName = '\Stock\Entity\Upholstery'; break; case 'condition': $entityName = '\Stock\Entity\Condition'; break; case 'exteriorColours': $entityName = '\Stock\Entity\ExteriorColour'; break; case 'interiorColours': $entityName = '\Stock\Entity\InteriorColour'; break; case 'fuelTypes': $entityName = '\Stock\Entity\FuelType'; break; case 'transmissionTypes': $entityName = '\Stock\Entity\TransmissionType'; break; case 'natis': $entityName = '\Stock\Entity\Natis'; break; case 'papers': $entityName = '\Stock\Entity\Paper'; break; case 'years': $entityName = '\Stock\Entity\Year'; break; case 'categories': $entityName = '\Stock\Entity\Category'; break; case 'makes': $entityName = '\Stock\Entity\Make'; break; case 'models': $entityName = '\Stock\Entity\Model'; break; case 'types': $entityName = '\Stock\Entity\Type'; break; default: return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Fail', 'StatusReason' => 'Unknown dataset requested.', 'DatasetName' => $datasetName ), 'Data' => array() ); break; } $em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); if ('Build' == $entityName::PULL_SYNCH_STRATEGY) { $timeStart = 0; $timeEnd = time(); $numPages = 1; $page = 1; $timestamp = time(); $filter = 'WHERE 1 = 1 '; $filter .= defined($entityName . '::JOB_QUEUE') ? 'AND a.queueStatus = 1' : ''; $filter .= $entityName::ARCHIVE ? 'AND a.archived = 0' : ''; $query = $em->createQuery( "SELECT a FROM $entityName a $filter ORDER BY a.id ASC" ); } else { $page = isset($this->request['page']) ? (int) $this->request['page'] : 1; $timeStart = isset($this->request['timeStart']) ? (int) $this->request['timeStart'] : 0; $timeEnd = isset($this->request['timeEnd']) ? (int) $this->request['timeEnd'] : time(); $recs = 10; $filter = ''; $filter .= defined($entityName . '::JOB_QUEUE') ? 'AND a.queueStatus = 1' : ''; $filter .= $entityName::ARCHIVE ? 'AND a.archived = 0' : ''; $query = $em->createQuery( "SELECT a FROM $entityName a " . "WHERE a.archived = :archived" . " $filter" . " AND (a.created BETWEEN :timeStart AND :timeEnd" . " OR a.updated BETWEEN :timeStart AND :timeEnd)" . " ORDER BY a.id ASC" ) ->setParameter('archived', false) ->setParameter('timeStart', date(\Utility\Definitions\Locale::getDateTimeFormat(), $timeStart)) ->setParameter('timeEnd', date(\Utility\Definitions\Locale::getDateTimeFormat(), $timeEnd)); $numRecsRes = $em->createQuery( "SELECT COUNT(a.id) AS total " . "FROM $entityName a " . "WHERE a.archived = :archived" . " $filter" . " AND (a.created BETWEEN :timeStart AND :timeEnd" . " OR a.updated BETWEEN :timeStart AND :timeEnd)" ) ->setParameter('archived', false) ->setParameter('timeStart', date(\Utility\Definitions\Locale::getDateTimeFormat(), $timeStart)) ->setParameter('timeEnd', date(\Utility\Definitions\Locale::getDateTimeFormat(), $timeEnd)) ->getSingleResult(); $numRecs = $numRecsRes['total']; error_log("num records: $numRecs"); $numPages = (0 < $numRecs) ? ceil($numRecs / $recs) : 0; $query->setFirstResult(($page -1) * $recs) ->setMaxResults($recs); } $dataset = $query->getResult(); if (defined($entityName . '::JOB_QUEUE')) { foreach ($dataset as $rowId => $record) { $dataset[$rowId] = $record->toQueueArray(); } } else { foreach ($dataset as $rowId => $record) { $dataset[$rowId] = $record->toSynchArray(); } } return array( 'Meta' => array( 'Task' => __METHOD__, 'Status' => 'Success', 'DatasetName' => $datasetName, 'Strategy' => $entityName::PULL_SYNCH_STRATEGY, 'DataPages' => $numPages, 'Page' => $page, 'StartTime' => $timeStart, 'EndTime' => $timeEnd ), 'Data' => $dataset ); } }