Proyectos de Subversion LeadersLinked - Services

Rev

Rev 669 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;

use LeadersLinked\Library\Functions;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;

use LeadersLinked\Form\MyGroups\CreateForm;
use LeadersLinked\Model\Group;
use LeadersLinked\Mapper\GroupMapper;
use LeadersLinked\Form\MyGroup\AccessibilityForm;
use LeadersLinked\Form\MyGroup\CoverForm;
use LeadersLinked\Form\MyGroup\ExtendedForm;
use LeadersLinked\Form\MyGroup\GroupTypeForm;
use LeadersLinked\Form\MyGroup\ImageForm;
use LeadersLinked\Form\MyGroup\IndustryForm;
use LeadersLinked\Form\MyGroup\PrivacyForm;
use LeadersLinked\Form\MyGroup\WebsiteForm;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Mapper\GroupTypeMapper;
use LeadersLinked\Mapper\GroupMemberMapper;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Model\GroupMember;
use LeadersLinked\Library\Storage;

class MyGroupsController extends AbstractActionController
{
    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;


    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;

    /**
     *
     * @var array
     */
    private $config;


    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;


    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    public function __construct($adapter, $cache, $logger, $config, $translator)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;
        $this->translator   = $translator;
    }

    /**
     * 
     * Generación del listado de perfiles
     * {@inheritDoc}
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
     */
    public function indexAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $request = $this->getRequest();
        if ($request->isGet()) {


            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));

            $acl = $this->getEvent()->getViewModel()->getVariable('acl');
            $allowView = $acl->isAllowed($currentUser->usertype_id, 'group/view');
            $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'group/my-groups/edit');
            $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'group/my-groups/delete');


            $queryMapper = QueryMapper::getInstance($this->adapter);

            $select = $queryMapper->getSql()->select(GroupMapper::_TABLE);
            $select->columns(['id', 'uuid', 'name', 'privacy',  'image', 'status', 'cover']);
            $select->where->equalTo('status', Group::STATUS_ACTIVE);
            $select->where->equalTo('network_id', $currentUser->network_id);

            if ($search) {
                $select->where->like('name', '%' . $search . '%');
            }
            $select->where->equalTo('user_id', $currentUser->id);
            $select->order('name ASC');

            $records = $queryMapper->fetchAll($select);


            $values = [
                Group::PRIVACY_IS_PRIVATE => 'LABEL_PRIVATE',
                Group::PRIVACY_IS_PUBLIC => 'LABEL_PUBLIC'
            ];

            $storage = Storage::getInstance($this->config, $this->adapter);

            $items = [];
            foreach ($records as $record) {

                $item = [
                    'name' => $record['name'],
                    'privacy' => $values[$record['privacy']],
                    'image' => $storage->getGroupImageForCodeAndFilename($record['uuid'],  $record['image']),
                    'cover' => $storage->getGroupImageForCodeAndFilename($record['uuid'], $record['cover']),
                    'link_view' => $allowView ? $this->url()->fromRoute('group/view', ['id' => $record['uuid']])  : '',
                    'link_edit' => $allowEdit ? $this->url()->fromRoute('group/my-groups/edit', ['id' => $record['uuid']])  : '',
                    'link_delete' => $allowDelete ? $this->url()->fromRoute('group/my-groups/delete', ['id' => $record['uuid']]) : '',

                ];

                array_push($items, $item);
            }



            $response = [
                'success' => true,
                'data' => $items
            ];

            return new JsonModel($response);
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }

    /**
     * 
     * Agregar un nuevo perfil
     * @return \Laminas\View\Model\JsonModel
     */
    public function addAction()
    {
        $request = $this->getRequest();


        if ($request->isPost()) {
            $form = new  CreateForm($this->adapter);
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {


                $currentUserPlugin = $this->plugin('currentUserPlugin');
                $currentUser = $currentUserPlugin->getUser();

                $dataPost = (array) $form->getData();

                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOneByUuid($dataPost['industry_id']);

                $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
                $groupType = $groupTypeMapper->fetchOneByUuid($dataPost['type_id']);


                $group = new Group();
                $group->network_id = $currentUser->network_id;
                $group->name = $dataPost['name'];
                $group->industry_id = $industry->id;
                $group->type_id = $groupType->id;
                $group->user_id = $currentUser->id;

                $groupMapper = GroupMapper::getInstance($this->adapter);
                $result = $groupMapper->insert($group);

                if ($result) {

                    $groupMember = new GroupMember();
                    $groupMember->group_id = $group->id;
                    $groupMember->user_id = $group->user_id;
                    $groupMember->status = GroupMember::STATUS_ACCEPTED;

                    $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
                    $groupMemberMapper->insert($groupMember);


                    $this->logger->info('Se agrego el grupo : ' . $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);

                    $data = [
                        'success'   => true,
                        'data'   => 'LABEL_RECORD_ADDED'
                    ];
                } else {
                    $data = [
                        'success'   => false,
                        'data'      => $group->getError()
                    ];
                }

                return new JsonModel($data);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {

                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];

            return new JsonModel($data);
        }

        return new JsonModel($data);
    }

    /**
     * 
     * Borrar un perfil excepto el público
     * @return \Laminas\View\Model\JsonModel
     */
    public function deleteAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');

        if (!$id) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($data);
        }



        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $data = [
                'success'   => false,
                'data'   => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($data);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }


        if ($request->isPost()) {
            $result = $groupMapper->delete($group);
            if ($result) {
                $this->logger->info('Se borro el grupo : ' .  $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);

                $data = [
                    'success' => true,
                    'data' => 'LABEL_RECORD_DELETED'
                ];
            } else {

                $data = [
                    'success'   => false,
                    'data'      => $groupMapper->getError()
                ];

                return new JsonModel($data);
            }
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];

            return new JsonModel($data);
        }

        return new JsonModel($data);
    }

    /**
     * Presenta el perfil con las opciónes de edición de cada sección
     * @return \Laminas\Http\Response|\Laminas\View\Model\ViewModel|\Laminas\View\Model\JsonModel
     */
    public function editAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $flashMessenger = $this->plugin('FlashMessenger');


        $request = $this->getRequest();
        $id = $this->params()->fromRoute('id');


        if (!$id) {
            $flashMessenger->addErrorMessage('ERROR_INVALID_PARAMETER');
            return $this->redirect()->toRoute('dashboard');
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $flashMessenger->addErrorMessage('ERROR_RECORD_NOT_FOUND');
            return $this->redirect()->toRoute('dashboard');
        }

        if ($currentUser->id != $group->user_id) {
            $flashMessenger->addErrorMessage('ERROR_UNAUTHORIZED');
            return $this->redirect()->toRoute('dashboard');
        }

        if ($request->isGet()) {
            $accessibilities = [
                Group::ACCESSIBILITY_AUTO_JOIN => 'LABEL_AUTO_JOIN',
                Group::ACCESSIBILITY_REQUEST_TO_JOIN => 'LABEL_REQUEST_TO_JOIN',
                Group::ACCESSIBILITY_ADMIN_WILL_ADD => 'LABEL_ADMIN_WILL_ADD',
            ];

            $accessibility = $accessibilities[$group->accessibility];

            $privacies = [
                Group::PRIVACY_IS_PRIVATE => 'LABEL_PRIVATE',
                Group::PRIVACY_IS_PUBLIC => 'LABEL_PUBLIC'
            ];

            $privacy = $privacies[$group->privacy];

            $industryMapper = IndustryMapper::getInstance($this->adapter);
            $record = $industryMapper->fetchOne($group->industry_id);

            $industry = $record->name;


            $industries = [];
            $records = $industryMapper->fetchAllActive();
            foreach ($records as $record) {
                $industries[$record->uuid] = $record->name;
            }


            $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
            $record = $groupTypeMapper->fetchOne($group->type_id);
            $recordUuid = $record->uuid;

            $group_type = $record->name;

            $types = [];
            $records =  $groupTypeMapper->fetchAllActive();

            foreach ($records as $record) {
                $types[$record->uuid] = $record->name;
            }

            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
            $total_ = $groupMemberMapper->fetchTotalByGroupId($group->id);

            $image_size_cover = $this->config['leaderslinked.image_sizes.group_cover_upload'];
            $image_size_profile = $this->config['leaderslinked.image_sizes.group_image_upload'];

            $storage = Storage::getInstance($this->config, $this->adapter);


            return new JsonModel([
                'total_'         => $total_,
                'accessibility'         => $accessibility,
                'privacy'               => $privacy,
                'industry'              => $industry,
                'group_id'              => $group->id,
                'group_type'            => $group_type,
                'group_uuid'            => $group->uuid,
                'name'                  => trim($group->name),
                'image'                 => $storage->getGroupImage($group),
                'cover'                 => $storage->getGroupCover($group),
                'overview'              => $group->description,
                'website'               => $group->website,
                'image_size_cover'      => $image_size_cover,
                'image_size_profile'    => $image_size_profile,
                'industries'            => $industries,
                'types'                 => $types,
                'privacies'             => $privacies,
                'accessibilities'       => $accessibilities,
                /* 'link_members'          => $this->url()->fromRoute('group/my-groups/members', ['id' => $record['uuid']]),
                'link_extended'         => $this->url()->fromRoute('group/my-groups/extended', ['id' => $recordUuid]),
                'link_image'            => $this->url()->fromRoute('group/my-groups/image', ['id' => $recordUuid]),
                'link_cover'            => $this->url()->fromRoute('group/my-groups/cover', ['id' => $recordUuid]),
                'link_privacy'          => $this->url()->fromRoute('group/my-groups/privacy', ['id' => $recordUuid]),
                'link_website'          => $this->url()->fromRoute('group/my-groups/website', ['id' => $recordUuid]),
                'link_industry'         => $this->url()->fromRoute('group/my-groups/industry', ['id' => $recordUuid]),
                'link_accessibility'    => $this->url()->fromRoute('group/my-groups/accessibility', ['id' => $recordUuid]),
                'link_type'             => $this->url()->fromRoute('group/my-groups/type', ['id' => $recordUuid]),
                'link_status'           => $this->url()->fromRoute('group/my-groups/status', ['id' => $recordUuid]), */
            ]);
        } else {
            $data = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];

            return new JsonModel($data);
        }

        return new JsonModel($data);
    }


    /**
     * Actualización de la descripción y cualquier otro campo extendido del perfil a futuro
     * @return \Laminas\View\Model\JsonModel
     */
    public function extendedAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $user_group_id = $this->params()->fromRoute('id');
        $groupMapper = GroupMapper::getInstance($this->adapter);

        $group = $groupMapper->fetchOneByUuidAndNetworkId($user_group_id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }



        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $group->description,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new ExtendedForm();
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $group);

                $groupMapper->updateExtended($group);

                $this->logger->info('Se actualizo las descripción del grupo : ' .  $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);

                return new JsonModel([
                    'success'   => true,
                    'data' => $group->description,
                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }



    public function imageAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $user_group_id    = $this->params()->fromRoute('id');

        $groupMapper = GroupMapper::getInstance($this->adapter);

        $group = $groupMapper->fetchOneByUuidAndNetworkId($user_group_id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }

        $storage = Storage::getInstance($this->config, $this->adapter);

        $request = $this->getRequest();
        if ($request->isPost()) {
            $operation          = $this->params()->fromRoute('operation');
            $target_path = $storage->getPathGroup();

            if ($operation == 'delete') {
                $this->logger->info('Se borro el image del grupo : ' .  $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);
                if ($group->image) {

                    if (!$storage->deleteFile($target_path, $group->uuid, $group->image)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                }


                $group->image = '';
                if (!$groupMapper->updateImage($group)) {
                    return new JsonModel([
                        'success'   => false,
                        'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
            } else {
                $form = new ImageForm($this->config);
                $data     = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());

                $form->setData($data);

                if ($form->isValid()) {

                    list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.group_image_size']);


                    $storage->setFiles($request->getFiles()->toArray());
                    if (!$storage->setCurrentFilename('image')) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_UPLOAD_FILE'
                        ]);
                    }

                    $source_filename    = $storage->getTmpFilename();
                    $filename           = 'group-image-' . uniqid() . '.png';
                    $target_filename    = $storage->composePathToFilename(Storage::TYPE_GROUP, $group->uuid, $filename);

                    if ($storage->uploadImageCrop($source_filename, $target_filename, $target_width, $target_height)) {

                        if ($group->image) {
                            $target_path = $storage->getPathGroup();
                            $storage->deleteFile($target_path, $group->uuid, $group->image);
                        }





                        $group->image = $filename;
                        if (!$groupMapper->updateImage($group)) {
                            return new JsonModel([
                                'success'   => false,
                                'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                            ]);
                        }
                    }

                    $this->logger->info('Se actualizo el image del grupo : ' . $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);
                } else {
                    $messages = [];
                    $form_messages = (array) $form->getMessages();
                    foreach ($form_messages  as $fieldname => $field_messages) {
                        $messages[$fieldname] = array_values($field_messages);
                    }

                    return new JsonModel([
                        'success'   => false,
                        'data'   => $messages
                    ]);
                }
            }



            return new JsonModel([
                'success'   => true,
                'data'      => $storage->getGroupImage($group),

            ]);
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }


    public function coverAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $user_group_id  = $this->params()->fromRoute('id');

        $groupMapper = GroupMapper::getInstance($this->adapter);

        $group = $groupMapper->fetchOneByUuidAndNetworkId($user_group_id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }



        $request = $this->getRequest();
        if ($request->isPost()) {
            $operation      = $this->params()->fromRoute('operation');

            $storage = Storage::getInstance($this->config, $this->adapter);
            $target_path = $storage->getPathGroup();


            if ($operation == 'delete') {
                if ($group->cover) {
                    if (!$storage->deleteFile($target_path, $group->uuid, $group->cover)) {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }
                }

                $this->logger->info('Se borro el cover del grupo : ' . $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);

                $group->cover = '';
                if (!$groupMapper->updateCover($group)) {
                    return new JsonModel([
                        'success'   => false,
                        'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                    ]);
                }
            } else {
                $form = new CoverForm($this->config);
                $data     = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());

                $form->setData($data);

                if ($form->isValid()) {

                    $storage->setFiles($request->getFiles()->toArray());
                    if (!$storage->setCurrentFilename('cover')) {

                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_UPLOAD_FILE'
                        ]);
                    }

                    list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.group_cover_size']);





                    $source_filename    = $storage->getTmpFilename();
                    $filename           = 'group-cover-' . uniqid() . '.png';
                    $target_filename    = $storage->composePathToFilename(Storage::TYPE_GROUP, $group->uuid, $filename);

                    if ($storage->uploadImageCrop($source_filename, $target_filename, $target_width, $target_height)) {
                        if ($group->cover) {
                            if (!$storage->deleteFile($target_path, $group->uuid, $group->cover)) {
                                return new JsonModel([
                                    'success'   => false,
                                    'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                                ]);
                            }
                        }

                        $group->cover = $filename;
                        if (!$groupMapper->updateCover($group)) {
                            return new JsonModel([
                                'success'   => false,
                                'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                            ]);
                        }
                    } else {
                        return new JsonModel([
                            'success'   => false,
                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
                        ]);
                    }





                    $this->logger->info('Se actualizo el cover del grupo :  ' . $group->name, ['user_id' => $group->user_id, 'ip' => Functions::getUserIP()]);
                } else {
                    $messages = [];
                    $form_messages = (array) $form->getMessages();
                    foreach ($form_messages  as $fieldname => $field_messages) {
                        $messages[$fieldname] = array_values($field_messages);
                    }

                    return new JsonModel([
                        'success'   => false,
                        'data'   => $messages
                    ]);
                }
            }

            $storage = Storage::getInstance($this->config, $this->adapter);

            return new JsonModel([
                'success'   => true,
                'data' => $storage->getGroupCover($group),

            ]);
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }

    public function industryAction()
    {

        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $id = $this->params()->fromRoute('id');
        if (!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }



        $request = $this->getRequest();
        if ($request->isGet()) {
            $industryMapper = IndustryMapper::getInstance($this->adapter);
            $industry = $industryMapper->fetchOne($group->industry_id);



            $data = [
                'success' => true,
                'data' => $industry->uuid,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new IndustryForm($this->adapter);
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $industryMapper = IndustryMapper::getInstance($this->adapter);
                $industry = $industryMapper->fetchOneByUuid($dataPost['industry_id']);

                $group->industry_id = $industry->id;
                $groupMapper->updateIndustry($group);

                $this->logger->info('Se actualizo la industria del grupo : ' . $group->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);



                return new JsonModel([
                    'success'   => true,
                    'data' =>  $industry->name,

                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }

    public function websiteAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $id = $this->params()->fromRoute('id');
        if (!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }


        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $group->website,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new WebsiteForm();
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $group);

                $groupMapper->updateWebsite($group);

                $this->logger->info('Se actualizo el website de la empresa ' . $group->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);

                return new JsonModel([
                    'success'   => true,
                    'data' => $group->website,
                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }

    public function accessibilityAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $id = $this->params()->fromRoute('id');
        if (!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }


        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $group->accessibility,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new AccessibilityForm();
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $group);

                $groupMapper->updateAccessibility($group);

                $values = [
                    Group::ACCESSIBILITY_AUTO_JOIN => 'LABEL_AUTO_JOIN',
                    Group::ACCESSIBILITY_REQUEST_TO_JOIN => 'LABEL_REQUEST_TO_JOIN',
                    Group::ACCESSIBILITY_ADMIN_WILL_ADD => 'LABEL_ADMIN_WILL_ADD',
                ];

                $this->logger->info('Se actualizo el accesibilidad de la empresa ' . $group->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);

                return new JsonModel([
                    'success'   => true,
                    'data' => $values[$group->accessibility]
                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }

    public function privacyAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $id = $this->params()->fromRoute('id');
        if (!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($response);
        }

        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }


        $request = $this->getRequest();
        if ($request->isGet()) {
            $data = [
                'success' => true,
                'data' => $group->privacy,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new PrivacyForm();
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $hydrator = new ObjectPropertyHydrator();
                $hydrator->hydrate($dataPost, $group);

                $groupMapper->updatePrivacy($group);

                $values = [
                    Group::PRIVACY_IS_PRIVATE => 'LABEL_PRIVATE',
                    Group::PRIVACY_IS_PUBLIC => 'LABEL_PUBLIC'
                ];


                $this->logger->info('Se actualizo la privacidad de la empresa ' . $group->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);

                return new JsonModel([
                    'success'   => true,
                    'data' => $values[$group->privacy]
                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }



    public function typeAction()
    {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();

        $id = $this->params()->fromRoute('id');
        if (!$id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ];

            return new JsonModel($response);
        }

        $groupMapper = GroupMapper::getInstance($this->adapter);
        $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
        if (!$group) {
            $response = [
                'success' => false,
                'data' => 'ERROR_RECORD_NOT_FOUND'
            ];

            return new JsonModel($response);
        }


        if ($currentUser->id != $group->user_id) {
            $response = [
                'success' => false,
                'data' => 'ERROR_UNAUTHORIZED'
            ];

            return new JsonModel($response);
        }



        $request = $this->getRequest();
        if ($request->isGet()) {

            $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
            $groupType = $groupTypeMapper->fetchOne($group->type_id);

            $data = [
                'success' => true,
                'data' => $groupType->uuid,
            ];

            return new JsonModel($data);
        } else if ($request->isPost()) {


            $form = new GroupTypeForm($this->adapter);
            $dataPost = $request->getPost()->toArray();

            $form->setData($dataPost);

            if ($form->isValid()) {
                $dataPost = (array) $form->getData();

                $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
                $groupType = $groupTypeMapper->fetchOneByUuid($dataPost['type_id']);

                $group->type_id = $groupType->id;
                $groupMapper->updateGroupType($group);

                $this->logger->info('Se actualizo el tipo del grupo : ' . $group->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);

                $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
                $groupType = $groupTypeMapper->fetchOne($group->type_id);

                return new JsonModel([
                    'success'   => true,
                    'data' =>  $groupType->name,

                ]);
            } else {
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }

                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        }


        $data = [
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ];


        return new JsonModel($data);
    }
}