7 use Symfony\Component\DependencyInjection\ContainerInterface;
8 use Symfony\Component\HttpFoundation\RequestStack;
9 use Drupal\Core\Database\Connection;
10 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
11 use Drupal\dkan_common\JsonResponseTrait;
20 class Api implements ContainerInjectionInterface {
21 use JsonResponseTrait;
26 private $requestStack;
27 private $resourceServiceFactory;
28 private $databaseTableFactory;
37 public static function create(ContainerInterface $container) {
39 $container->get(
'dkan_sql_endpoint.service'),
40 $container->get(
'database'),
41 $container->get(
'dkan_datastore.service.factory.resource'),
42 $container->get(
'request_stack'),
43 $container->get(
'dkan_datastore.database_table_factory'),
44 $container->get(
'plugin.manager.dkan_common.data_modifier')
55 RequestStack $requestStack,
59 $this->service = $service;
60 $this->database = $database;
61 $this->resourceServiceFactory = $resourceServiceFactory;
62 $this->requestStack = $requestStack;
63 $this->databaseTableFactory = $databaseTableFactory;
64 $this->pluginManager = $pluginManager;
66 $this->plugins = $this->discover();
75 $query = $this->requestStack->getCurrentRequest()->get(
'query');
78 return $this->getResponse(
"Missing 'query' query parameter", 400);
82 $query = stripslashes($query);
84 return $this->runQuery($query);
93 $payloadJson = $this->requestStack->getCurrentRequest()->getContent();
94 $payload = json_decode($payloadJson);
95 if (isset($payload->query)) {
96 $query = $payload->query;
100 return $this->getResponse(
"Missing 'query' property in the request's body.", 400);
103 return $this->runQuery($query);
109 private function runQuery(
string $query) {
111 $queryObject = $this->service->getQueryObject($query);
113 catch (\Exception $e) {
114 return $this->getResponseFromException($e);
117 $uuid = $this->service->getTableName($query);
118 if ($modifyResponse = $this->modifyData($uuid)) {
119 return $modifyResponse;
121 $databaseTable = $this->getDatabaseTable($uuid);
124 $result = $databaseTable->query($queryObject);
126 catch (\Exception $e) {
127 return $this->getResponseFromException($e);
130 return $this->getResponse(array_map(
function ($row) {
131 unset($row->record_number);
145 private function modifyData(
string $identifier) {
146 foreach ($this->plugins as $plugin) {
147 if ($plugin->requiresModification(
'distribution', $identifier)) {
148 return $this->getResponse((
object) [
"message" => $plugin->message()], $plugin->httpCode());
157 private function getDatabaseTable(
string $uuid): DatabaseTable {
158 $resource = $this->getResource($uuid);
159 return $this->databaseTableFactory->getInstance($resource->getId(), [
'resource' => $resource]);
165 private function getResource(
string $uuid) {
167 $resourceService = $this->resourceServiceFactory->getInstance($uuid);
168 return $resourceService->get();