Skip to content
Snippets Groups Projects
Commit 0d97cb2d authored by Florian Azizian's avatar Florian Azizian
Browse files

FEAT #11296 TIME 3 sharing/deletion folders

parent 099d8c20
No related branches found
No related tags found
No related merge requests found
...@@ -21,6 +21,7 @@ use History\controllers\HistoryController; ...@@ -21,6 +21,7 @@ use History\controllers\HistoryController;
use Respect\Validation\Validator; use Respect\Validation\Validator;
use Slim\Http\Request; use Slim\Http\Request;
use Slim\Http\Response; use Slim\Http\Response;
use SrcCore\models\DatabaseModel;
use User\models\UserModel; use User\models\UserModel;
class FolderController class FolderController
...@@ -207,46 +208,63 @@ class FolderController ...@@ -207,46 +208,63 @@ class FolderController
return $response->withStatus(400)->withJson(['errors' => 'Body sharing/entities does not exists']); 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])) { 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([ FolderModel::update([
'set' => [ 'set' => [
'public' => empty($data['public']) ? 'false' : 'true', 'public' => empty($aArgs['public']) ? 'false' : 'true',
], ],
'where' => ['id = ?'], 'where' => ['id = ?'],
'data' => [$aArgs['id']] 'data' => [$aArgs['folderId']]
]); ]);
EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['id']]); EntityFolderModel::deleteByFolderId(['folder_id' => $aArgs['folderId']]);
// TODO unshare subfolders
if ($data['public'] && !empty($data['sharing']['entities'])) { if ($aArgs['public'] && !empty($aArgs['sharing']['entities'])) {
//TODO check entities exists foreach ($aArgs['sharing']['entities'] as $entity) {
foreach ($data['sharing']['entities'] as $entity) {
EntityFolderModel::create([ EntityFolderModel::create([
'folder_id' => $aArgs['id'], 'folder_id' => $aArgs['folderId'],
'entity_id' => $entity['entity_id'], 'entity_id' => $entity['entity_id'],
'edition' => $entity['edition'], 'edition' => $entity['edition'],
]); ]);
} }
// TODO share subfolders
} }
HistoryController::add([ $folderChild = FolderModel::getChild(['id' => $aArgs['folderId'], 'select' => ['id']]);
'tableName' => 'folders', if (!empty($folderChild)) {
'recordId' => $aArgs['id'], foreach ($folderChild as $child) {
'eventType' => 'UP', $sharing = FolderController::folderSharing(['folderId' => $child['id'], 'public' => $aArgs['public'], 'sharing' => $aArgs['sharing']]);
'info' => _FOLDER_SHARING_MODIFICATION . " : {$data['label']}", if (!$sharing) {
'moduleId' => 'folder', return false;
'eventId' => 'folderModification', }
]); }
}
return $response->withStatus(200); return true;
} }
public function delete(Request $request, Response $response, array $aArgs) public function delete(Request $request, Response $response, array $aArgs)
...@@ -256,17 +274,14 @@ class FolderController ...@@ -256,17 +274,14 @@ class FolderController
} }
$folder = FolderController::getScopeFolders(['login' => $GLOBALS['userId'], 'folderId' => $aArgs['id'], 'edition' => true]); $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 DatabaseModel::beginTransaction();
//TODO Delete resources folders $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([ HistoryController::add([
'tableName' => 'folder', 'tableName' => 'folder',
...@@ -280,6 +295,28 @@ class FolderController ...@@ -280,6 +295,28 @@ class FolderController
return $response->withStatus(200); 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 // login (string) : Login of user connected
// folderId (integer) : Check specific folder // folderId (integer) : Check specific folder
// edition (boolean) : whether user can edit or not // edition (boolean) : whether user can edit or not
...@@ -298,21 +335,22 @@ class FolderController ...@@ -298,21 +335,22 @@ class FolderController
$user = UserModel::getByLogin(['login' => $login, 'select' => ['id']]); $user = UserModel::getByLogin(['login' => $login, 'select' => ['id']]);
$where = ['user_id = ? OR entity_id in (?)']; if ($aArgs['edition']) {
$data = [$user['id'], $userEntities]; $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'])) { if (!empty($aArgs['folderId'])) {
$where[] = 'folders.id = ?'; $where[] = 'folders.id = ?';
$data[] = $aArgs['folderId']; $data[] = $aArgs['folderId'];
}
if ($aArgs['edition']) {
$where[] = 'entities_folders.edition in (?)';
$data[] = [true, null];
} }
$folders = FolderModel::get([ $folders = FolderModel::get([
'select' => ['folders.*'], 'select' => ['distinct (folders.id)', 'folders.*'],
'where' => $where, 'where' => $where,
'data' => $data, 'data' => $data,
'order_by' => ['level'] 'order_by' => ['level']
......
...@@ -52,6 +52,21 @@ class FolderModelAbstract ...@@ -52,6 +52,21 @@ class FolderModelAbstract
return $folder[0]; 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) public static function create(array $aArgs)
{ {
ValidatorModel::notEmpty($aArgs, ['user_id', 'label']); ValidatorModel::notEmpty($aArgs, ['user_id', 'label']);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment