Newer
Older
<?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 Link Controller
* @author dev@maarch.org
*/
namespace Resource\controllers;
use Contact\controllers\ContactController;
use Contact\models\ContactModel;
use Convert\controllers\ConvertPdfController;
use Entity\models\EntityModel;
use Entity\models\ListInstanceModel;
use Group\controllers\PrivilegeController;
use History\controllers\HistoryController;
use Resource\models\ResModel;
use Resource\models\ResourceContactModel;
use Respect\Validation\Validator;
use Slim\Http\Request;
use Slim\Http\Response;
use Status\models\StatusModel;
use User\models\UserModel;
class LinkController
{
public function getLinkedResources(Request $request, Response $response, array $args)
{
if (!Validator::intVal()->validate($args['resId']) || !ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Resource out of perimeter']);
}
$resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['linked_resources']]);
$linkedResourcesIds = json_decode($resource['linked_resources'], true);
$linkedResources = [];
if (!empty($linkedResourcesIds)) {
$linkedResourcesIds = ResController::getAuthorizedResources(['resources' => $linkedResourcesIds, 'userId' => $GLOBALS['id']]);
if (!empty($linkedResourcesIds)) {
$linkedResources = ResModel::get([
'select' => ['res_id as "resId"', 'subject', 'doc_date as "documentDate"', 'status', 'dest_user as "destUser"', 'destination', 'alt_identifier as chrono', 'category_id as "categoryId"', 'filename', 'format', 'confidentiality'],
'where' => ['res_id in (?)'],
'data' => [$linkedResourcesIds]
]);
}
foreach ($linkedResources as $key => $value) {
$linkedResources[$key]['hasDocument'] = !empty($value['filename']);
$linkedResources[$key]['confidentiality'] = $value['confidentiality'] == 'Y';
if (!empty($value['status'])) {
$status = StatusModel::getById(['id' => $value['status'], 'select' => ['label_status', 'img_filename']]);
$linkedResources[$key]['statusLabel'] = $status['label_status'];
$linkedResources[$key]['statusImage'] = $status['img_filename'];
}
if (!empty($value['destUser'])) {
$linkedResources[$key]['destUserLabel'] = UserModel::getLabelledUserById(['id' => $value['destUser']]);
}
if (!empty($value['destination'])) {
$linkedResources[$key]['destinationLabel'] = EntityModel::getByEntityId(['entityId' => $value['destination'], 'select' => ['short_label']])['short_label'];
}
$correspondents = ResourceContactModel::get([
'select' => ['item_id', 'type', 'mode'],
'where' => ['res_id = ?'],
'data' => [$value['resId']]
]);
$linkedResources[$key]['senders'] = [];
$linkedResources[$key]['recipients'] = [];
foreach ($correspondents as $correspondent) {
if ($correspondent['res_id'] == $resource['resId']) {
if ($correspondent['type'] == 'contact') {
$contactRaw = ContactModel::getById(['select' => ['firstname', 'lastname', 'company'], 'id' => $correspondent['item_id']]);
$contactToDisplay = ContactController::getFormattedOnlyContact(['contact' => $contactRaw]);
$formattedCorrespondent = $contactToDisplay['contact']['otherInfo'];
} elseif ($correspondent['type'] == 'user') {
$formattedCorrespondent = UserModel::getLabelledUserById(['id' => $correspondent['item_id']]);
} else {
$entity = EntityModel::getById(['id' => $correspondent['item_id'], 'select' => ['entity_label']]);
$formattedCorrespondent = $entity['entity_label'];
}
$linkedResources[$key]["{$correspondent['mode']}s"][] = $formattedCorrespondent;
}
}
$linkedResources[$key]['visaCircuit'] = ListInstanceModel::get(['select' => ['item_id', 'item_mode'], 'where' => ['res_id = ?', 'difflist_type = ?'], 'data' => [$value['resId'], 'VISA_CIRCUIT']]);
foreach ($linkedResources[$key]['visaCircuit'] as $keyCircuit => $valueCircuit) {
$linkedResources[$key]['visaCircuit'][$keyCircuit]['userLabel'] = UserModel::getLabelledUserById(['id' => $valueCircuit['item_id']]);
$linkedResources[$key]['canConvert'] = false;
if (!empty($value['format'])) {
$linkedResources[$key]['canConvert'] = ConvertPdfController::canConvert(['extension' => $value['format']]);
}
}
}
return $response->withJson(['linkedResources' => $linkedResources]);
}
public function linkResources(Request $request, Response $response, array $args)
{
if (!PrivilegeController::hasPrivilege(['privilegeId' => 'add_links', 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
}
if (!Validator::intVal()->validate($args['resId']) || !ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Resource out of perimeter']);
}
$body = $request->getParsedBody();
if (!Validator::arrayType()->notEmpty()->validate($body['linkedResources'])) {
return $response->withStatus(403)->withJson(['errors' => 'Body linkedResources is empty or not an array']);
} elseif (!ResController::hasRightByResId(['resId' => $body['linkedResources'], 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Body linkedResources out of perimeter']);
} elseif (in_array($args['resId'], $body['linkedResources'])) {
return $response->withStatus(400)->withJson(['errors' => 'Body linkedResources contains resource']);
$resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['linked_resources', 'alt_identifier']]);
$linkedResources = json_decode($resource['linked_resources'], true);
$linkedResources = array_merge($linkedResources, $body['linkedResources']);
$linkedResources = array_unique($linkedResources);
foreach ($linkedResources as $key => $value) {
$linkedResources[$key] = (string)$value;
}
ResModel::update([
'set' => ['linked_resources' => json_encode($linkedResources)],
'where' => ['res_id = ?'],
'data' => [$args['resId']]
]);
ResModel::update([
'postSet' => ['linked_resources' => "jsonb_insert(linked_resources, '{0}', '\"{$args['resId']}\"')"],
'where' => ['res_id in (?)', "(linked_resources @> ?) = false"],
'data' => [$body['linkedResources'], "\"{$args['resId']}\""]
]);
$linkedResourcesInfo = ResModel::get([
'select' => ['alt_identifier', 'res_id'],
'where' => ['res_id in (?)'],
'data' => [$body['linkedResources']]
]);
$linkedResourcesAltIdentifier = array_column($linkedResourcesInfo, 'alt_identifier', 'res_id');
foreach ($body['linkedResources'] as $value) {
HistoryController::add([
'tableName' => 'res_letterbox',
'recordId' => $args['resId'],
'eventType' => 'UP',
'info' => _LINK_ADDED . " : {$linkedResourcesAltIdentifier[$value]}",
'moduleId' => 'resource',
'eventId' => 'resourceModification'
]);
HistoryController::add([
'tableName' => 'res_letterbox',
'recordId' => $value,
'eventType' => 'UP',
'info' => _LINK_ADDED . " : {$resource['alt_identifier']}",
'moduleId' => 'resource',
'eventId' => 'resourceModification'
]);
}
return $response->withStatus(204);
}
public function unlinkResources(Request $request, Response $response, array $args)
{
if (!PrivilegeController::hasPrivilege(['privilegeId' => 'add_links', 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
}
if (!Validator::intVal()->validate($args['resId']) || !ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Resource out of perimeter']);
}
if (!Validator::intVal()->validate($args['id']) || !ResController::hasRightByResId(['resId' => [$args['id']], 'userId' => $GLOBALS['id']])) {
return $response->withStatus(403)->withJson(['errors' => 'Resource to unlink out of perimeter']);
}
ResModel::update([
'postSet' => ['linked_resources' => "linked_resources - '{$args['id']}'"],
'where' => ['res_id = ?'],
'data' => [$args['resId']]
]);
ResModel::update([
'postSet' => ['linked_resources' => "linked_resources - '{$args['resId']}'"],
'where' => ['res_id = ?'],
'data' => [$args['id']]
]);
$linkedResourcesInfo = ResModel::get([
'select' => ['alt_identifier', 'res_id'],
'where' => ['res_id in (?)'],
'data' => [[$args['resId'], $args['id']]]
]);
$linkedResourcesAltIdentifier = array_column($linkedResourcesInfo, 'alt_identifier', 'res_id');
HistoryController::add([
'tableName' => 'res_letterbox',
'recordId' => $args['resId'],
'eventType' => 'UP',
'info' => _LINK_DELETED . " : {$linkedResourcesAltIdentifier[$args['id']]}",
'moduleId' => 'resource',
'eventId' => 'resourceModification'
]);
HistoryController::add([
'tableName' => 'res_letterbox',
'recordId' => $args['id'],
'eventType' => 'UP',
'info' => _LINK_DELETED . " : {$linkedResourcesAltIdentifier[$args['resId']]}",
'moduleId' => 'resource',
'eventId' => 'resourceModification'
]);
return $response->withStatus(204);
}
}