/**
  * {@inheritDoc}
  */
 protected function _executeCreateQuery(Query $query, array $options = [])
 {
     $postArguments = ['status' => $query->set()['text']];
     /* @var Response $response */
     $response = $this->driver()->client()->post($this->_baseUrl() . '/update.json', $postArguments);
     $this->_checkResponse($response);
     return $this->_transformResource($query->endpoint(), $response->json);
 }
Exemplo n.º 2
0
 /**
  * Logs a query to the specified logger
  *
  * @param \Muffin\Webservice\Query $query The query to log
  * @param \Psr\Log\LoggerInterface $logger The logger instance to use
  *
  * @return void
  */
 protected function _logQuery(Query $query, LoggerInterface $logger)
 {
     if (!$this->driver()->logQueries()) {
         return;
     }
     $logger->debug($query->endpoint(), ['params' => $query->where()]);
 }
 /**
  * {@inheritDoc}
  */
 protected function _executeUpdateQuery(Query $query, array $options = [])
 {
     if (!isset($query->where()['id']) || is_array($query->where()['id'])) {
         return false;
     }
     $parameters = $query->set();
     $parameters[$query->endpoint()->primaryKey()] = $query->where()['id'];
     $response = $this->driver()->client()->post($this->_baseUrl() . '/update.json', $parameters);
     if (!$response->isOk()) {
         throw new Exception($response->json['errors'][0]['message']);
     }
     return $this->_transformResource($query->endpoint(), $response->json);
 }
 /**
  * {@inheritDoc}
  */
 protected function _executeReadQuery(Query $query, array $options = [])
 {
     $url = $this->getBaseUrl();
     $requestParameters = [];
     $requestOptions = [];
     // Set API key if necessary
     if ($this->driver()->config('api_key')) {
         $requestParameters['key'] = $this->driver()->config('api_key');
     }
     // Single resource
     if (isset($query->clause('where')['id']) && !is_array($query->clause('where')['id'])) {
         $url .= '/' . $query->clause('where')['id'];
     } else {
         // Loop over conditions and apply them to the query
         foreach ($query->clause('where') as $field => $value) {
             $column = $query->endpoint()->schema()->column($field);
             // Custom fields should use cf_x as parameter
             if ($column['custom_field_id']) {
                 $field = 'cf_' . $column['custom_field_id'];
             }
             $requestParameters[$field] = $value;
         }
     }
     $url .= '.json';
     $orderClauses = [];
     // Turn ORM order clauses in a query parameter
     foreach ($query->clause('order') as $field => $value) {
         if (is_int($field)) {
             $field = $value;
         }
         if (!in_array($value, ['ASC', 'DESC'])) {
             $value = null;
         }
         if (!$value) {
             $orderClauses[] = $field;
             continue;
         }
         // Replace ASC with asc and DESC with desc
         $orderClauses[] = $field . ':' . str_replace(['ASC', 'DESC'], ['asc', 'desc'], $value);
     }
     if (!empty($orderClauses)) {
         $requestParameters['sort'] = implode($orderClauses, ',');
     }
     if ($query->clause('limit')) {
         $requestParameters['limit'] = $query->clause('limit');
     }
     if ($query->clause('offset')) {
         $requestParameters['offset'] = $query->clause('offset');
     }
     // Include details using the API
     if (isset($query->getOptions()['include'])) {
         $include = $query->getOptions()['include'];
         // If the value isn't a array, for example a string put it in a string
         if (!is_array($include)) {
             $include = [$include];
         }
         $requestParameters['include'] = implode(',', $include);
     }
     // Switch user if the 'user' options has been given
     if (isset($query->getOptions()['user'])) {
         $requestOptions['headers']['X-Redmine-Switch-User'] = $query->getOptions()['user'];
     }
     /* @var \Cake\Network\Http\Response $response */
     $response = $this->driver()->client()->get($url, $requestParameters, $requestOptions);
     if (!$response->isOk()) {
         throw new UnexpectedStatusCodeException([$response->statusCode()]);
     }
     // Single resource
     if (isset($query->clause('where')['id'])) {
         // Turn result into resources
         $resource = $this->_transformResource($response->json[Inflector::singularize($this->endpoint())], $query->endpoint());
         return new ResultSet([$resource], 1);
     }
     if (!isset($response->json[$this->endpoint()])) {
         throw new MissingResultsException([$url]);
     }
     $results = $response->json[$this->endpoint()];
     $total = count($results);
     // Set the amount if results to total_count if it has been provided by the API
     if (isset($response->json['total_count'])) {
         $total = $response->json['total_count'];
     }
     // Turn results into resources
     $resources = $this->_transformResults($results, $query->endpoint());
     return new ResultSet($resources, $total);
 }