Open Data Catalog v2.0.0
Api.php
Go to the documentation of this file.
1 <?php
2 
4 
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;
16 
20 class Api implements ContainerInjectionInterface {
21  use JsonResponseTrait;
23 
24  private $service;
25  private $database;
26  private $requestStack;
27  private $resourceServiceFactory;
28  private $databaseTableFactory;
29 
37  public static function create(ContainerInterface $container) {
38  return new static(
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')
45  );
46  }
47 
51  public function __construct(
52  Service $service,
53  Connection $database,
54  Resource $resourceServiceFactory,
55  RequestStack $requestStack,
56  DatabaseTableFactory $databaseTableFactory,
57  DataModifierManager $pluginManager
58  ) {
59  $this->service = $service;
60  $this->database = $database;
61  $this->resourceServiceFactory = $resourceServiceFactory;
62  $this->requestStack = $requestStack;
63  $this->databaseTableFactory = $databaseTableFactory;
64  $this->pluginManager = $pluginManager;
65 
66  $this->plugins = $this->discover();
67  }
68 
72  public function runQueryGet() {
73 
74  $query = NULL;
75  $query = $this->requestStack->getCurrentRequest()->get('query');
76 
77  if (empty($query)) {
78  return $this->getResponse("Missing 'query' query parameter", 400);
79  }
80 
81  // The incoming string could contain escaped characters.
82  $query = stripslashes($query);
83 
84  return $this->runQuery($query);
85  }
86 
90  public function runQueryPost() {
91 
92  $query = NULL;
93  $payloadJson = $this->requestStack->getCurrentRequest()->getContent();
94  $payload = json_decode($payloadJson);
95  if (isset($payload->query)) {
96  $query = $payload->query;
97  }
98 
99  if (empty($query)) {
100  return $this->getResponse("Missing 'query' property in the request's body.", 400);
101  }
102 
103  return $this->runQuery($query);
104  }
105 
109  private function runQuery(string $query) {
110  try {
111  $queryObject = $this->service->getQueryObject($query);
112  }
113  catch (\Exception $e) {
114  return $this->getResponseFromException($e);
115  }
116 
117  $uuid = $this->service->getTableName($query);
118  if ($modifyResponse = $this->modifyData($uuid)) {
119  return $modifyResponse;
120  }
121  $databaseTable = $this->getDatabaseTable($uuid);
122 
123  try {
124  $result = $databaseTable->query($queryObject);
125  }
126  catch (\Exception $e) {
127  return $this->getResponseFromException($e);
128  }
129 
130  return $this->getResponse(array_map(function ($row) {
131  unset($row->record_number);
132  return $row;
133  }, $result), 200);
134  }
135 
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());
149  }
150  }
151  return FALSE;
152  }
153 
157  private function getDatabaseTable(string $uuid): DatabaseTable {
158  $resource = $this->getResource($uuid);
159  return $this->databaseTableFactory->getInstance($resource->getId(), ['resource' => $resource]);
160  }
161 
165  private function getResource(string $uuid) {
166  /* @var $resourceService \Drupal\dkan_datastore\Service\Resource */
167  $resourceService = $this->resourceServiceFactory->getInstance($uuid);
168  return $resourceService->get();
169  }
170 
171 }
Drupal\dkan_sql_endpoint\Controller\Api\runQueryGet
runQueryGet()
Definition: Api.php:72
Drupal\dkan_datastore\Service\Factory\Resource
Definition: Resource.php:16
Drupal\dkan_sql_endpoint\Controller\Api\__construct
__construct(Service $service, Connection $database, Resource $resourceServiceFactory, RequestStack $requestStack, DatabaseTableFactory $databaseTableFactory, DataModifierManager $pluginManager)
Definition: Api.php:51
Drupal\dkan_datastore\Storage\DatabaseTable
Definition: DatabaseTable.php:16
Drupal\dkan_common\DataModifierPluginTrait
trait DataModifierPluginTrait
Definition: DataModifierPluginTrait.php:8
Drupal\dkan_sql_endpoint\Controller\Api\runQueryPost
runQueryPost()
Definition: Api.php:90
Drupal\dkan_sql_endpoint\Controller\Api\create
static create(ContainerInterface $container)
Definition: Api.php:37
Drupal\dkan_datastore\Storage\DatabaseTableFactory
Definition: DatabaseTableFactory.php:11
Drupal\dkan_common\Plugin\DataModifierManager
Definition: DataModifierManager.php:12
Drupal\dkan_sql_endpoint\Service
Definition: Service.php:16
Drupal\dkan_sql_endpoint\Controller\Api
Definition: Api.php:20
Drupal\dkan_sql_endpoint\Controller
Definition: Api.php:3