diff --git a/cli-config.php b/cli-config.php index 7cbcd70bfec01333920f5dd58baf091aa1badf48..4b13599658b0046623ef932fd7bcb7f5ace6945a 100644 --- a/cli-config.php +++ b/cli-config.php @@ -5,7 +5,7 @@ require 'vendor/autoload.php'; $settings = require './src/settings.php'; $metadata = $settings['settings']['metadata']; -$c = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration($metadata['entity_path'], $metadata['dev_mode']); +$c = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration(array('src/Entity'), $metadata['dev_mode']); $c->setProxyDir(getcwd() . '/' . $metadata['path_proxy']); if ($metadata['dev_mode']) { $c->setAutoGenerateProxyClasses(true); diff --git a/src/Action/Meta/DatasetListAction.php b/src/Action/Meta/DatasetListAction.php index ef92912d71c2db1ae0c2a48bcbc86c4cda6d11ff..fcc27ecb1c230d7841526bb374894ed6b71b9572 100644 --- a/src/Action/Meta/DatasetListAction.php +++ b/src/Action/Meta/DatasetListAction.php @@ -28,12 +28,21 @@ final class DatasetListAction private $logger; private $em; private $dcf; + + /** + * The encryption key used by anis to encrypt and decrypt sensitive data like passwords + * This key is provided by configuration (see the config file) + * + * @var string + */ + private $encryptionKey; - public function __construct(LoggerInterface $logger, EntityManagerInterface $em, DBALConnectionFactory $dcf) + public function __construct(LoggerInterface $logger, EntityManagerInterface $em, DBALConnectionFactory $dcf, string $encryptionKey) { $this->logger = $logger; $this->em = $em; $this->dcf = $dcf; + $this->encryptionKey = $encryptionKey; } public function __invoke(Request $request, Response $response, array $args): Response @@ -111,7 +120,8 @@ final class DatasetListAction private function postAttributes(Dataset $dataset): void { $database = $dataset->getProject()->getDatabase(); - $connection = $this->dcf->create($database); + $decryptedPassword = $this->decryptData($database->getPassword()); + $connection = $this->dcf->create($database, $decryptedPassword); $sm = $connection->getSchemaManager(); $columns = $sm->listTableColumns($dataset->getTableRef()); $i = 10; diff --git a/src/Action/Search/SearchMetaAction.php b/src/Action/Search/SearchMetaAction.php index 88036b0e2c2d632d88ed4ad18674e069619639b4..2ba68a512f981f1b7a0c73a1f56153802d828a49 100644 --- a/src/Action/Search/SearchMetaAction.php +++ b/src/Action/Search/SearchMetaAction.php @@ -15,6 +15,8 @@ use Doctrine\ORM\EntityManagerInterface; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; +use App\Entity\Dataset; +use App\Entity\Attribute; use App\Utils\ActionTrait; use App\Utils\DBALConnectionFactory; use App\utils\AnisQueryBuilderFactory; @@ -122,6 +124,25 @@ final class SearchMetaAction )->withStatus(400); } + $queryParams = $request->getQueryParams(); + if (!array_key_exists('a', $queryParams)) { + return $this->dispatchHttpError( + $response, + 'Invalid request', + 'Param a is required for this request' + )->withStatus(400); + } + + $listOfIds = explode(';', $queryParams['a']); + $attributesSelected = array(); + foreach($listOfIds as $id) { + $attribute = $this->getAttribute($dataset, (int) $id); + $attributesSelected[] = array( + 'name' => $attribute->getName(), + 'label' => $attribute->getLabel() + ); + } + $database = $dataset->getProject()->getDatabase(); $decryptedPassword = $this->decryptData($database->getPassword()); $connection = $this->dcf->create($database, $decryptedPassword); @@ -137,10 +158,22 @@ final class SearchMetaAction $result = $anisQueryBuilder->fetchAll(); $meta = array(); - $meta['dataset-selected'] = $dataset->getLabel(); - $meta['total-items'] = $result[0]['nb']; - $meta['url'] = $dataset->getName() . '?' . $request->getUri()->getQuery(); + $meta['dataset_selected'] = $dataset->getLabel(); + $meta['attributes_selected'] = $attributesSelected; + $meta['total_items'] = $result[0]['nb']; + // $meta['url'] = $dataset->getName() . '?' . $request->getUri()->getQuery(); return $response->withJson($meta); } + + private function getAttribute(Dataset $dataset, int $id): Attribute + { + $attributes = $dataset->getAttributes(); + foreach ($attributes as $attribute) { + if ($attribute->getId() === $id) { + return $attribute; + } + } + throw SearchException::attributeNotFound($id, $dataset->getLabel()); + } } diff --git a/src/Search/AnisQueryBuilder.php b/src/Search/AnisQueryBuilder.php index 024215de655d83fe46776c5ac7e23e5eb851c708..7cfed1ef891b087cc60cca2ebffca83e3f67cef2 100644 --- a/src/Search/AnisQueryBuilder.php +++ b/src/Search/AnisQueryBuilder.php @@ -59,12 +59,13 @@ class AnisQueryBuilder $params = $this->getCriterionParams($criterion); $attribute = $this->getAttribute((int) $params[0]); $column = $attribute->getTableName() . '.' . $attribute->getName(); + $columnType = $attribute->getType(); if (array_key_exists(2, $params)) { $values = explode('|', $params[2]); } else { $values = array(); } - $operator = $this->operatorFactory->create($params[1], $this->queryBuilder->expr(), $column, $values); + $operator = $this->operatorFactory->create($params[1], $this->queryBuilder->expr(), $column, $columnType, $values); $expressions[] = $operator->getExpression(); } $this->queryBuilder->where(new CompositeExpression(CompositeExpression::TYPE_AND, $expressions)); diff --git a/src/Search/Operator/Between.php b/src/Search/Operator/Between.php index 18c416d959250d8e865527c16d83fcc66f70fd8b..336f09f847d09f1ceed467bf2e6a50bda997a6a7 100644 --- a/src/Search/Operator/Between.php +++ b/src/Search/Operator/Between.php @@ -18,9 +18,9 @@ class Between extends Operator private $value1; private $value2; - public function __construct(ExpressionBuilder $expr, string $column, float $value1, float $value2) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value1, string $value2) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); $this->value1 = $value1; $this->value2 = $value2; } @@ -28,8 +28,8 @@ class Between extends Operator public function getExpression() { $args = array(); - $args[] = $this->expr->gte($this->column, $this->value1); - $args[] = $this->expr->lte($this->column, $this->value2); + $args[] = $this->expr->gte($this->column, $this->getSqlValue($this->value1)); + $args[] = $this->expr->lte($this->column, $this->getSqlValue($this->value2)); return new CompositeExpression(CompositeExpression::TYPE_AND, $args); } } diff --git a/src/Search/Operator/Equal.php b/src/Search/Operator/Equal.php index ee7c5147ea3a9451a5771c5b2680711f7a0f1a54..b66b8e520cacf2948c6850b4a69ab2d1cfa1321a 100644 --- a/src/Search/Operator/Equal.php +++ b/src/Search/Operator/Equal.php @@ -16,19 +16,15 @@ class Equal extends Operator { private $value; - public function __construct(ExpressionBuilder $expr, string $column, string $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); - if (is_numeric($value)) { - $this->value = $value; - } else { - $this->value = $this->expr->literal($value); - } + parent::__construct($expr, $column, $columnType); + $this->value = $value; } public function getExpression() { - $expr = $this->expr->eq($this->column, $this->value); + $expr = $this->expr->eq($this->column, $this->getSqlValue($this->value)); return $expr; } } diff --git a/src/Search/Operator/GreaterThan.php b/src/Search/Operator/GreaterThan.php index 8805f63ceb8881250249eea7d8b442d3c4aea330..594e3438563473107cb9af3fd46798702c426878 100644 --- a/src/Search/Operator/GreaterThan.php +++ b/src/Search/Operator/GreaterThan.php @@ -14,19 +14,16 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class GreaterThan extends Operator { - /** - * @var number - */ private $value; - public function __construct(ExpressionBuilder $expr, string $column, float $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); $this->value = $value; } public function getExpression() : string { - return $this->expr->gt($this->column, $this->value); + return $this->expr->gt($this->column, $this->getSqlValue($this->value)); } } diff --git a/src/Search/Operator/GreaterThanEqual.php b/src/Search/Operator/GreaterThanEqual.php index 31fd17d3e3e5a95696951dfd94c3b6979a618225..5ec6af7a523637ad8f1b4c63ded1ad81dfb1c233 100644 --- a/src/Search/Operator/GreaterThanEqual.php +++ b/src/Search/Operator/GreaterThanEqual.php @@ -14,19 +14,16 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class GreaterThanEqual extends Operator { - /** - * @var number - */ private $value; - public function __construct(ExpressionBuilder $expr, string $column, float $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); $this->value = $value; } public function getExpression() : string { - return $this->expr->gte($this->column, $this->value); + return $this->expr->gte($this->column, $this->getSqlValue($this->value)); } } diff --git a/src/Search/Operator/IOperatorFactory.php b/src/Search/Operator/IOperatorFactory.php index 39f28624e78cae2f7e220acc5e8173b0b43432f4..eab623ce8ed940a03f956f444f2bd0e49e4e7738 100644 --- a/src/Search/Operator/IOperatorFactory.php +++ b/src/Search/Operator/IOperatorFactory.php @@ -14,5 +14,5 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; interface IOperatorFactory { - public function create(string $type, ExpressionBuilder $expr, string $column, array $parameters): IOperator; + public function create(string $type, ExpressionBuilder $expr, string $column, string $columnType, array $parameters): IOperator; } diff --git a/src/Search/Operator/In.php b/src/Search/Operator/In.php index b9ab7ae12cfc3e3d2a13fef2e044d92e5ead1110..6945e396f16a19bf4aba81fed04798f0ebdecdbd 100644 --- a/src/Search/Operator/In.php +++ b/src/Search/Operator/In.php @@ -16,20 +16,14 @@ class In extends Operator { private $values; - public function __construct(ExpressionBuilder $expr, string $column, array $values) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, array $values) { - parent::__construct($expr, $column); - if (is_numeric($this->values[0])) { - $this->values = $values; - } else { - $this->values = array_map(function (string $value): string { - return $this->expr->literal($value); - }, $values); - } + parent::__construct($expr, $column, $columnType); + $this->values = $values; } public function getExpression() { - return $this->expr->in($this->column, $this->values); + return $this->expr->in($this->column, array_map(array($this, 'getSqlValue'), $this->values)); } } diff --git a/src/Search/Operator/LessThan.php b/src/Search/Operator/LessThan.php index 9937346f1af8143eac418c5128956a755ee70b51..9720abc33634e18ef6c382cd464859da5f040f02 100644 --- a/src/Search/Operator/LessThan.php +++ b/src/Search/Operator/LessThan.php @@ -14,19 +14,16 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class LessThan extends Operator { - /** - * @var number - */ private $value; - public function __construct(ExpressionBuilder $expr, string $column, float $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); $this->value = $value; } public function getExpression() : string { - return $this->expr->lt($this->column, $this->value); + return $this->expr->lt($this->column, $this->getSqlValue($this->value)); } } diff --git a/src/Search/Operator/LessThanEqual.php b/src/Search/Operator/LessThanEqual.php index 3f28be85a25878560a1815248394e0a3bcab2bf2..d97280731fcb9836b2ec41a7d40e86b864de5900 100644 --- a/src/Search/Operator/LessThanEqual.php +++ b/src/Search/Operator/LessThanEqual.php @@ -14,19 +14,16 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class LessThanEqual extends Operator { - /** - * @var number - */ private $value; - public function __construct(ExpressionBuilder $expr, string $column, float $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); $this->value = $value; } public function getExpression() : string { - return $this->expr->lte($this->column, $this->value); + return $this->expr->lte($this->column, $this->getSqlValue($this->value)); } } diff --git a/src/Search/Operator/Like.php b/src/Search/Operator/Like.php index 23835a8f54d2fb45f0ce8bdbe20241c47019b96e..db384e75267784eeb715955a8baf44c94e6c4ddd 100644 --- a/src/Search/Operator/Like.php +++ b/src/Search/Operator/Like.php @@ -16,14 +16,14 @@ class Like extends Operator { private $value; - public function __construct(ExpressionBuilder $expr, string $column, string $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); - $this->value = $this->expr->literal($value); + parent::__construct($expr, $column, $columnType); + $this->value = $value; } public function getExpression() { - return $this->expr->like($this->column, $this->value); + return $this->expr->like($this->column, $this->expr->literal($this->value)); } } diff --git a/src/Search/Operator/NotEqual.php b/src/Search/Operator/NotEqual.php index 86438f29bb31a9aab790f9cfa23454880e339ef4..3570ceee603b23f0a79c45cf49883a9cc08cb6a5 100644 --- a/src/Search/Operator/NotEqual.php +++ b/src/Search/Operator/NotEqual.php @@ -16,18 +16,14 @@ class NotEqual extends Operator { private $value; - public function __construct(ExpressionBuilder $expr, string $column, string $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); - if (is_numeric($value)) { - $this->value = $value; - } if (is_string($value)) { - $this->value = $this->expr->literal($value); - } + parent::__construct($expr, $column, $columnType); + $this->value = $value; } public function getExpression() { - return $this->expr->neq($this->column, $this->value); + return $this->expr->neq($this->column, $this->getSqlValue($this->value)); } } diff --git a/src/Search/Operator/NotIn.php b/src/Search/Operator/NotIn.php index 9cd6c47828f3c1b42ecd2c244917cdf28f86caf4..f45ac3edf115adacfbb694e48ccc7e277df74490 100644 --- a/src/Search/Operator/NotIn.php +++ b/src/Search/Operator/NotIn.php @@ -16,20 +16,14 @@ class NotIn extends Operator { private $values; - public function __construct(ExpressionBuilder $expr, string $column, array $values) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, array $values) { - parent::__construct($expr, $column); - if (is_numeric($this->values[0])) { - $this->values = $values; - } else { - $this->values = array_map(function (string $value): string { - return $this->expr->literal($value); - }, $values); - } + parent::__construct($expr, $column, $columnType); + $this->values = $values; } public function getExpression() { - return $this->expr->notIn($this->column, $this->values); + return $this->expr->notIn($this->column, array_map(array($this, 'getSqlValue'), $this->values)); } } diff --git a/src/Search/Operator/NotLike.php b/src/Search/Operator/NotLike.php index 1b3f242c820600b486c07b958fd37b977f8b5414..8700d9d0099a7cf584d248ed7079f40f91a38ba0 100644 --- a/src/Search/Operator/NotLike.php +++ b/src/Search/Operator/NotLike.php @@ -16,14 +16,14 @@ class NotLike extends Operator { private $value; - public function __construct(ExpressionBuilder $expr, string $column, string $value) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType, string $value) { - parent::__construct($expr, $column); - $this->value = $this->expr->literal($value); + parent::__construct($expr, $column, $columnType); + $this->value = $value; } public function getExpression() { - return $this->expr->notLike($this->column, $this->value); + return $this->expr->notLike($this->column, $this->expr->literal($this->value)); } } diff --git a/src/Search/Operator/Operator.php b/src/Search/Operator/Operator.php index 784036734e1082603f584639ef4b86c22866fd51..233a75c2c80aebb593ab1c6caa3fb1cf69f69db6 100644 --- a/src/Search/Operator/Operator.php +++ b/src/Search/Operator/Operator.php @@ -11,6 +11,7 @@ namespace App\Search\Operator; use Doctrine\DBAL\Query\Expression\ExpressionBuilder; +use Doctrine\DBAL\Types\Type; abstract class Operator implements IOperator { @@ -24,9 +25,27 @@ abstract class Operator implements IOperator */ protected $column; - public function __construct(ExpressionBuilder $expr, string $column) + /** + * @var string + */ + protected $columnType; + + public function __construct(ExpressionBuilder $expr, string $column, string $columnType) { $this->expr = $expr; $this->column = $column; + $this->columnType = $columnType; + } + + protected function getSqlValue(string $value): string + { + switch ($this->columnType) { + case Type::STRING: + case Type::TEXT: + case Type::DATE: + return $this->expr->literal($value); + default: + return $value; + } } } diff --git a/src/Search/Operator/OperatorFactory.php b/src/Search/Operator/OperatorFactory.php index b43322923ff11db03420ffb8b3f6edfd901493c8..3fbfd46e50a682f970ed97333ee71d8a74b1e08d 100644 --- a/src/Search/Operator/OperatorFactory.php +++ b/src/Search/Operator/OperatorFactory.php @@ -14,47 +14,47 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class OperatorFactory implements IOperatorFactory { - public function create(string $type, ExpressionBuilder $expr, string $column, array $parameters): IOperator + public function create(string $type, ExpressionBuilder $expr, string $column, string $columnType, array $parameters): IOperator { switch ($type) { case 'bw': - return new Between($expr, $column, (float) $parameters[0], (float) $parameters[1]); + return new Between($expr, $column, $columnType, $parameters[0], $parameters[1]); case 'eq': - return new Equal($expr, $column, $parameters[0]); + return new Equal($expr, $column, $columnType, $parameters[0]); case 'neq': - return new NotEqual($expr, $column, $parameters[0]); + return new NotEqual($expr, $column, $columnType, $parameters[0]); case 'gt': - return new GreaterThan($expr, $column, (float) $parameters[0]); + return new GreaterThan($expr, $column, $columnType, $parameters[0]); case 'gte': - return new GreaterThanEqual($expr, $column, (float) $parameters[0]); + return new GreaterThanEqual($expr, $column, $columnType, $parameters[0]); case 'lt': - return new LessThan($expr, $column, (float) $parameters[0]); + return new LessThan($expr, $column, $columnType, $parameters[0]); case 'lte': - return new LessThanEqual($expr, $column, (float) $parameters[0]); + return new LessThanEqual($expr, $column, $columnType, $parameters[0]); case 'lk': - return new Like($expr, $column, $parameters[0]); + return new Like($expr, $column, $columnType, $parameters[0]); case 'nlk': - return new NotLike($expr, $column, $parameters[0]); + return new NotLike($expr, $column, $columnType, $parameters[0]); case 'in': - return new In($expr, $column, $parameters); + return new In($expr, $column, $columnType, $parameters); case 'nin': - return new NotIn($expr, $column, $parameters); + return new NotIn($expr, $column, $columnType, $parameters); case 'nl': - return new OperatorNull($expr, $column); + return new OperatorNull($expr, $column, $columnType); case 'nnl': - return new OperatorNotNull($expr, $column); + return new OperatorNotNull($expr, $column, $columnType); default: throw OperatorException::unknownOperator($type); diff --git a/src/Search/Operator/OperatorNotNull.php b/src/Search/Operator/OperatorNotNull.php index 3911ffc612ee3bf79bbf297cd60b8d87c271be05..342415d139b88161c8dc19777929eb35d524a3db 100644 --- a/src/Search/Operator/OperatorNotNull.php +++ b/src/Search/Operator/OperatorNotNull.php @@ -14,9 +14,9 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class OperatorNotNull extends Operator { - public function __construct(ExpressionBuilder $expr, string $column) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); } public function getExpression() diff --git a/src/Search/Operator/OperatorNull.php b/src/Search/Operator/OperatorNull.php index 1c19760b864c6944864a9b4c7ac361229ac96c09..d179c5a5298e30eaf1de9a8e3eb3ac6c9fe05d5b 100644 --- a/src/Search/Operator/OperatorNull.php +++ b/src/Search/Operator/OperatorNull.php @@ -14,9 +14,9 @@ use Doctrine\DBAL\Query\Expression\ExpressionBuilder; class OperatorNull extends Operator { - public function __construct(ExpressionBuilder $expr, string $column) + public function __construct(ExpressionBuilder $expr, string $column, string $columnType) { - parent::__construct($expr, $column); + parent::__construct($expr, $column, $columnType); } public function getExpression() diff --git a/src/dependencies.php b/src/dependencies.php index 8eab12ee54cde65c899d1cd24ad1522a5da7fcc9..ce395054663cae4ed821a51dd07cb8ccea8006ff 100644 --- a/src/dependencies.php +++ b/src/dependencies.php @@ -168,7 +168,8 @@ $container['App\Action\Meta\CategoryAction'] = function ($c) { }; $container['App\Action\Meta\DatasetListAction'] = function ($c) { - return new App\Action\Meta\DatasetListAction($c->get('logger'), $c->get('em'), $c->get('dcf')); + $settings = $c->get('settings'); + return new App\Action\Meta\DatasetListAction($c->get('logger'), $c->get('em'), $c->get('dcf'), $settings['encryption_key']); }; $container['App\Action\Meta\DatasetAction'] = function ($c) {