Skip to content
Snippets Groups Projects
LinkController.php 10.9 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?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']);
    
    Damien's avatar
    Damien committed
                    $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);
        }
    }