Proyectos de Subversion LeadersLinked - Services

Rev

Rev 339 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Plugin;
6
 
7
use Laminas\Mvc\Controller\Plugin\AbstractPlugin;
8
use Laminas\Db\Adapter\AdapterInterface;
9
use Laminas\Authentication\AuthenticationService;
10
use LeadersLinked\Model\Device;
11
use LeadersLinked\Mapper\DeviceMapper;
12
use LeadersLinked\Model\UserType;
13
use LeadersLinked\Mapper\NetworkMapper;
14
 
15
 
16
class CurrentNetworkPlugin extends AbstractPlugin
17
{
18
 
19
    /**
20
     *
283 www 21
     * @var \LeadersLinked\Plugin\CurrentNetworkPlugin
22
     */
23
    private static $_instance;
24
 
339 www 25
    /**
26
     *
27
     * @var AdapterInterface $adapter
28
     */
29
    private $adapter;
283 www 30
 
339 www 31
 
283 www 32
    /**
33
     *
1 efrain 34
     * @var boolean
35
     */
283 www 36
    private $hasNetwork;
1 efrain 37
 
38
 
39
 
40
    /**
41
     *
42
     * @return \LeadersLinked\Model\Network
43
     */
283 www 44
    private $network;
1 efrain 45
 
46
 
47
    /**
48
     *
49
     * @var string
50
     */
283 www 51
    private $hostname;
1 efrain 52
 
283 www 53
 
1 efrain 54
    /**
55
     *
56
     * @param AdapterInterface $adapter
283 www 57
     * @return \LeadersLinked\Plugin\CurrentNetworkPlugin
1 efrain 58
     */
283 www 59
    public static function getInstance($adapter)
1 efrain 60
    {
283 www 61
        if(self::$_instance == null) {
62
            self::$_instance = new CurrentNetworkPlugin($adapter);
63
        }
64
        return self::$_instance;
65
    }
164 efrain 66
 
283 www 67
 
68
 
69
    /**
70
     *
71
     * @param AdapterInterface $adapter
72
     */
73
    private function __construct($adapter)
74
    {
339 www 75
        $this->adapter = $adapter;
1 efrain 76
        $this->hasNetwork = false;
188 efrain 77
        $networkMapper = NetworkMapper::getInstance($adapter);
1 efrain 78
 
747 stevensc 79
        // Primero, intentamos determinar la red a partir de la URI de la solicitud.
80
        // Esto es útil para los servicios internos o las llamadas a la API que pueden no tener un encabezado Host/Origin claro.
185 efrain 81
        $request_uri = empty($_SERVER['REQUEST_URI']) ? '' : $_SERVER['REQUEST_URI'];
187 efrain 82
        if($request_uri) {
83
 
84
            if(substr($request_uri, 0, 1) == '/') {
85
                $request_uri = substr($request_uri, 1);
86
            }
87
 
188 efrain 88
            $parts = explode('/', $request_uri);
747 stevensc 89
 
90
            // Si la URI comienza con 'services', asumimos que es una llamada interna y cargamos la red predeterminada.
188 efrain 91
            if($parts[0] == 'services') {
92
 
93
                $this->network = $networkMapper->fetchOneByDefault();
94
                if($this->network) {
95
                    $this->hostname = $this->network->main_hostname;
96
                    $this->hasNetwork = true;
97
                }
747 stevensc 98
            }
187 efrain 99
        }
188 efrain 100
 
747 stevensc 101
        // Si no se encontró una red a través de la URI, intentamos determinarla a partir del nombre de host.
102
        // Esto es para las solicitudes front-end estándar del navegador.
188 efrain 103
        if(!$this->hasNetwork) {
104
 
747 stevensc 105
            // Intentamos obtener el nombre de host de varias cabeceras HTTP en orden de preferencia.
106
            // HTTP_ORIGIN es el más fiable para las solicitudes de API (CORS).
188 efrain 107
            $hostname = empty($_SERVER['HTTP_ORIGIN']) ? '' : $_SERVER['HTTP_ORIGIN'];
108
 
109
            if(empty($hostname)) {
747 stevensc 110
                // HTTP_REFERER es una alternativa si el origen no está presente.
188 efrain 111
                $hostname = empty($_SERVER['HTTP_REFERER']) ?  '' : $_SERVER['HTTP_REFERER'];
112
 
113
                if(empty($hostname)) {
747 stevensc 114
                    // HTTP_HOST es el último recurso, que indica la máquina host de la solicitud.
188 efrain 115
                    $hostname = empty($_SERVER['HTTP_HOST']) ?  '' : $_SERVER['HTTP_HOST'];
185 efrain 116
 
188 efrain 117
                }
118
            }
154 efrain 119
 
747 stevensc 120
            // Limpiamos el nombre de host eliminando el protocolo.
188 efrain 121
            $hostname = trim(str_replace(['https://', 'http://'], '', $hostname));
122
 
123
 
124
            //echo $hostname; exit;
125
 
154 efrain 126
 
747 stevensc 127
            // Manejamos los casos en los que el nombre de host puede incluir una ruta.
188 efrain 128
            $parts = explode('/', $hostname);
129
 
130
 
131
 
132
            $hostname = $parts > 1 ? $parts[0] : $hostname;
133
 
747 stevensc 134
            // Buscamos la red en la base de datos utilizando el nombre de host limpio.
188 efrain 135
            $networkMapper = NetworkMapper::getInstance($adapter);
136
            $this->network = $networkMapper->fetchOneByHostnameForFrontend($hostname);
137
 
138
 
139
            if($this->network) {
140
 
747 stevensc 141
                // Si se encuentra una red, determinamos si el host coincide con el host principal o con un host alternativo.
188 efrain 142
                $this->hostname = $this->network->main_hostname == $hostname ?  $this->network->main_hostname : $this->network->alternative_hostname;
143
                $this->hasNetwork = true;
154 efrain 144
            }
18 efrain 145
        }
1 efrain 146
    }
147
 
148
    /**
149
     *
150
     * @return \LeadersLinked\Model\Network
151
     */
152
    public function getNetwork()
153
    {
154
        if($this->hasNetwork) {
155
            return $this->network;
156
        } else {
157
            return null;
158
        }
159
    }
160
 
161
    /**
162
     *
163
     * @return int
164
     */
165
    public function getNetworkId()
166
    {
167
        if($this->hasNetwork) {
168
           return $this->network->id;
169
 
170
        } else {
171
            return 0;
172
        }
173
    }
174
 
175
 
176
    /**
177
     *
178
     * @return boolean
179
     */
180
    public function hasNetwork()
181
    {
182
        return $this->hasNetwork;
183
    }
184
 
185
 
186
    public function getHostname() : string
187
    {
188
        return  $this->hostname;
189
    }
190
 
339 www 191
 
192
    public function fetchDefaultNetwork()
193
    {
194
        $networkMapper = NetworkMapper::getInstance($this->adapter);
195
        $this->network = $networkMapper->fetchOneByDefault();
196
        if($this->network) {
197
            $this->hasNetwork = true;
198
            $this->hostname  = $this->network->main_hostname;
199
        }
200
 
201
    }
1 efrain 202
 
203
 
204
}