diff --git a/src/app/folder/controllers/FolderController.php b/src/app/folder/controllers/FolderController.php index bb5d7ccefca5ac1f402cc4b31039cffe0aa922ac..9dd3b05337020e0c0feabf0022e7524bdb728504 100755 --- a/src/app/folder/controllers/FolderController.php +++ b/src/app/folder/controllers/FolderController.php @@ -21,6 +21,7 @@ use History\controllers\HistoryController; use Respect\Validation\Validator; use Slim\Http\Request; use Slim\Http\Response; +use SrcCore\models\DatabaseModel; use User\models\UserModel; class FolderController @@ -207,46 +208,63 @@ class FolderController return $response->withStatus(400)->withJson(['errors' => 'Body sharing/entities does not exists']); } - $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $aArgs['id'], 'edition' => true]); + DatabaseModel::beginTransaction(); + $sharing = FolderController::folderSharing(['folderId' => $aArgs['id'], 'public' => $data['public'], 'sharing' => $data['sharing']]); + if (!$sharing) { + DatabaseModel::rollbackTransaction(); + return $response->withStatus(400)->withJson(['errors' => 'Can not share/unshare folder because almost one folder is out of your perimeter']); + } + DatabaseModel::commitTransaction(); + + HistoryController::add([ + 'tableName' => 'folders', + 'recordId' => $aArgs['id'], + 'eventType' => 'UP', + 'info' => _FOLDER_SHARING_MODIFICATION . " : {$data['label']}", + 'moduleId' => 'folder', + 'eventId' => 'folderModification', + ]); + + return $response->withStatus(200); + } + + public function folderSharing($aArgs = []) + { + $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $aArgs['folderId'], 'edition' => true]); if (empty($folder[0])) { - return $response->withStatus(400)->withJson(['errors' => 'Folder not found or out of your perimeter']); + return false; } - //TODO Check sub folder rights FolderModel::update([ 'set' => [ - 'public' => empty($data['public']) ? 'false' : 'true', + 'public' => empty($aArgs['public']) ? 'false' : 'true', ], 'where' => ['id = ?'], - 'data' => [$aArgs['id']] + 'data' => [$aArgs['folderId']] ]); - EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['id']]); - // TODO unshare subfolders + EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['folderId']]); - if ($data['public'] && !empty($data['sharing']['entities'])) { - //TODO check entities exists - - foreach ($data['sharing']['entities'] as $entity) { + if ($aArgs['public'] && !empty($aArgs['sharing']['entities'])) { + foreach ($aArgs['sharing']['entities'] as $entity) { EntityFolderModel::create([ - 'folder_id' => $aArgs['id'], + 'folder_id' => $aArgs['folderId'], 'entity_id' => $entity['entity_id'], 'edition' => $entity['edition'], ]); } - // TODO share subfolders } - HistoryController::add([ - 'tableName' => 'folders', - 'recordId' => $aArgs['id'], - 'eventType' => 'UP', - 'info' => _FOLDER_SHARING_MODIFICATION . " : {$data['label']}", - 'moduleId' => 'folder', - 'eventId' => 'folderModification', - ]); - - return $response->withStatus(200); + $folderChild = FolderModel::getChild(['id' => $aArgs['folderId'], 'select' => ['id']]); + if (!empty($folderChild)) { + foreach ($folderChild as $child) { + $sharing = FolderController::folderSharing(['folderId' => $child['id'], 'public' => $aArgs['public'], 'sharing' => $aArgs['sharing']]); + if (!$sharing) { + return false; + } + } + } + return true; } public function delete(Request $request, Response $response, array $aArgs) @@ -256,17 +274,14 @@ class FolderController } $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $aArgs['id'], 'edition' => true]); - if (empty($folder[0])) { - return $response->withStatus(400)->withJson(['errors' => 'Folder not found or out of your perimeter']); - } - - //TODO Check sub folder rights - - FolderModel::delete(['where' => ['id = ?'], 'data' => [$aArgs['id']]]); - EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['id']]); - //TODO Delete sub folders - //TODO Delete resources folders + DatabaseModel::beginTransaction(); + $deletion = FolderController::folderDeletion(['folderId' => $aArgs['id']]); + if (!$deletion) { + DatabaseModel::rollbackTransaction(); + return $response->withStatus(400)->withJson(['errors' => 'Can not delete because almost one folder is out of your perimeter']); + } + DatabaseModel::commitTransaction(); HistoryController::add([ 'tableName' => 'folder', @@ -280,6 +295,28 @@ class FolderController return $response->withStatus(200); } + public function folderDeletion($aArgs = []) + { + $folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $aArgs['folderId'], 'edition' => true]); + if (empty($folder[0])) { + return false; + } + + FolderModel::delete(['where' => ['id = ?'], 'data' => [$aArgs['folderId']]]); + EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['folderId']]); + + $folderChild = FolderModel::getChild(['id' => $aArgs['folderId'], 'select' => ['id']]); + if (!empty($folderChild)) { + foreach ($folderChild as $child) { + $deletion = FolderController::folderDeletion(['folderId' => $child['id']]); + if (!$deletion) { + return false; + } + } + } + return true; + } + // login (string) : Login of user connected // folderId (integer) : Check specific folder // edition (boolean) : whether user can edit or not @@ -298,21 +335,22 @@ class FolderController $user = UserModel::getByLogin(['login' => $login, 'select' => ['id']]); - $where = ['user_id = ? OR entity_id in (?)']; - $data = [$user['id'], $userEntities]; + if ($aArgs['edition']) { + $edition = [true]; + } else { + $edition = ['false', 'true', null]; + } + + $where = ['(user_id = ? OR (entity_id in (?) AND entities_folders.edition in (?)))']; + $data = [$user['id'], $userEntities, $edition]; if (!empty($aArgs['folderId'])) { $where[] = 'folders.id = ?'; - $data[] = $aArgs['folderId']; - } - - if ($aArgs['edition']) { - $where[] = 'entities_folders.edition in (?)'; - $data[] = [true, null]; + $data[] = $aArgs['folderId']; } $folders = FolderModel::get([ - 'select' => ['folders.*'], + 'select' => ['distinct (folders.id)', 'folders.*'], 'where' => $where, 'data' => $data, 'order_by' => ['level'] diff --git a/src/app/folder/models/FolderModelAbstract.php b/src/app/folder/models/FolderModelAbstract.php index 066b746a933e6aebd720dccde10aa804718d8c30..1e08a64ac0c1d9858dbbed7ba15a1fb9d6f08818 100755 --- a/src/app/folder/models/FolderModelAbstract.php +++ b/src/app/folder/models/FolderModelAbstract.php @@ -52,6 +52,21 @@ class FolderModelAbstract return $folder[0]; } + public static function getChild(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['id']); + ValidatorModel::intVal($aArgs, ['id']); + + $folders = DatabaseModel::select([ + 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], + 'table' => ['folders'], + 'where' => ['parent_id = ?'], + 'data' => [$aArgs['id']] + ]); + + return $folders; + } + public static function create(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['user_id', 'label']);