From 7b267da5d6fc5ff1095cfeb3f0ee65a95442d8b4 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Thu, 20 Feb 2020 10:49:44 +0100
Subject: [PATCH] FEAT #13243 TIME 1:00 added keyword folders to perimeter

---
 .../folder/controllers/FolderController.php   | 26 ++++++-------------
 .../resource/controllers/ResController.php    |  8 +++---
 .../controllers/ResourceListController.php    |  8 +++---
 3 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/src/app/folder/controllers/FolderController.php b/src/app/folder/controllers/FolderController.php
index 896dcd1d603..f8808f57745 100755
--- a/src/app/folder/controllers/FolderController.php
+++ b/src/app/folder/controllers/FolderController.php
@@ -52,8 +52,8 @@ class FolderController
 
         $foldersWithResources = FolderModel::getWithEntitiesAndResources([
             'select'   => ['COUNT(DISTINCT resources_folders.res_id)', 'resources_folders.folder_id'],
-            'where'    => ['(entities_folders.entity_id in (?) OR folders.user_id = ?)'],
-            'data'     => [$userEntities, $GLOBALS['id']],
+            'where'    => ['(entities_folders.entity_id in (?) OR folders.user_id = ? OR keyword = ?)'],
+            'data'     => [$userEntities, $GLOBALS['id'], 'ALL_ENTITIES'],
             'groupBy'  => ['resources_folders.folder_id']
         ]);
 
@@ -124,14 +124,14 @@ class FolderController
         if ($folder['public']) {
             $entitiesFolder = EntityFolderModel::getEntitiesByFolderId(['folder_id' => $args['id'], 'select' => ['entities_folders.entity_id', 'entities_folders.edition', 'entities.entity_label']]);
             foreach ($entitiesFolder as $value) {
-                $canDelete = FolderController::areChildrenInPerimeter(['folderId' => $args['id'], 'entityId' => $value['entity_id']]);
+                $canDelete = FolderController::areChildrenInPerimeter(['folderId' => $args['id']]);
                 $canDelete = $canDelete && $value['edition'] == true;
                 $folder['sharing']['entities'][] = ['entity_id' => $value['entity_id'], 'edition' => $value['edition'], 'canDelete' => $canDelete, 'label' => $value['entity_label']];
             }
 
             $keywordsFolder = EntityFolderModel::getKeywordsByFolderId(['folder_id' => $args['id'], 'select' => ['edition', 'keyword']]);
             foreach ($keywordsFolder as $value) {
-                $canDelete = FolderController::areChildrenInPerimeter(['folderId' => $args['id'], 'keyword' => $value['keyword']]);
+                $canDelete = FolderController::areChildrenInPerimeter(['folderId' => $args['id']]);
                 $canDelete = $canDelete && $value['edition'] == true;
                 $folder['sharing']['entities'][] = ['keyword' => $value['keyword'], 'edition' => $value['edition'], 'canDelete' => $canDelete];
             }
@@ -539,8 +539,7 @@ class FolderController
     public static function areChildrenInPerimeter(array $args = [])
     {
         ValidatorModel::notEmpty($args, ['folderId']);
-        ValidatorModel::intVal($args, ['folderId', 'entityId']);
-        ValidatorModel::stringType($args, ['keyword']);
+        ValidatorModel::intVal($args, ['folderId']);
 
         $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $args['folderId'], 'edition' => true]);
         if (empty($folder[0])) {
@@ -550,14 +549,6 @@ class FolderController
         $where = ['parent_id = ?'];
         $data = [$args['folderId']];
 
-        if (!empty($args['entityId'])) {
-            $where[] = 'entity_id = ?';
-            $data[] = $args['entityId'];
-        } else if (!empty($args['keyword'])) {
-            $where[] = 'keyword = ?';
-            $data[] = $args['keyword'];
-        }
-
         $children = FolderModel::getWithEntities([
             'select' => ['distinct (folders.id)', 'edition', 'user_id', 'keyword'],
             'where'  => $where,
@@ -566,9 +557,8 @@ class FolderController
 
         $allEntitiesCanDelete = false;
         foreach ($children as $key => $child) {
-            if ($child['keyword'] == 'ALL_ENTITIES') {
+            if ($child['keyword'] == 'ALL_ENTITIES' && $child['edition'] == true) {
                 $allEntitiesCanDelete = true;
-                unset($children[$key]);
             }
         }
 
@@ -578,7 +568,7 @@ class FolderController
                 if ($child['user_id'] != $GLOBALS['id'] && ($child['edition'] == false || $child['edition'] == null) && !$allEntitiesCanDelete) {
                     return false;
                 }
-                if (!FolderController::areChildrenInPerimeter(['folderId' => $child['id'], 'entityId' => $args['entityId'], 'keyword' => $args['keyword']])) {
+                if (!FolderController::areChildrenInPerimeter(['folderId' => $child['id']])) {
                     return false;
                 }
             }
@@ -1030,7 +1020,7 @@ class FolderController
 
         $folders = FolderModel::getWithEntities([
             'select'   => ['count(distinct folders.id)'],
-            'where'    => ['folders.id in (?)', '(user_id = ? OR entity_id in (?))'],
+            'where'    => ['folders.id in (?)', "(user_id = ? OR entity_id in (?) OR keyword = 'ALL_ENTITIES')"],
             'data'     => [$args['folders'], $args['userId'], $entities]
         ]);
 
diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index 11d6300e9d1..3abdb91464d 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -217,8 +217,8 @@ class ResController extends ResourceControlController
             $entities = array_column($entities, 'id');
             $folders = FolderModel::getWithEntitiesAndResources([
                 'select'    => ['distinct(resources_folders.folder_id)'],
-                'where'     => ['resources_folders.res_id = ?', '(entities_folders.entity_id in (?) OR folders.user_id = ?)'],
-                'data'      => [$args['resId'], $entities, $GLOBALS['id']]
+                'where'     => ['resources_folders.res_id = ?', '(entities_folders.entity_id in (?) OR folders.user_id = ? OR keyword = ?)'],
+                'data'      => [$args['resId'], $entities, $GLOBALS['id'], 'ALL_ENTITIES']
             ]);
             $formattedData['folders'] = array_column($folders, 'folder_id');
 
@@ -1044,8 +1044,8 @@ class ResController extends ResourceControlController
         $entities = array_column($entities, 'id');
         $idToDelete = FolderModel::getWithEntitiesAndResources([
             'select'    => ['resources_folders.id'],
-            'where'     => ['resources_folders.res_id = ?', '(entities_folders.entity_id in (?) OR folders.user_id = ?)'],
-            'data'      => [$args['resId'], $entities, $GLOBALS['id']]
+            'where'     => ['resources_folders.res_id = ?', '(entities_folders.entity_id in (?) OR folders.user_id = ? OR keyword = ?)'],
+            'data'      => [$args['resId'], $entities, $GLOBALS['id'], 'ALL_ENTITIES']
         ]);
         $idToDelete = array_column($idToDelete, 'id');
         if (!empty($idToDelete)) {
diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php
index 39e4d7ec1f0..6fa95efe331 100644
--- a/src/app/resource/controllers/ResourceListController.php
+++ b/src/app/resource/controllers/ResourceListController.php
@@ -740,8 +740,8 @@ class ResourceListController
 
         $folders = FolderModel::getWithEntitiesAndResources([
             'select'    => ['DISTINCT(folders.id)', 'folders.label'],
-            'where'     => ['res_id = ?', '(user_id = ? OR entity_id in (?))'],
-            'data'      => [$args['resId'], $args['userId'], $entities]
+            'where'     => ['res_id = ?', '(user_id = ? OR entity_id in (?) OR keyword = ?)'],
+            'data'      => [$args['resId'], $args['userId'], $entities, 'ALL_ENTITIES']
         ]);
 
         return $folders;
@@ -1155,8 +1155,8 @@ class ResourceListController
 
         $rawFolders = FolderModel::getWithEntitiesAndResources([
             'select'  => ['folders.id', 'folders.label', 'count(resources_folders.res_id) as count'],
-            'where'   => ['resources_folders.res_id in (?)', '(folders.user_id = ? OR entities_folders.entity_id in (?))'],
-            'data'    => [$resIds, $GLOBALS['id'], $userEntities],
+            'where'   => ['resources_folders.res_id in (?)', '(folders.user_id = ? OR entities_folders.entity_id in (?) or keyword = ?)'],
+            'data'    => [$resIds, $GLOBALS['id'], $userEntities, 'ALL_ENTITIES'],
             'groupBy' => ['folders.id', 'folders.label']
         ]);
         foreach ($rawFolders as $key => $value) {
-- 
GitLab