Skip to content
Snippets Groups Projects
Verified Commit d2bed040 authored by Damien's avatar Damien
Browse files

FEAT #8956 Improve list

parent 918b7036
No related branches found
No related tags found
No related merge requests found
......@@ -240,9 +240,9 @@ $app->get('/res/{resId}/notes/count', \Resource\controllers\ResController::class
$app->put('/res/externalInfos', \Resource\controllers\ResController::class . ':updateExternalInfos');
$app->get('/categories', \Resource\controllers\ResController::class . ':getCategories');
$app->get('/natures', \Resource\controllers\ResController::class . ':getNatures');
$app->get('/resources/groups/{groupSerialId}/baskets/{basketId}', \Resource\controllers\ResController::class . ':getResourcesByBasket');
$app->get('/resources/{resId}/isAllowed', \Resource\controllers\ResController::class . ':isAllowedForCurrentUser');
$app->get('/resourcesList/users/{userId}/groups/{groupSerialId}/baskets/{basketId}', \Resource\controllers\ResourceListController::class . ':get');
//Attachments
$app->post('/attachments', \Attachment\controllers\AttachmentController::class . ':create');
......
......@@ -17,6 +17,7 @@ namespace Resource\controllers;
use Attachment\models\AttachmentModel;
use Basket\models\BasketModel;
use Basket\models\GroupBasketModel;
use Basket\models\RedirectBasketModel;
use Convert\controllers\ConvertPdfController;
use Convert\controllers\ConvertThumbnailController;
use Convert\models\AdrModel;
......@@ -451,50 +452,6 @@ class ResController
return $response->withHeader('Content-Type', $mimeType);
}
public function getResourcesByBasket(Request $request, Response $response, array $aArgs)
{
$data = $request->getQueryParams();
if (empty($data['offset']) || !is_numeric($data['offset'])) {
$data['offset'] = 0;
}
if (empty($data['limit']) || !is_numeric($data['limit'])) {
$data['limit'] = 0;
}
$group = GroupModel::getById(['id' => $aArgs['groupSerialId'], 'select' => ['group_id']]);
$basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order']]);
if (empty($group) || empty($basket)) {
return $response->withStatus(400)->withJson(['errors' => 'Group or basket does not exist']);
}
$groups = UserModel::getGroupsByUserId(['userId' => $GLOBALS['userId']]);
$groupFound = false;
foreach ($groups as $value) {
if ($value['id'] == $aArgs['groupSerialId']) {
$groupFound = true;
}
}
if (!$groupFound) {
return $response->withStatus(400)->withJson(['errors' => 'Group is not linked to this user']);
}
$isBasketLinked = GroupBasketModel::get(['select' => [1], 'where' => ['basket_id = ?', 'group_id = ?'], 'data' => [$aArgs['basketId'], $group['group_id']]]);
if (empty($isBasketLinked)) {
return $response->withStatus(400)->withJson(['errors' => 'Group is not linked to this basket']);
}
$whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $GLOBALS['userId']]);
$list = ResModel::getForList([
'clause' => $whereClause,
'orderBy' => ["{$basket['basket_res_order']} DESC"],
'offset' => (int)$data['offset'],
'limit' => (int)$data['limit'],
]);
return $response->withJson(['resources' => $list['resources'], 'count' => $list['count']]);
}
public function updateExternalInfos(Request $request, Response $response)
{
$data = $request->getParams();
......
<?php
/**
* Copyright Maarch since 2008 under licence GPLv3.
* See LICENCE.txt file at the root folder for more details.
* This file is part of Maarch software.
*
*/
/**
* @brief Resource List Controller
* @author dev@maarch.org
*/
namespace Resource\controllers;
use Basket\models\BasketModel;
use Basket\models\GroupBasketModel;
use Basket\models\RedirectBasketModel;
use Group\models\GroupModel;
use Resource\models\ResModel;
use Slim\Http\Request;
use Slim\Http\Response;
use SrcCore\controllers\PreparedClauseController;
use User\models\UserModel;
class ResourceListController
{
public function get(Request $request, Response $response, array $aArgs)
{
$data = $request->getQueryParams();
if (empty($data['offset']) || !is_numeric($data['offset'])) {
$data['offset'] = 0;
}
if (empty($data['limit']) || !is_numeric($data['limit'])) {
$data['limit'] = 0;
}
$group = GroupModel::getById(['id' => $aArgs['groupSerialId'], 'select' => ['group_id']]);
$basket = BasketModel::getById(['id' => $aArgs['basketId'], 'select' => ['basket_clause', 'basket_res_order']]);
if (empty($group) || empty($basket)) {
return $response->withStatus(400)->withJson(['errors' => 'Group or basket does not exist']);
}
$user = UserModel::getById(['id' => $aArgs['userId'], 'select' => ['user_id']]);
if ($user['user_id'] == $GLOBALS['userId']) {
$redirectedBasket = RedirectBasketModel::get([
'select' => [1],
'where' => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'],
'data' => [$aArgs['userId'], $aArgs['basketId'], $aArgs['groupSerialId']]
]);
if (!empty($redirectedBasket[0])) {
return $response->withStatus(403)->withJson(['errors' => 'Basket out of perimeter (redirected)']);
}
} else {
$currentUser = UserModel::getByUserId(['userId' => $GLOBALS['userId'], 'select' => ['id']]);
$redirectedBasket = RedirectBasketModel::get([
'select' => ['actual_user_id'],
'where' => ['owner_user_id = ?', 'basket_id = ?', 'group_id = ?'],
'data' => [$aArgs['userId'], $aArgs['basketId'], $aArgs['groupSerialId']]
]);
if (empty($redirectedBasket[0]) || $redirectedBasket[0]['actual_user_id'] != $currentUser['id']) {
return $response->withStatus(403)->withJson(['errors' => 'Basket out of perimeter']);
}
}
$groups = UserModel::getGroupsByUserId(['userId' => $user['user_id']]);
$groupFound = false;
foreach ($groups as $value) {
if ($value['id'] == $aArgs['groupSerialId']) {
$groupFound = true;
}
}
if (!$groupFound) {
return $response->withStatus(400)->withJson(['errors' => 'Group is not linked to this user']);
}
$isBasketLinked = GroupBasketModel::get(['select' => [1], 'where' => ['basket_id = ?', 'group_id = ?'], 'data' => [$aArgs['basketId'], $group['group_id']]]);
if (empty($isBasketLinked)) {
return $response->withStatus(400)->withJson(['errors' => 'Group is not linked to this basket']);
}
//END OF CONTROL
$whereClause = PreparedClauseController::getPreparedClause(['clause' => $basket['basket_clause'], 'login' => $user['user_id']]);
$rawResources = ResModel::getOnView([
'select' => ['count(1) OVER()', 'res_id'],
'where' => [$whereClause],
'order_by' => [$basket['basket_res_order']],
'offset' => (int)$data['offset'],
'limit' => (int)$data['limit']
]);
$count = empty($rawResources[0]['count']) ? 0 : $rawResources[0]['count'];
$resIds = [];
foreach ($rawResources as $resource) {
$resIds[] = $resource['res_id'];
}
$resources = ResModel::getForList(['resIds' => $resIds]);
return $response->withJson(['resources' => $resources, 'count' => $count]);
}
}
......@@ -41,62 +41,49 @@ abstract class ResModelAbstract
public static function getForList(array $aArgs)
{
ValidatorModel::arrayType($aArgs, ['orderBy']);
ValidatorModel::stringType($aArgs, ['clause']);
ValidatorModel::intType($aArgs, ['limit', 'offset']);
ValidatorModel::notEmpty($aArgs, ['resIds']);
ValidatorModel::arrayType($aArgs, ['resIds']);
$resources = ResModel::getOnView([
$resources = DatabaseModel::select([
'select' => [
'count(1) OVER()',
'res_id'
'res_letterbox.res_id',
'res_letterbox.subject',
'res_letterbox.creation_date',
'mlb_coll_ext.alt_identifier',
'mlb_coll_ext.category_id',
'mlb_coll_ext.closing_date',
'mlb_coll_ext.process_limit_date',
'entities.entity_label as entity_destination',
'doctypes.description as doctype_label',
'contacts_v2.firstname as contact_firstname',
'contacts_v2.lastname as contact_lastname',
'contacts_v2.society as contact_society',
'users.firstname as user_firstname',
'users.lastname as user_lastname',
'priorities.color as priority_color',
'priorities.label as priority_label',
'status.img_filename as status_icon',
'status.label_status as status_label',
'status.id as status_id',
'us.lastname as user_dest_lastname',
'us.firstname as user_dest_firstname',
],
'where' => [$aArgs['clause']],
'data' => [],
'order_by' => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'],
'offset' => empty($aArgs['offset']) ? 0 : $aArgs['offset'],
'limit' => empty($aArgs['limit']) ? 0 : $aArgs['limit']
'table' => ['res_letterbox', 'mlb_coll_ext', 'entities', 'doctypes', 'contacts_v2', 'users', 'priorities', 'status', 'users us'],
'left_join' => [
'res_letterbox.res_id = mlb_coll_ext.res_id',
'res_letterbox.destination = entities.entity_id',
'res_letterbox.type_id = doctypes.type_id',
'mlb_coll_ext.exp_contact_id = contacts_v2.contact_id OR mlb_coll_ext.dest_contact_id = contacts_v2.contact_id',
'mlb_coll_ext.exp_user_id = users.user_id OR mlb_coll_ext.dest_user_id = users.user_id',
'res_letterbox.priority = priorities.id',
'res_letterbox.status = status.id',
'res_letterbox.dest_user = us.user_id'
],
'where' => ['res_letterbox.res_id in (?)'],
'data' => [$aArgs['resIds']]
]);
$count = empty($resources[0]['count']) ? 0 : $resources[0]['count'];
$resIds = [];
foreach ($resources as $resource) {
$resIds[] = $resource['res_id'];
}
if (!empty($resIds)) {
$resources = DatabaseModel::select([
'select' => [
'res_id',
'subject',
'alt_identifier',
'category_id',
'closing_date',
'category_id',
'contact_firstname',
'contact_lastname',
'contact_society',
'user_lastname',
'user_firstname',
'creation_date',
'entity_label as entity_destination',
'process_limit_date',
'type_label as doctype_label',
'priorities.color as priority_color',
'priorities.label as priority_label',
'status.img_filename as status_icon',
'status.label_status as status_label',
'status.id as status_id',
'users.lastname as user_dest_lastname',
'users.firstname as user_dest_firstname',
],
'table' => ['res_view_letterbox, priorities, status, users'],
'where' => ['res_view_letterbox.res_id in (?)', 'res_view_letterbox.priority = priorities.id', 'res_view_letterbox.status = status.id', 'res_view_letterbox.dest_user = users.user_id'],
'data' => [$resIds]
]);
}
return ['resources' => $resources, 'count' => $count];
return $resources;
}
public static function get(array $aArgs)
......
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