diff --git a/rest/index.php b/rest/index.php index ec5787f096149d62a953ffe3a0d39474f8336755..60170a7194c9950adee57ce773eee2d7f92e6d19 100755 --- a/rest/index.php +++ b/rest/index.php @@ -248,7 +248,6 @@ $app->put('/reports/groups/{groupId}', \Report\controllers\ReportController::cla //Resources $app->post('/resources', \Resource\controllers\ResController::class . ':create'); -$app->put('/resources/lock', \Resource\controllers\ResController::class . ':lock'); $app->post('/res', \Resource\controllers\ResController::class . ':createRes'); $app->post('/resExt', \Resource\controllers\ResController::class . ':createExt'); $app->get('/res/{resId}/content', \Resource\controllers\ResController::class . ':getFileContent'); @@ -264,6 +263,7 @@ $app->get('/resources/{resId}/isAllowed', \Resource\controllers\ResController::c //ResourcesList $app->get('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}', \Resource\controllers\ResourceListController::class . ':get'); $app->get('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/actions', \Resource\controllers\ResourceListController::class . ':getActions'); +$app->put('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/lock', \Resource\controllers\ResourceListController::class . ':lock'); $app->get('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/filters', \Resource\controllers\ResourceListController::class . ':getFilters'); $app->put('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/exports', \Resource\controllers\ExportController::class . ':updateExport'); $app->post('/resourcesList/users/{userId}/groups/{groupId}/baskets/{basketId}/summarySheets', \Resource\controllers\SummarySheetController::class . ':createList'); diff --git a/src/app/resource/controllers/ExportController.php b/src/app/resource/controllers/ExportController.php index b99358e44baa2075a6703357e85a86bbf102e76e..b9d7804aa9cd0afa0edfa7875a40785da5d952cf 100644 --- a/src/app/resource/controllers/ExportController.php +++ b/src/app/resource/controllers/ExportController.php @@ -91,7 +91,8 @@ class ExportController $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]); $rawResourcesInBasket = ResModel::getOnView([ 'select' => ['res_id'], - 'where' => [$whereClause] + 'where' => [$whereClause, 'res_view_letterbox.res_id in (?)'], + 'data' => [$body['resources']] ]); $allResourcesInBasket = []; foreach ($rawResourcesInBasket as $resource) { diff --git a/src/app/resource/controllers/ResourceListController.php b/src/app/resource/controllers/ResourceListController.php index ecb9fc39387c44b4997f1323b37b963f338ded7e..062cb239d9ab68df12cda46e037e0b5b295e3c6b 100644 --- a/src/app/resource/controllers/ResourceListController.php +++ b/src/app/resource/controllers/ResourceListController.php @@ -29,6 +29,7 @@ use Priority\models\PriorityModel; use Resource\models\ResModel; use Resource\models\ResourceContactModel; use Resource\models\ResourceListModel; +use Respect\Validation\Validator; use Slim\Http\Request; use Slim\Http\Response; use SrcCore\controllers\AutoCompleteController; @@ -555,6 +556,67 @@ class ResourceListController return $response->withJson(['actions' => $actions]); } + public function lock(Request $request, Response $response, array $aArgs) + { + $body = $request->getParsedBody(); + if (!Validator::arrayType()->notEmpty()->validate($body['resources'])) { + return $response->withStatus(400)->withJson(['errors' => 'Data resources is empty or not an array']); + } + + $currentUser = UserModel::getByLogin(['login' => $GLOBALS['userId'], 'select' => ['id']]); + $errors = ResourceListController::listControl(['groupId' => $aArgs['groupId'], 'userId' => $aArgs['userId'], 'basketId' => $aArgs['basketId'], 'currentUserId' => $currentUser['id']]); + if (!empty($errors['errors'])) { + return $response->withStatus($errors['code'])->withJson(['errors' => $errors['errors']]); + } + + $basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause']]); + $user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]); + + $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]); + $resources = ResModel::getOnView([ + 'select' => ['res_id', 'locker_user_id', 'locker_time'], + 'where' => [$whereClause, 'res_view_letterbox.res_id in (?)'], + 'data' => [$body['resources']] + ]); + $resourcesInBasket = []; + foreach ($resources as $resource) { + $resourcesInBasket[] = $resource['res_id']; + } + + foreach ($body['resources'] as $resId) { + if (!in_array($resId, $resourcesInBasket)) { + return $response->withStatus(403)->withJson(['errors' => 'Resources out of perimeter']); + } + } + + $locked = 0; + $resourcesToLock = []; + foreach ($resources as $key => $resource) { + $lock = true; + if (empty($resource['locker_user_id'] || empty($resource['locker_time']))) { + $lock = false; + } elseif ($resource['locker_user_id'] == $currentUser['id']) { + $lock = false; + } elseif (strtotime($resource['locker_time']) < time()) { + $lock = false; + } + + if (!$lock) { + $resourcesToLock[] = $resource['res_id']; + } else { + ++$locked; + } + } + + ResModel::update([ + 'set' => ['locker_user_id' => $currentUser['id'], 'locker_time' => 'CURRENT_TIMESTAMP + interval \'1\' MINUTE'], + 'where' => ['res_id in (?)'], + 'data' => [$resourcesToLock] + ]); + + return $response->withJson(['lockedResources' => $locked]); + } + public static function listControl(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['groupId', 'userId', 'basketId', 'currentUserId']); diff --git a/src/app/resource/controllers/SummarySheetController.php b/src/app/resource/controllers/SummarySheetController.php index a03f91719f5dea61aacd6d1a38cab2456575d7f3..3561704be3cba84bae15d8ea6a73b4856c18219d 100644 --- a/src/app/resource/controllers/SummarySheetController.php +++ b/src/app/resource/controllers/SummarySheetController.php @@ -63,7 +63,8 @@ class SummarySheetController $whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]); $rawResourcesInBasket = ResModel::getOnView([ 'select' => ['res_id'], - 'where' => [$whereClause] + 'where' => [$whereClause, 'res_view_letterbox.res_id in (?)'], + 'data' => [$bodyData['resources']] ]); $allResourcesInBasket = []; foreach ($rawResourcesInBasket as $resource) { diff --git a/src/frontend/app/signature-book.component.ts b/src/frontend/app/signature-book.component.ts index de33361a687d56d413602058b5b95a66b434511b..a98e7f5618524adb997a6ab73ee1408dea962e7e 100755 --- a/src/frontend/app/signature-book.component.ts +++ b/src/frontend/app/signature-book.component.ts @@ -487,6 +487,7 @@ export class SignatureBookComponent implements OnInit { } changeLocation(resId: number, origin: string) { + //TODO Refonte route isLock this.http.put(this.coreUrl + 'rest/resources/lock', {resources : [resId]}) .subscribe(() => { let path = "/groups/" + this.groupId + "/baskets/" + this.basketId + '/signatureBook/' + resId;