Skip to content
Snippets Groups Projects
IssuingSiteController.php 11.4 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 Issuing Site Controller
     * @author dev@maarch.org
     */
    
    
    namespace RegisteredMail\controllers;
    
    
    use Group\controllers\PrivilegeController;
    use History\controllers\HistoryController;
    
    use RegisteredMail\models\IssuingSiteEntitiesModel;
    use RegisteredMail\models\IssuingSiteModel;
    
    use RegisteredMail\models\RegisteredNumberRangeModel;
    
    use Respect\Validation\Validator;
    use Slim\Http\Request;
    use Slim\Http\Response;
    
    class IssuingSiteController
    {
        public function get(Request $request, Response $response)
        {
    
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
    
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
    
            $sites = IssuingSiteModel::get();
    
            foreach ($sites as $key => $site) {
                $sites[$key] = [
                    'id'                 => $site['id'],
                    'siteLabel'          => $site['site_label'],
                    'postOfficeLabel'    => $site['post_office_label'] ?? null,
                    'accountNumber'      => $site['account_number'] ?? null,
                    'addressNumber'      => $site['address_number'] ?? null,
                    'addressStreet'      => $site['address_street'] ?? null,
                    'addressAdditional1' => $site['address_additional1'] ?? null,
                    'addressAdditional2' => $site['address_additional2'] ?? null,
                    'addressPostcode'    => $site['address_postcode'] ?? null,
                    'addressTown'        => $site['address_town'] ?? null,
                    'addressCountry'     => $site['address_country'] ?? null
                ];
            }
    
            return $response->withJson(['sites' => $sites]);
    
        }
    
        public function getById(Request $request, Response $response, array $args)
        {
    
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
    
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $site = IssuingSiteModel::getById(['id' => $args['id']]);
    
            if (empty($site)) {
                return $response->withStatus(400)->withJson(['errors' => 'Issuing site not found']);
            }
    
    
            $site = [
                'id'                 => $site['id'],
                'siteLabel'          => $site['site_label'],
                'postOfficeLabel'    => $site['post_office_label'] ?? null,
                'accountNumber'      => $site['account_number'] ?? null,
                'addressNumber'      => $site['address_number'] ?? null,
                'addressStreet'      => $site['address_street'] ?? null,
                'addressAdditional1' => $site['address_additional1'] ?? null,
                'addressAdditional2' => $site['address_additional2'] ?? null,
                'addressPostcode'    => $site['address_postcode'] ?? null,
                'addressTown'        => $site['address_town'] ?? null,
                'addressCountry'     => $site['address_country'] ?? null
            ];
    
            $entities = IssuingSiteEntitiesModel::get([
                'select' => ['entity_id'],
                'where'  => ['site_id = ?'],
                'data'   => [$args['id']]
            ]);
    
            $entities = array_column($entities, 'entity_id');
    
            $site['entities'] = $entities;
    
    
            return $response->withJson(['site' => $site]);
        }
    
        public function create(Request $request, Response $response)
        {
    
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
    
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $body = $request->getParsedBody();
    
            if (!Validator::stringType()->notEmpty()->validate($body['siteLabel'])) {
    
                return $response->withStatus(400)->withJson(['errors' => 'Body siteLabel is empty or not a string']);
    
            }
            if (!empty($body['entities']) && !Validator::arrayType()->validate($body['entities'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body entities is not an array']);
            } elseif (!empty($body['entities']) && Validator::arrayType()->validate($body['entities'])) {
                foreach ($body['entities'] as $key => $entity) {
                    if (!Validator::intVal()->validate($entity)) {
                        return $response->withStatus(400)->withJson(['errors' => "Body entities[$key] is not an integer"]);
                    }
                }
            }
    
            $id = IssuingSiteModel::create([
                'siteLabel'          => $body['siteLabel'],
                'postOfficeLabel'    => $body['postOfficeLabel'] ?? null,
    
                'accountNumber'      => $body['accountNumber'],
    
                'addressNumber'      => $body['addressNumber'] ?? null,
                'addressStreet'      => $body['addressStreet'] ?? null,
                'addressAdditional1' => $body['addressAdditional1'] ?? null,
                'addressAdditional2' => $body['addressAdditional2'] ?? null,
                'addressPostcode'    => $body['addressPostcode'] ?? null,
                'addressTown'        => $body['addressTown'] ?? null,
                'addressCountry'     => $body['addressCountry'] ?? null
            ]);
    
            if (!empty($body['entities'])) {
                foreach ($body['entities'] as $entity) {
                    IssuingSiteEntitiesModel::create(['siteId' => $id, 'entityId' => $entity]);
                }
            }
    
            HistoryController::add([
                'tableName' => 'issuing_sites',
                'recordId'  => $id,
                'eventType' => 'ADD',
                'info'      => _ISSUING_SITE_CREATED . " : {$id}",
                'moduleId'  => 'issuing_sites',
                'eventId'   => 'issuingSitesCreation',
            ]);
    
            return $response->withJson(['id' => $id]);
        }
    
        public function update(Request $request, Response $response, array $args)
        {
    
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
    
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $site = IssuingSiteModel::getById(['id' => $args['id']]);
            if (empty($site)) {
                return $response->withStatus(400)->withJson(['errors' => 'Issuing site not found']);
            }
    
            $body = $request->getParsedBody();
    
            if (!Validator::stringType()->notEmpty()->validate($body['siteLabel'])) {
    
                return $response->withStatus(400)->withJson(['errors' => 'Body siteLabel is empty or not a string']);
    
            }
            if (!empty($body['entities']) && !Validator::arrayType()->validate($body['entities'])) {
                return $response->withStatus(400)->withJson(['errors' => 'Body entities is not an array']);
            } elseif (!empty($body['entities']) && Validator::arrayType()->validate($body['entities'])) {
                foreach ($body['entities'] as $key => $entity) {
                    if (!Validator::intVal()->validate($entity)) {
                        return $response->withStatus(400)->withJson(['errors' => "Body entities[$key] is not an integer"]);
                    }
                }
            }
    
            IssuingSiteModel::update([
                'set'  => [
                    'site_label'          => $body['siteLabel'],
                    'post_office_label'   => $body['postOfficeLabel'] ?? null,
    
                    'account_number'      => $body['accountNumber'] ?? null,
    
                    'address_number'      => $body['addressNumber'] ?? null,
                    'address_street'      => $body['addressStreet'] ?? null,
                    'address_additional1' => $body['addressAdditional1'] ?? null,
                    'address_additional2' => $body['addressAdditional2'] ?? null,
                    'address_postcode'    => $body['addressPostcode'] ?? null,
                    'address_town'        => $body['addressTown'] ?? null,
                    'address_country'     => $body['addressCountry'] ?? null
                ],
                'where' => ['id = ?'],
                'data'  => [$args['id']]
            ]);
    
            IssuingSiteEntitiesModel::delete([
                'where' => ['site_id = ?'],
                'data'  => [$args['id']]
            ]);
    
            if (!empty($body['entities'])) {
                foreach ($body['entities'] as $entity) {
                    IssuingSiteEntitiesModel::create(['siteId' => $args['id'], 'entityId' => $entity]);
                }
            }
    
            HistoryController::add([
                'tableName' => 'issuing_sites',
                'recordId'  => $args['id'],
                'eventType' => 'UP',
                'info'      => _ISSUING_SITE_UPDATED . " : {$args['id']}",
                'moduleId'  => 'issuing_sites',
                'eventId'   => 'issuingSitesModification',
            ]);
    
            return $response->withStatus(204);
        }
    
        public function delete(Request $request, Response $response, array $args)
        {
    
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
    
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $site = IssuingSiteModel::getById(['id' => $args['id']]);
            if (empty($site)) {
                return $response->withStatus(204);
            }
    
            IssuingSiteEntitiesModel::delete([
                'where' => ['site_id = ?'],
                'data'  => [$args['id']]
            ]);
    
            IssuingSiteModel::delete([
                'where' => ['id = ?'],
                'data'  => [$args['id']]
            ]);
    
            HistoryController::add([
                'tableName' => 'issuing_sites',
                'recordId'  => $args['id'],
                'eventType' => 'DEL',
                'info'      => _ISSUING_SITE_DELETED . " : {$args['id']}",
                'moduleId'  => 'issuing_sites',
                'eventId'   => 'issuingSitesSuppression',
            ]);
    
            return $response->withStatus(204);
        }
    
    
        public function getByType(Request $request, Response $response, array $args)
        {
            if (!PrivilegeController::hasPrivilege(['privilegeId' => 'admin_registered_mail', 'userId' => $GLOBALS['id']])) {
                return $response->withStatus(403)->withJson(['errors' => 'Service forbidden']);
            }
    
            $sitesIds = RegisteredNumberRangeModel::get([
                'select' => ['site_id'],
                'where'  => ['type = ?'],
                'data'   => [$args['type']]
            ]);
    
            if (empty($sitesIds)) {
    
                return $response->withStatus(403)->withJson(['sites' => []]);
    
            }
            $sitesIds = array_column($sitesIds, 'site_id');
    
            $sites = IssuingSiteModel::get([
                'where' => ['id in (?)'],
                'data'  => [$sitesIds]
            ]);
    
            foreach ($sites as $key => $site) {
                $sites[$key] = [
                    'id'                 => $site['id'],
                    'siteLabel'          => $site['site_label'],
                    'postOfficeLabel'    => $site['post_office_label'],
                    'accountNumber'      => $site['account_number'],
                    'addressNumber'      => $site['address_number'],
                    'addressStreet'      => $site['address_street'],
                    'addressAdditional1' => $site['address_additional1'],
                    'addressAdditional2' => $site['address_additional2'],
                    'addressPostcode'    => $site['address_postcode'],
                    'addressTown'        => $site['address_town'],
                    'addressCountry'     => $site['address_country']
                ];
            }
    
            return $response->withJson(['sites' => $sites]);
        }