diff --git a/rest/index.php b/rest/index.php index da7e9ee2ca9d62d870fc7c0fd072dd83a555eb29..b3e9d3b830bfd932a1fc5d75cc044d0ed303bd65 100755 --- a/rest/index.php +++ b/rest/index.php @@ -192,6 +192,7 @@ $app->get('/folders/{id}/resources', \Folder\controllers\FolderController::class $app->post('/folders/{id}/resources', \Folder\controllers\FolderController::class . ':addResourcesById'); $app->delete('/folders/{id}/resources', \Folder\controllers\FolderController::class . ':removeResourcesById'); $app->get('/folders/{id}/resources/{resId}/events', \Folder\controllers\FolderController::class . ':getEventsFromFolder'); +$app->get('/folders/{id}/filters', \Folder\controllers\FolderController::class . ':getFilters'); $app->put('/folders/{id}/sharing', \Folder\controllers\FolderController::class . ':sharing'); //Groups diff --git a/src/app/folder/controllers/FolderController.php b/src/app/folder/controllers/FolderController.php index ba52c818f8be4f98d77e7f4d90a492f5d8cc6180..b84bec1c44d7745b6673519154bca03d62b12144 100755 --- a/src/app/folder/controllers/FolderController.php +++ b/src/app/folder/controllers/FolderController.php @@ -564,6 +564,32 @@ class FolderController return $response->withJson(['events' => $events]); } + public function getFilters(Request $request, Response $response, array $args) + { + if (!Validator::numeric()->notEmpty()->validate($args['id'])) { + return $response->withStatus(400)->withJson(['errors' => 'Route id is not an integer']); + } + + if (!FolderController::hasFolder(['id' => $args['id'], 'userId' => $GLOBALS['id']])) { + return $response->withStatus(400)->withJson(['errors' => 'Folder out of perimeter']); + } + + $foldersResources = ResourceFolderModel::get(['select' => ['res_id'], 'where' => ['folder_id = ?'], 'data' => [$args['id']]]); + $foldersResources = array_column($foldersResources, 'res_id'); + + if (empty($foldersResources)) { + return $response->withJson(['entities' => [], 'priorities' => [], 'categories' => [], 'statuses' => [], 'entitiesChildren' => []]); + } + + $where = ['(res_id in (?))']; + $queryData = [$foldersResources]; + $queryParams = $request->getQueryParams(); + + $filters = ResourceListController::getFormattedFilters(['where' => $where, 'queryData' => $queryData, 'queryParams' => $queryParams]); + + return $response->withJson($filters); + } + // login (string) : Login of user connected // folderId (integer) : Check specific folder // edition (boolean) : whether user can edit or not diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php index 45b6e50bfaf18bfb22b81a2b6120e0bf9f4bcd62..5b9c95d5c1f8672c26e209b98818dd0766666536 100644 --- a/src/app/resource/controllers/ResourceListController.php +++ b/src/app/resource/controllers/ResourceListController.php @@ -171,215 +171,11 @@ class ResourceListController $where = [$whereClause]; $queryData = []; - $data = $request->getQueryParams(); - if (!empty($data['delayed']) && $data['delayed'] == 'true') { - $where[] = 'process_limit_date < CURRENT_TIMESTAMP'; - } - if (!empty($data['search']) && mb_strlen($data['search']) >= 2) { - $where[] = '(alt_identifier ilike ? OR translate(subject, \'ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßà áâãäåæçèéêëìÃîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\') ilike translate(?, \'ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßà áâãäåæçèéêëìÃîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\'))'; - $queryData[] = "%{$data['search']}%"; - $queryData[] = "%{$data['search']}%"; - } + $queryParams = $request->getQueryParams(); - $wherePriorities = $where; - $whereCategories = $where; - $whereStatuses = $where; - $whereEntities = $where; - $dataPriorities = $queryData; - $dataCategories = $queryData; - $dataStatuses = $queryData; - $dataEntities = $queryData; - - if (isset($data['priorities'])) { - if (empty($data['priorities'])) { - $tmpWhere = 'priority is null'; - } else { - $replace = preg_replace('/(^,)|(,$)/', '', $data['priorities']); - $replace = preg_replace('/(,,)/', ',', $replace); - if ($replace != $data['priorities']) { - $tmpWhere = '(priority is null OR priority in (?))'; - } else { - $tmpWhere = 'priority in (?)'; - } - $dataCategories[] = explode(',', $replace); - $dataStatuses[] = explode(',', $replace); - $dataEntities[] = explode(',', $replace); - } - - $whereCategories[] = $tmpWhere; - $whereStatuses[] = $tmpWhere; - $whereEntities[] = $tmpWhere; - } - if (isset($data['categories'])) { - if (empty($data['categories'])) { - $tmpWhere = 'category_id is null'; - } else { - $replace = preg_replace('/(^,)|(,$)/', '', $data['categories']); - $replace = preg_replace('/(,,)/', ',', $replace); - if ($replace != $data['categories']) { - $tmpWhere = '(category_id is null OR category_id in (?))'; - } else { - $tmpWhere = 'category_id in (?)'; - } - $dataPriorities[] = explode(',', $replace); - $dataStatuses[] = explode(',', $replace); - $dataEntities[] = explode(',', $replace); - } + $filters = ResourceListController::getFormattedFilters(['where' => $where, 'queryData' => $queryData, 'queryParams' => $queryParams]); - $wherePriorities[] = $tmpWhere; - $whereStatuses[] = $tmpWhere; - $whereEntities[] = $tmpWhere; - } - if (!empty($data['statuses'])) { - $wherePriorities[] = 'status in (?)'; - $dataPriorities[] = explode(',', $data['statuses']); - $whereCategories[] = 'status in (?)'; - $dataCategories[] = explode(',', $data['statuses']); - $whereEntities[] = 'status in (?)'; - $dataEntities[] = explode(',', $data['statuses']); - } - if (isset($data['entities'])) { - if (empty($data['entities'])) { - $tmpWhere = 'destination is null'; - } else { - $replace = preg_replace('/(^,)|(,$)/', '', $data['entities']); - $replace = preg_replace('/(,,)/', ',', $replace); - if ($replace != $data['entities']) { - $tmpWhere = '(destination is null OR destination in (?))'; - } else { - $tmpWhere = 'destination in (?)'; - } - $dataPriorities[] = explode(',', $replace); - $dataCategories[] = explode(',', $replace); - $dataStatuses[] = explode(',', $replace); - } - - $wherePriorities[] = $tmpWhere; - $whereCategories[] = $tmpWhere; - $whereStatuses[] = $tmpWhere; - } - if (!empty($data['entitiesChildren'])) { - $entities = explode(',', $data['entitiesChildren']); - $entitiesChildren = []; - foreach ($entities as $entity) { - $children = EntityModel::getEntityChildren(['entityId' => $entity]); - $entitiesChildren = array_merge($entitiesChildren, $children); - } - if (!empty($entitiesChildren)) { - $wherePriorities[] = 'destination in (?)'; - $dataPriorities[] = $entitiesChildren; - $whereCategories[] = 'destination in (?)'; - $dataCategories[] = $entitiesChildren; - $whereStatuses[] = 'destination in (?)'; - $dataStatuses[] = $entitiesChildren; - } - } - - $priorities = []; - $rawPriorities = ResModel::getOnView([ - 'select' => ['count(res_id)', 'priority'], - 'where' => $wherePriorities, - 'data' => $dataPriorities, - 'groupBy' => ['priority'] - ]); - - foreach ($rawPriorities as $key => $value) { - $priority = null; - if (!empty($value['priority'])) { - $priority = PriorityModel::getById(['select' => ['label'], 'id' => $value['priority']]); - } - $priorities[] = [ - 'id' => empty($value['priority']) ? null : $value['priority'], - 'label' => empty($priority['label']) ? '_UNDEFINED' : $priority['label'], - 'count' => $value['count'] - ]; - } - - $categories = []; - $allCategories = ResModel::getCategories(); - $rawCategories = ResModel::getOnView([ - 'select' => ['count(res_id)', 'category_id'], - 'where' => $whereCategories, - 'data' => $dataCategories, - 'groupBy' => ['category_id'] - ]); - foreach ($rawCategories as $key => $value) { - $label = null; - if (!empty($value['category_id'])) { - foreach ($allCategories as $category) { - if ($value['category_id'] == $category['id']) { - $label = $category['label']; - } - } - } - $categories[] = [ - 'id' => empty($value['category_id']) ? null : $value['category_id'], - 'label' => empty($label) ? '_UNDEFINED' : $label, - 'count' => $value['count'] - ]; - } - - $statuses = []; - $rawStatuses = ResModel::getOnView([ - 'select' => ['count(res_id)', 'status'], - 'where' => $whereStatuses, - 'data' => $dataStatuses, - 'groupBy' => ['status'] - ]); - foreach ($rawStatuses as $key => $value) { - $status = StatusModel::getById(['select' => ['label_status'], 'id' => $value['status']]); - $statuses[] = [ - 'id' => $value['status'], - 'label' => empty($status['label_status']) ? '_UNDEFINED' : $status['label_status'], - 'count' => $value['count'] - ]; - } - - $entities = []; - $rawEntities = ResModel::getOnView([ - 'select' => ['count(res_id)', 'destination'], - 'where' => $whereEntities, - 'data' => $dataEntities, - 'groupBy' => ['destination'] - ]); - foreach ($rawEntities as $key => $value) { - $entity = null; - if (!empty($value['destination'])) { - $entity = EntityModel::getByEntityId(['select' => ['entity_label'], 'entityId' => $value['destination']]); - } - $entities[] = [ - 'entityId' => empty($value['destination']) ? null : $value['destination'], - 'label' => empty($entity['entity_label']) ? '_UNDEFINED' : $entity['entity_label'], - 'count' => $value['count'] - ]; - } - - $priorities = (count($priorities) >= 2) ? $priorities : []; - $categories = (count($categories) >= 2) ? $categories : []; - $statuses = (count($statuses) >= 2) ? $statuses : []; - $entities = (count($entities) >= 2) ? $entities : []; - - $entitiesChildren = []; - foreach ($entities as $entity) { - if (!empty($entity['entityId'])) { - $children = EntityModel::getEntityChildren(['entityId' => $entity['entityId']]); - $count = 0; - foreach ($entities as $value) { - if (in_array($value['entityId'], $children)) { - $count += $value['count']; - } - } - } else { - $count = $entity['count']; - } - $entitiesChildren[] = [ - 'entityId' => $entity['entityId'], - 'label' => $entity['label'], - 'count' => $count - ]; - } - - return $response->withJson(['entities' => $entities, 'priorities' => $priorities, 'categories' => $categories, 'statuses' => $statuses, 'entitiesChildren' => $entitiesChildren]); + return $response->withJson($filters); } public static function getResourcesListQueryData(array $args) @@ -1119,4 +915,223 @@ class ResourceListController return $formattedResources; } + + public static function getFormattedFilters(array $args) + { + ValidatorModel::notEmpty($args, ['where']); + ValidatorModel::arrayType($args, ['where', 'queryData', 'queryParams']); + + $data = $args['queryParams']; + $where = $args['where']; + $queryData = $args['queryData']; + + if (!empty($data['delayed']) && $data['delayed'] == 'true') { + $where[] = 'process_limit_date < CURRENT_TIMESTAMP'; + } + if (!empty($data['search']) && mb_strlen($data['search']) >= 2) { + $where[] = '(alt_identifier ilike ? OR translate(subject, \'ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßà áâãäåæçèéêëìÃîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\') ilike translate(?, \'ÀÃÂÃÄÅÆÇÈÉÊËÌÃÃŽÃÃÑÒÓÔÕÖØÙÚÛÜÃÞßà áâãäåæçèéêëìÃîïðñòóôõöøùúûýýþÿŔŕ\', \'aaaaaaaceeeeiiiidnoooooouuuuybsaaaaaaaceeeeiiiidnoooooouuuyybyrr\'))'; + $queryData[] = "%{$data['search']}%"; + $queryData[] = "%{$data['search']}%"; + } + + $wherePriorities = $where; + $whereCategories = $where; + $whereStatuses = $where; + $whereEntities = $where; + $dataPriorities = $queryData; + $dataCategories = $queryData; + $dataStatuses = $queryData; + $dataEntities = $queryData; + + if (isset($data['priorities'])) { + if (empty($data['priorities'])) { + $tmpWhere = 'priority is null'; + } else { + $replace = preg_replace('/(^,)|(,$)/', '', $data['priorities']); + $replace = preg_replace('/(,,)/', ',', $replace); + if ($replace != $data['priorities']) { + $tmpWhere = '(priority is null OR priority in (?))'; + } else { + $tmpWhere = 'priority in (?)'; + } + $dataCategories[] = explode(',', $replace); + $dataStatuses[] = explode(',', $replace); + $dataEntities[] = explode(',', $replace); + } + + $whereCategories[] = $tmpWhere; + $whereStatuses[] = $tmpWhere; + $whereEntities[] = $tmpWhere; + } + if (isset($data['categories'])) { + if (empty($data['categories'])) { + $tmpWhere = 'category_id is null'; + } else { + $replace = preg_replace('/(^,)|(,$)/', '', $data['categories']); + $replace = preg_replace('/(,,)/', ',', $replace); + if ($replace != $data['categories']) { + $tmpWhere = '(category_id is null OR category_id in (?))'; + } else { + $tmpWhere = 'category_id in (?)'; + } + $dataPriorities[] = explode(',', $replace); + $dataStatuses[] = explode(',', $replace); + $dataEntities[] = explode(',', $replace); + } + + $wherePriorities[] = $tmpWhere; + $whereStatuses[] = $tmpWhere; + $whereEntities[] = $tmpWhere; + } + if (!empty($data['statuses'])) { + $wherePriorities[] = 'status in (?)'; + $dataPriorities[] = explode(',', $data['statuses']); + $whereCategories[] = 'status in (?)'; + $dataCategories[] = explode(',', $data['statuses']); + $whereEntities[] = 'status in (?)'; + $dataEntities[] = explode(',', $data['statuses']); + } + if (isset($data['entities'])) { + if (empty($data['entities'])) { + $tmpWhere = 'destination is null'; + } else { + $replace = preg_replace('/(^,)|(,$)/', '', $data['entities']); + $replace = preg_replace('/(,,)/', ',', $replace); + if ($replace != $data['entities']) { + $tmpWhere = '(destination is null OR destination in (?))'; + } else { + $tmpWhere = 'destination in (?)'; + } + $dataPriorities[] = explode(',', $replace); + $dataCategories[] = explode(',', $replace); + $dataStatuses[] = explode(',', $replace); + } + + $wherePriorities[] = $tmpWhere; + $whereCategories[] = $tmpWhere; + $whereStatuses[] = $tmpWhere; + } + if (!empty($data['entitiesChildren'])) { + $entities = explode(',', $data['entitiesChildren']); + $entitiesChildren = []; + foreach ($entities as $entity) { + $children = EntityModel::getEntityChildren(['entityId' => $entity]); + $entitiesChildren = array_merge($entitiesChildren, $children); + } + if (!empty($entitiesChildren)) { + $wherePriorities[] = 'destination in (?)'; + $dataPriorities[] = $entitiesChildren; + $whereCategories[] = 'destination in (?)'; + $dataCategories[] = $entitiesChildren; + $whereStatuses[] = 'destination in (?)'; + $dataStatuses[] = $entitiesChildren; + } + } + + $priorities = []; + $rawPriorities = ResModel::getOnView([ + 'select' => ['count(res_id)', 'priority'], + 'where' => $wherePriorities, + 'data' => $dataPriorities, + 'groupBy' => ['priority'] + ]); + + foreach ($rawPriorities as $key => $value) { + $priority = null; + if (!empty($value['priority'])) { + $priority = PriorityModel::getById(['select' => ['label'], 'id' => $value['priority']]); + } + $priorities[] = [ + 'id' => empty($value['priority']) ? null : $value['priority'], + 'label' => empty($priority['label']) ? '_UNDEFINED' : $priority['label'], + 'count' => $value['count'] + ]; + } + + $categories = []; + $allCategories = ResModel::getCategories(); + $rawCategories = ResModel::getOnView([ + 'select' => ['count(res_id)', 'category_id'], + 'where' => $whereCategories, + 'data' => $dataCategories, + 'groupBy' => ['category_id'] + ]); + foreach ($rawCategories as $key => $value) { + $label = null; + if (!empty($value['category_id'])) { + foreach ($allCategories as $category) { + if ($value['category_id'] == $category['id']) { + $label = $category['label']; + } + } + } + $categories[] = [ + 'id' => empty($value['category_id']) ? null : $value['category_id'], + 'label' => empty($label) ? '_UNDEFINED' : $label, + 'count' => $value['count'] + ]; + } + + $statuses = []; + $rawStatuses = ResModel::getOnView([ + 'select' => ['count(res_id)', 'status'], + 'where' => $whereStatuses, + 'data' => $dataStatuses, + 'groupBy' => ['status'] + ]); + foreach ($rawStatuses as $key => $value) { + $status = StatusModel::getById(['select' => ['label_status'], 'id' => $value['status']]); + $statuses[] = [ + 'id' => $value['status'], + 'label' => empty($status['label_status']) ? '_UNDEFINED' : $status['label_status'], + 'count' => $value['count'] + ]; + } + + $entities = []; + $rawEntities = ResModel::getOnView([ + 'select' => ['count(res_id)', 'destination'], + 'where' => $whereEntities, + 'data' => $dataEntities, + 'groupBy' => ['destination'] + ]); + foreach ($rawEntities as $key => $value) { + $entity = null; + if (!empty($value['destination'])) { + $entity = EntityModel::getByEntityId(['select' => ['entity_label'], 'entityId' => $value['destination']]); + } + $entities[] = [ + 'entityId' => empty($value['destination']) ? null : $value['destination'], + 'label' => empty($entity['entity_label']) ? '_UNDEFINED' : $entity['entity_label'], + 'count' => $value['count'] + ]; + } + + $priorities = (count($priorities) >= 2) ? $priorities : []; + $categories = (count($categories) >= 2) ? $categories : []; + $statuses = (count($statuses) >= 2) ? $statuses : []; + $entities = (count($entities) >= 2) ? $entities : []; + + $entitiesChildren = []; + foreach ($entities as $entity) { + if (!empty($entity['entityId'])) { + $children = EntityModel::getEntityChildren(['entityId' => $entity['entityId']]); + $count = 0; + foreach ($entities as $value) { + if (in_array($value['entityId'], $children)) { + $count += $value['count']; + } + } + } else { + $count = $entity['count']; + } + $entitiesChildren[] = [ + 'entityId' => $entity['entityId'], + 'label' => $entity['label'], + 'count' => $count + ]; + } + + return ['entities' => $entities, 'priorities' => $priorities, 'categories' => $categories, 'statuses' => $statuses, 'entitiesChildren' => $entitiesChildren]; + } }