Proyectos de Subversion LeadersLinked - Services

Rev

Rev 829 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php
/**
 * 
 * Controlador: Redes (Networks)
 * 
 */
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\JsonModel;
use LeadersLinked\Mapper\NetworkMapper;
use LeadersLinked\Model\Network;
use LeadersLinked\Library\Functions;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Cache\CacheInterface;
use LeadersLinked\Library\Storage;

class NetworkController 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 $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;
    }

    /**
     * Acción por defecto - no permitida
     */
    public function indexAction()
    {
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }

    /**
     * Obtiene la información de una red específica
     */
    public function viewAction()
    {
        $request = $this->getRequest();
        
        if (!$request->isGet()) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
        $id = $this->params()->fromRoute('id');
        if (!$id) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ]);
        }
        
        $networkMapper = NetworkMapper::getInstance($this->adapter);
        $network = $networkMapper->fetchOneByUuid($id);
        
        if (!$network) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NETWORK_NOT_FOUND'
            ]);
        }
        
        if ($network->status != Network::STATUS_ACTIVE) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NETWORK_IS_NOT_ACTIVE'
            ]);
        }
        
        $storage = Storage::getInstance($this->config, $this->adapter);
        
        $data = [
            'network_id' => $network->id,
            'network_uuid' => $network->uuid,
            'name' => $network->name,
            'main_hostname' => $network->main_hostname,
            'alternative_hostname' => $network->alternative_hostname,
            'admin_hostname' => $network->admin_hostname,
            'service_hostname' => $network->service_hostname,
            'status' => $network->status,
            'default' => $network->default,
            'theme_id' => $network->theme_id,
            'relationship_user_mode' => $network->relationship_user_mode,
            'moodle_name' => $network->moodle_name,
            'moodle_url' => $network->moodle_url,
            'moodle_image' => $storage->getNetworkImage($network),
            'microlearning_name' => $network->microlearning_name,
            'microlearning_appstore' => $network->microlearning_appstore,
            'microlearning_playstore' => $network->microlearning_playstore,
            'logo' => $storage->getNetworkLogo($network),
            'favico' => $storage->getNetworkFavico($network),
            'navbar' => $network->navbar,
            'intro' => $network->intro,
            'css_bg_color' => $network->css_bg_color,
            'css_body_bg_color' => $network->css_body_bg_color,
            'css_bg_color_secondary' => $network->css_bg_color_secondary,
            'css_font_color' => $network->css_font_color,
            'css_font_color_hover' => $network->css_font_color_hover,
            'css_title_color' => $network->css_title_color,
            'css_subtitle_color' => $network->css_subtitle_color,
            'css_icons_color' => $network->css_icons_color,
            'css_button_bg' => $network->css_button_bg,
            'css_button_bg_hover' => $network->css_button_bg_hover,
            'css_button_text_color' => $network->css_button_text_color,
            'css_button_bg_secondary' => $network->css_button_bg_secondary,
            'css_button_bg_secondary_hover' => $network->css_button_bg_secondary_hover,
            'css_button_text_color_secondary' => $network->css_button_text_color_secondary,
            'css_button_bg_tertiary' => $network->css_button_bg_tertiary,
            'css_button_text_color_tertiary' => $network->css_button_text_color_tertiary,
            'css_border_primary' => $network->css_border_primary,
            'css_border_trasnparent' => $network->css_border_trasnparent,
            'css_chat_received' => $network->css_chat_received,
            'css_chat_send' => $network->css_chat_send,
            'css_chat_color' => $network->css_chat_color,
            'css_light_gray' => $network->css_light_gray,
            'css_gray' => $network->css_gray,
            'css_danger' => $network->css_danger,
            'css_danger_hover' => $network->css_danger_hover,
            'css_online_green' => $network->css_online_green,
            'css_border_gray_primary' => $network->css_border_gray_primary,
            'css_white' => $network->css_white,
            'css_white_backdrop' => $network->css_white_backdrop,
            'css_border_radius' => $network->css_border_radius,
            'css_light_shadow' => $network->css_light_shadow,
            'css_shadow' => $network->css_shadow,
            'xmpp_active' => $network->xmpp_active,
            'xmpp_domain' => $network->xmpp_domain,
            'xmpp_hostname' => $network->xmpp_hostname,
            'xmpp_port' => $network->xmpp_port,
            'xmpp_admin_port' => $network->xmpp_admin_port,
            'inmail_domain' => $network->inmail_domain,
            'added_on' => $network->added_on,
            'updated_on' => $network->updated_on
        ];
        
        return new JsonModel([
            'success' => true,
            'data' => $data
        ]);
    }

    /**
     * Lista todas las redes activas
     */
    public function listAction()
    {
        $request = $this->getRequest();
        
        if (!$request->isGet()) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
        $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
        $page = (int) $this->params()->fromQuery('page', 1);
        $recordsPerPage = (int) $this->params()->fromQuery('records_per_page', 10);
        $orderField = Functions::sanitizeFilterString($this->params()->fromQuery('order_field', 'name'));
        $orderDirection = Functions::sanitizeFilterString($this->params()->fromQuery('order_direction', 'ASC'));
        
        $networkMapper = NetworkMapper::getInstance($this->adapter);
        $paginator = $networkMapper->fetchAllDataTable($search, $page, $recordsPerPage, $orderField, $orderDirection);
        
        $storage = Storage::getInstance($this->config, $this->adapter);
        
        $items = [];
        foreach ($paginator as $network) {
            $items[] = [
                'network_id' => $network->id,
                'network_uuid' => $network->uuid,
                'name' => $network->name,
                'main_hostname' => $network->main_hostname,
                'admin_hostname' => $network->admin_hostname,
                'status' => $network->status,
                'default' => $network->default,
                'logo' => $storage->getNetworkLogo($network),
                'link_view' => $this->url()->fromRoute('network/view', ['id' => $network->uuid])
            ];
        }
        
        return new JsonModel([
            'success' => true,
            'data' => [
                'items' => $items,
                'total_count' => $paginator->getTotalItemCount(),
                'current_page' => $paginator->getCurrentPageNumber(),
                'total_pages' => $paginator->count(),
                'items_per_page' => $paginator->getItemCountPerPage()
            ]
        ]);
    }

    /**
     * Obtiene la red por defecto
     */
    public function defaultAction()
    {
        $request = $this->getRequest();
        
        if (!$request->isGet()) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
        $networkMapper = NetworkMapper::getInstance($this->adapter);
        $network = $networkMapper->fetchOneByDefault();
        
        if (!$network) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NO_DEFAULT_NETWORK_FOUND'
            ]);
        }
        
        $storage = Storage::getInstance($this->config, $this->adapter);
        
        $data = [
            'network_id' => $network->id,
            'network_uuid' => $network->uuid,
            'name' => $network->name,
            'main_hostname' => $network->main_hostname,
            'alternative_hostname' => $network->alternative_hostname,
            'admin_hostname' => $network->admin_hostname,
            'service_hostname' => $network->service_hostname,
            'status' => $network->status,
            'default' => $network->default,
            'theme_id' => $network->theme_id,
            'relationship_user_mode' => $network->relationship_user_mode,
            'moodle_name' => $network->moodle_name,
            'moodle_url' => $network->moodle_url,
            'moodle_image' => $storage->getNetworkImage($network),
            'microlearning_name' => $network->microlearning_name,
            'microlearning_appstore' => $network->microlearning_appstore,
            'microlearning_playstore' => $network->microlearning_playstore,
            'logo' => $storage->getNetworkLogo($network),
            'favico' => $storage->getNetworkFavico($network),
            'navbar' => $network->navbar,
            'intro' => $network->intro
        ];
        
        return new JsonModel([
            'success' => true,
            'data' => $data
        ]);
    }

    /**
     * Busca una red por hostname
     */
    public function findByHostnameAction()
    {
        $request = $this->getRequest();
        
        if (!$request->isGet()) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
        $hostname = Functions::sanitizeFilterString($this->params()->fromQuery('hostname', ''));
        if (!$hostname) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_INVALID_PARAMETER'
            ]);
        }
        
        $networkMapper = NetworkMapper::getInstance($this->adapter);
        $network = $networkMapper->fetchOneByHostnameForFrontend($hostname);
        
        if (!$network) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NETWORK_NOT_FOUND'
            ]);
        }
        
        $storage = Storage::getInstance($this->config, $this->adapter);
        
        $data = [
            'network_id' => $network->id,
            'network_uuid' => $network->uuid,
            'name' => $network->name,
            'main_hostname' => $network->main_hostname,
            'alternative_hostname' => $network->alternative_hostname,
            'admin_hostname' => $network->admin_hostname,
            'service_hostname' => $network->service_hostname,
            'status' => $network->status,
            'default' => $network->default,
            'theme_id' => $network->theme_id,
            'relationship_user_mode' => $network->relationship_user_mode,
            'logo' => $storage->getNetworkLogo($network),
            'favico' => $storage->getNetworkFavico($network),
            'navbar' => $network->navbar,
            'intro' => $network->intro
        ];
        
        return new JsonModel([
            'success' => true,
            'data' => $data
        ]);
    }

    /**
     * Obtiene solo los estilos CSS de una red específica
     */
    public function getNetworkStylesAction()
    {
        $request = $this->getRequest();
        
        if (!$request->isGet()) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
        
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
        $network = $currentNetworkPlugin->getNetwork();
        
        if (!$network) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NETWORK_NOT_FOUND'
            ]);
        }
        
        if ($network->status != Network::STATUS_ACTIVE) {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_NETWORK_IS_NOT_ACTIVE'
            ]);
        }
        
        $styles = [
            'bg-color' => $network->css_bg_color,
            'body-bg-color' => $network->css_body_bg_color,
            'bg-color-secondary' => $network->css_bg_color_secondary,
            'font-color' => $network->css_font_color,
            'font-color-hover' => $network->css_font_color_hover,
            'title-color' => $network->css_title_color,
            'subtitle-color' => $network->css_subtitle_color,
            'icons-color' => $network->css_icons_color,
            'button-bg' => $network->css_button_bg,
            'button-bg-hover' => $network->css_button_bg_hover,
            'button-text-color' => $network->css_button_text_color,
            'button-bg-secondary' => $network->css_button_bg_secondary,
            'button-bg-secondary-hover' => $network->css_button_bg_secondary_hover,
            'button-text-color-secondary' => $network->css_button_text_color_secondary,
            'button-bg-tertiary' => $network->css_button_bg_tertiary,
            'button-text-color-tertiary' => $network->css_button_text_color_tertiary,
            'border-primary' => $network->css_border_primary,
            'border-trasnparent' => $network->css_border_trasnparent,
            'chat-received' => $network->css_chat_received,
            'chat-send' => $network->css_chat_send,
            'chat-color' => $network->css_chat_color,
            'light-gray' => $network->css_light_gray,
            'gray' => $network->css_gray,
            'danger' => $network->css_danger,
            'danger-hover' => $network->css_danger_hover,
            'online-green' => $network->css_online_green,
            'border-gray-primary' => $network->css_border_gray_primary,
            'white' => $network->css_white,
            'white-backdrop' => $network->css_white_backdrop,
            'border-radius' => $network->css_border_radius,
            'light-shadow' => $network->css_light_shadow,
            'shadow' => $network->css_shadow
        ];
        
        return new JsonModel([
            'success' => true,
            'data' => $styles
        ]);
    }
}