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