diff --git a/rest/index.php b/rest/index.php index b5e0fd13a0fdea4bcd6ffe9f31fdb4aba4f4ce17..1cfc9eae17e208699ef6739485cbfdab63c07861 100755 --- a/rest/index.php +++ b/rest/index.php @@ -127,6 +127,8 @@ $app->post('/baskets/{id}/groups', \Basket\controllers\BasketController::class . $app->put('/baskets/{id}/groups/{groupId}', \Basket\controllers\BasketController::class . ':updateGroup'); $app->delete('/baskets/{id}/groups/{groupId}', \Basket\controllers\BasketController::class . ':deleteGroup'); $app->get('/baskets/{id}/groups/data', \Basket\controllers\BasketController::class . ':getDataForGroupById'); +$app->get('/sortedBaskets', \Basket\controllers\BasketController::class . ':getSorted'); +$app->put('/sortedBaskets/{id}', \Basket\controllers\BasketController::class . ':updateSorted'); //status $app->get('/administration/status', \Core\Controllers\StatusController::class . ':getList'); diff --git a/src/app/basket/controllers/BasketController.php b/src/app/basket/controllers/BasketController.php index e431b2a46862d7dbe7bc44d43d63abe2674631d4..dcd7c24a49bff591e8b009d6cd4ab06178c2f509 100644 --- a/src/app/basket/controllers/BasketController.php +++ b/src/app/basket/controllers/BasketController.php @@ -123,6 +123,94 @@ class BasketController return $response->withJson(['baskets' => BasketModel::get()]); } + public function getSorted(Request $request, Response $response) + { + if (!ServiceModel::hasService(['id' => 'admin_baskets', 'userId' => $GLOBALS['userId'], 'location' => 'basket', 'type' => 'admin'])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + + $baskets = BasketModel::get([ + 'select' => ['basket_id', 'basket_name', 'basket_desc', 'basket_order'], + 'where' => ['is_visible = ?'], + 'data' => ['Y'], + 'orderBy' => ['basket_order'] + ]); + + return $response->withJson(['baskets' => $baskets]); + } + + public function updateSorted(Request $request, Response $response, $aArgs) + { + if (!ServiceModel::hasService(['id' => 'admin_baskets', 'userId' => $GLOBALS['userId'], 'location' => 'basket', 'type' => 'admin'])) { + return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']); + } + + $theBasket = BasketModel::getById(['id' => $aArgs['id'], 'select' => ['basket_order']]); + if (empty($theBasket)) { + return $response->withStatus(400)->withJson(['errors' => 'Basket not found']); + } + + $data = $request->getParams(); + + $allowedMethods = ['UP', 'DOWN']; + $allowedPowers = ['ONE', 'ALL']; + $check = Validator::stringType()::notEmpty()->validate($data['method']) && in_array($data['method'], $allowedMethods); + $check = $check && Validator::stringType()::notEmpty()->validate($data['power']) && in_array($data['power'], $allowedPowers); + if (!$check) { + return $response->withStatus(400)->withJson(['errors' => 'Bad Request']); + } + + $baskets = BasketModel::get([ + 'select' => ['basket_id'], + 'where' => ['is_visible = ?'], + 'data' => ['Y'], + 'orderBy' => ['basket_order'] + ]); + if (($data['method'] == 'UP' && $baskets[0]['basket_id'] == $aArgs['id']) || ($data['method'] == 'DOWN' && $baskets[count($baskets) - 1]['basket_id'] == $aArgs['id'])) { + return $response->withStatus(400)->withJson(['errors' => 'Basket is already sorted']); + } + + $basketsToUpdate = []; + foreach ($baskets as $key => $basket) { + if ($basket['basket_id'] == $aArgs['id']) + continue; + if ($data['method'] == 'UP' && $data['power'] == 'ALL') { + if ($key == 0) { + $basketsToUpdate[] = $aArgs['id']; + } + $basketsToUpdate[] = $basket['basket_id']; + } elseif ($data['method'] == 'UP' && $data['power'] == 'ONE') { + if (!empty($baskets[$key + 1]) && $baskets[$key + 1]['basket_id'] == $aArgs['id']) { + $basketsToUpdate[] = $aArgs['id']; + } + $basketsToUpdate[] = $basket['basket_id']; + } elseif ($data['method'] == 'DOWN' && $data['power'] == 'ALL') { + $basketsToUpdate[] = $basket['basket_id']; + if (count($baskets) == $key + 1) { + $basketsToUpdate[] = $aArgs['id']; + } + } elseif ($data['method'] == 'DOWN' && $data['power'] == 'ONE') { + $basketsToUpdate[] = $basket['basket_id']; + if (!empty($baskets[$key - 1]) && $baskets[$key - 1]['basket_id'] == $aArgs['id']) { + $basketsToUpdate[] = $aArgs['id']; + } + } + } + + foreach ($basketsToUpdate as $key => $basketToUpdate) { + BasketModel::updateOrder(['id' => $basketToUpdate, 'order' => $key + 1]); + } + + $baskets = BasketModel::get([ + 'select' => ['basket_id', 'basket_name', 'basket_desc', 'basket_order'], + 'where' => ['is_visible = ?'], + 'data' => ['Y'], + 'orderBy' => ['basket_order'] + ]); + + return $response->withJson(['baskets' => $baskets]); + } + public function getGroups(Request $request, Response $response, $aArgs) { if (!ServiceModel::hasService(['id' => 'admin_baskets', 'userId' => $GLOBALS['userId'], 'location' => 'basket', 'type' => 'admin'])) { diff --git a/src/app/basket/models/BasketModelAbstract.php b/src/app/basket/models/BasketModelAbstract.php index 837d4bbd719e82e2a74af9ad9176aa0afc80bc18..d200ba6acdf5c1442d29047caaf9d7cfc8439ebf 100644 --- a/src/app/basket/models/BasketModelAbstract.php +++ b/src/app/basket/models/BasketModelAbstract.php @@ -26,11 +26,14 @@ class BasketModelAbstract { public static function get(array $aArgs = []) { - ValidatorModel::arrayType($aArgs, ['select']); + ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']); $aBaskets = DatabaseModel::select([ 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], - 'table' => ['baskets'] + 'table' => ['baskets'], + 'where' => $aArgs['where'], + 'data' => $aArgs['data'], + 'order_by' => $aArgs['orderBy'] ]); return $aBaskets; @@ -99,6 +102,24 @@ class BasketModelAbstract return true; } + public static function updateOrder(array $aArgs) + { + ValidatorModel::notEmpty($aArgs, ['id', 'order']); + ValidatorModel::stringType($aArgs, ['id']); + ValidatorModel::intVal($aArgs, ['order']); + + DatabaseModel::update([ + 'table' => 'baskets', + 'set' => [ + 'basket_order' => $aArgs['order'] + ], + 'where' => ['basket_id = ?'], + 'data' => [$aArgs['id']] + ]); + + return true; + } + public static function delete(array $aArgs) { ValidatorModel::notEmpty($aArgs, ['id']);