From d9b752f74c59e27709d8d28599756d9bb92df49e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= Date: Tue, 23 Apr 2019 16:19:23 +0200 Subject: [PATCH 1/2] #19 => ok --- cli-config.php | 2 +- src/Action/Meta/DatasetListAction.php | 14 ++++++++++-- src/Search/AnisQueryBuilder.php | 3 ++- src/Search/Operator/Between.php | 8 +++---- src/Search/Operator/Equal.php | 12 ++++------ src/Search/Operator/GreaterThan.php | 9 +++----- src/Search/Operator/GreaterThanEqual.php | 9 +++----- src/Search/Operator/IOperatorFactory.php | 2 +- src/Search/Operator/In.php | 14 ++++-------- src/Search/Operator/LessThan.php | 9 +++----- src/Search/Operator/LessThanEqual.php | 9 +++----- src/Search/Operator/Like.php | 8 +++---- src/Search/Operator/NotEqual.php | 12 ++++------ src/Search/Operator/NotIn.php | 14 ++++-------- src/Search/Operator/NotLike.php | 8 +++---- src/Search/Operator/Operator.php | 21 +++++++++++++++++- src/Search/Operator/OperatorFactory.php | 28 ++++++++++++------------ src/Search/Operator/OperatorNotNull.php | 4 ++-- src/Search/Operator/OperatorNull.php | 4 ++-- src/dependencies.php | 3 ++- 20 files changed, 96 insertions(+), 97 deletions(-) diff --git a/cli-config.php b/cli-config.php index 7cbcd70..4b13599 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 ef92912..fcc27ec 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/Search/AnisQueryBuilder.php b/src/Search/AnisQueryBuilder.php index 024215d..7cfed1e 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 18c416d..336f09f 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 ee7c514..b66b8e5 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 8805f63..594e343 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 31fd17d..5ec6af7 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 39f2862..eab623c 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 b9ab7ae..6945e39 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 9937346..9720abc 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 3f28be8..d972807 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 23835a8..db384e7 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 86438f2..3570cee 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 9cd6c47..f45ac3e 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 1b3f242..8700d9d 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 7840367..233a75c 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 b433229..3fbfd46 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 3911ffc..342415d 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 1c19760..d179c5a 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 8eab12e..ce39505 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) { -- GitLab From 789deb24f1d47f9ac98a55cf9427e887522871ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Agneray?= Date: Wed, 24 Apr 2019 16:20:03 +0200 Subject: [PATCH 2/2] Modification search meta (attributes selected) --- src/Action/Search/SearchMetaAction.php | 39 ++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/Action/Search/SearchMetaAction.php b/src/Action/Search/SearchMetaAction.php index 88036b0..2ba68a5 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()); + } } -- GitLab