From 7449973170c947fe663a3988dc81fc315b8d5e48 Mon Sep 17 00:00:00 2001
From: Guillaume Heurtier <guillaume.heurtier@maarch.org>
Date: Fri, 3 Apr 2020 14:39:08 +0200
Subject: [PATCH] FEAT #12091 TIME 2:00 fix get folder too long

---
 .../folder/controllers/FolderController.php   | 33 ++++++++++---------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/src/app/folder/controllers/FolderController.php b/src/app/folder/controllers/FolderController.php
index 191f0066fc4..f4ebf946a5c 100755
--- a/src/app/folder/controllers/FolderController.php
+++ b/src/app/folder/controllers/FolderController.php
@@ -132,16 +132,15 @@ class FolderController
         $folder['sharing']['entities'] = [];
         if ($folder['public']) {
             $entitiesFolder = EntityFolderModel::getEntitiesByFolderId(['folder_id' => $args['id'], 'select' => ['entities_folders.entity_id', 'entities_folders.edition', 'entities.entity_label']]);
+            $canDeleteWithChildren = FolderController::areChildrenInPerimeter(['folderId' => $args['id'], 'entities' => $userEntities]);
             foreach ($entitiesFolder as $value) {
-                $canDelete = FolderController::areChildrenInPerimeter(['folderId' => $args['id'], 'entities' => $userEntities]);
-                $canDelete = $canDelete && $value['edition'] == true;
+                $canDelete = $canDeleteWithChildren && $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'], 'entities' => $userEntities]);
-                $canDelete = $canDelete && $value['edition'] == true;
+                $canDelete = $canDeleteWithChildren && $value['edition'] == true;
                 $folder['sharing']['entities'][] = ['keyword' => $value['keyword'], 'edition' => $value['edition'], 'canDelete' => $canDelete];
             }
         }
@@ -620,7 +619,7 @@ class FolderController
 
     public static function areChildrenInPerimeter(array $args = [])
     {
-        ValidatorModel::notEmpty($args, ['folderId']);
+        ValidatorModel::notEmpty($args, ['folderId', 'entities']);
         ValidatorModel::intVal($args, ['folderId']);
         ValidatorModel::arrayType($args, ['entities']);
 
@@ -629,27 +628,31 @@ class FolderController
             return false;
         }
 
-        $where = ['parent_id = ?'];
-        $data = [$args['folderId']];
+        $folder = $folder[0];
+
+        // All sub-folders of a folders have the same owner user -> if user is owner of folder, all children are in perimeter
+        if ($folder['user_id'] == $GLOBALS['id']) {
+            return true;
+        }
 
         $children = FolderModel::getWithEntities([
-            'select' => ['distinct (folders.id)', 'edition', 'user_id', 'keyword', 'entity_id'],
-            'where'  => $where,
-            'data'   => $data
+            'select' => ['distinct (folders.id)', 'edition', 'user_id', 'keyword', 'entity_id', 'parent_id'],
+            'where'  => ['parent_id = ?', '(entity_id in (?) OR entity_id is null)'],
+            'data'   => [$args['folderId'], $args['entities']]
         ]);
 
-        $allEntitiesCanDelete = false;
+        $allEntitiesCanDelete = true;
         foreach ($children as $key => $child) {
-            if ($child['keyword'] == 'ALL_ENTITIES' && $child['edition'] == true) {
-                $allEntitiesCanDelete = true;
+            if (!($child['keyword'] == 'ALL_ENTITIES' && $child['edition'] == true)) {
+                $allEntitiesCanDelete = false;
+                break;
             }
         }
 
 
         if (!empty($children)) {
             foreach ($children as $child) {
-                if ($child['user_id'] != $GLOBALS['id'] && ($child['edition'] == false || $child['edition'] == null)
-                    && (($child['entity_id'] != null && !in_array($child['entity_id'], $args['entities'])) || !$allEntitiesCanDelete)) {
+                if ($child['user_id'] != $GLOBALS['id'] && ($child['edition'] != true) && (!$allEntitiesCanDelete)) {
                     return false;
                 }
                 if (!FolderController::areChildrenInPerimeter(['folderId' => $child['id'], 'entities' => $args['entities']])) {
-- 
GitLab