Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 14689 | Rev 15088 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\Cache\Storage\Adapter\AbstractAdapter as CacheAdapter;
8
use Laminas\ModuleManager\ModuleEvent;
9
use Laminas\ModuleManager\ModuleManager;
10
use Laminas\Mvc\MvcEvent;
11
use Laminas\Config\Reader\Ini;
12
use Laminas\Permissions\Acl\Acl;
13
use LeadersLinked\Plugin\CurrentUserPlugin;
14
use LeadersLinked\Model\Company;
15
use LeadersLinked\Mapper\UserMapper;
16
use Laminas\Permissions\Acl\Resource\GenericResource;
17
use Laminas\Permissions\Acl\Role\GenericRole;
18
use LeadersLinked\Mapper\CompanyUserMapper;
19
use LeadersLinked\Mapper\CompanyUserRoleMapper;
20
use LeadersLinked\Mapper\RoleMapper;
21
use LeadersLinked\Mapper\CompanyServiceMapper;
22
use LeadersLinked\Model\Service;
23
 
24
class Module
25
{
26
    /**
27
     *
28
     * @var boolean
29
     */
30
    private $isJson;
31
 
32
    /**
33
     *
34
     * @var boolean
35
     */
36
    private $isHtml;
37
 
38
    /**
39
     *
40
     * @var Acl
41
     */
42
    private $acl;
43
 
44
    /**
45
     *
46
     * @var Company
47
     */
48
    private $company;
49
 
50
    /**
51
     *
52
     * @var AdapterInterface
53
     */
54
    private $adapter;
55
 
56
 
57
    /**
58
     *
59
     * @var CacheAdapter
60
     */
61
    private $cache;
62
 
63
    /**
64
     *
65
     * @var CurrentUserPlugin
66
     */
67
    private $currentUser;
68
 
69
 
70
    /**
71
     *
72
     * @var array
73
     */
74
    private $routesAuthorized = [];
75
 
76
    /**
77
     *
78
     * @var boolean
79
     */
80
    private $authByHeaders = false;
81
 
82
    public function init(ModuleManager $moduleManager)
83
    {
84
        $events = $moduleManager->getEventManager();
85
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
86
    }
87
 
88
    public function onMergeConfig(ModuleEvent $event)
89
    {
90
        $configListener = $event->getConfigListener();
91
        $config         = $configListener->getMergedConfig(false);
92
 
93
        $reader = new Ini();
94
        $data = $reader->fromFile('config/leaderslinked.ini');
95
 
96
        $prefix = 'leaderslinked';
97
        foreach($data as $section => $pairs)
98
        {
99
            foreach($pairs as $key => $value)
100
            {
101
                $config[$prefix . '.' . $section . '.' . $key] = $value;
102
            }
103
        }
104
        $configListener->setMergedConfig($config);
105
    }
106
 
107
 
108
    public function getConfig() : array
109
    {
110
        return include __DIR__ . '/../config/module.config.php';
111
    }
112
 
113
    public function onBootstrap(MvcEvent $event)
114
    {
115
        $serviceManager = $event->getApplication()->getServiceManager();
116
        $adapter = $serviceManager->get('leaders-linked-db');
117
       // $logger          = $serviceManager->get('Zend\Log\Logger');
118
 
119
 
120
        $session = $serviceManager->get('leaders-linked-session');
121
        $session->start();
122
 
123
 
124
        $translator = $serviceManager->get('MvcTranslator');
125
        $translator->addTranslationFile(
126
            'phpArray',
127
            __DIR__ . '/i18n/validate.php',
128
            'default'
129
            );
130
 
131
        $translator->addTranslationFile(
132
            'phpArray',
133
            __DIR__ . '/i18n/spanish.php',
134
            'default'
135
            );
136
 
137
        \Laminas\Validator\AbstractValidator::setDefaultTranslator($translator);
138
 
139
 
140
        $this->isHtml = $this->isJson ? false : true;
141
        $this->currentUser = new CurrentUserPlugin($adapter);
142
        $this->initAcl($event);
143
        $eventManager = $event->getApplication()->getEventManager();
144
        $eventManager->attach(MvcEvent::EVENT_DISPATCH_ERROR, [$this,'onDispatchError'], 0);
145
        $eventManager->attach(MvcEvent::EVENT_RENDER_ERROR, [$this,'onRenderError'], 0);
146
 
147
        $sharedManager = $eventManager->getSharedManager();
148
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPreDispatch'], 100);
149
        $sharedManager->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, [$this, 'authPosDispatch'], -100);
150
    }
151
 
152
    public function initAcl(MvcEvent $event)
153
    {
154
        $serviceManager = $event->getApplication()->getServiceManager();
155
        $adapter = $serviceManager->get('leaders-linked-db');
156
 
157
        require_once   (dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'acl.config.php');
158
 
159
 
160
        $this->acl = new Acl();
161
        $resources = getAclResources();
162
        foreach($resources as $resourceName)
163
        {
164
           // echo $resourceName . PHP_EOL;
165
 
166
            $this->acl->addResource(new GenericResource($resourceName));
167
        }
168
 
169
 
170
 
171
 
172
        $company = $this->currentUser->getCompany();
173
        if($company) {
174
            $companyServiceMapper = CompanyServiceMapper::getInstance($adapter);
175
            $companyServiceMicrolearning = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::MICRO_LEARNING);
959 geraldo 176
            $companyServicePerformance = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::PERFORMANCE_EVALUATION);
1 www 177
            $companyServiceAutoEvaluation = $companyServiceMapper->fetchOneActiveByCompanyIdAndServiceId($company->id, Service::SELF_EVALUATION);
178
            $roles = getAclRolesCompany();
179
 
180
 
181
            $user = $this->currentUser->getUser();
182
 
183
            $this->acl->addRole(new GenericRole($user->usertype_id));
184
 
185
            $companyUserMapper = CompanyUserMapper::getInstance($adapter);
186
            $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $user->id);
187
 
188
            if($companyUser && $companyUser->creator) {
189
                if(isset($roles['creator'])) {
190
 
191
                    foreach($roles['creator'] as $resourceName)
192
                    {
193
                        $this->acl->allow($user->usertype_id, $resourceName);
194
                    }
195
 
196
 
197
                    if($companyServiceMicrolearning) {
198
                        foreach($roles['creator-microlearning'] as $resourceName)
199
                        {
200
                            $this->acl->allow($user->usertype_id, $resourceName);
201
                        }
202
                    }
203
 
204
                    if($companyServiceAutoEvaluation) {
205
                        foreach($roles['creator-self-evaluation'] as $resourceName)
206
                        {
207
                            $this->acl->allow($user->usertype_id, $resourceName);
208
                        }
209
                    }
959 geraldo 210
 
211
 
212
                    if($companyServicePerformance) {
213
                        foreach($roles['creator-performance-evaluation'] as $resourceName)
214
                        {
215
                            $this->acl->allow($user->usertype_id, $resourceName);
216
                        }
217
                    }
1 www 218
 
219
                }
220
 
221
            } else {
222
 
223
                $companyUserRoleMapper = CompanyUserRoleMapper::getInstance($this->adapter);
224
                $companyUserRoles = $companyUserRoleMapper->fetchAllByCompanyIdAndUserId($company->id, $user->id);
225
 
226
                $roleMapper = RoleMapper::getInstance($this->adapter);
227
 
228
 
229
                foreach($companyUserRoles as $companyUserRole)
230
                {
231
                    $role = $roleMapper->fetchOne($companyUserRole->role_id);
232
                    if($role) {
233
                        if($role->service_id == Service::SELF_EVALUATION && !$companyServiceAutoEvaluation) {
234
                            continue;
235
                        }
236
 
237
                        if($role->service_id == Service::MICRO_LEARNING && !$companyServiceMicrolearning) {
238
                            continue;
239
                        }
974 geraldo 240
 
241
                        if($role->service_id == Service::MICRO_LEARNING && !$companyServicePerformance) {
242
                            continue;
243
                        }
1 www 244
 
245
                        if(isset($roles[ $role->code ] )) {
246
 
247
 
248
                            foreach($roles[ $role->code ] as $resourceName)
249
                            {
250
                                $this->acl->allow($user->usertype_id, $resourceName);
251
                            }
252
                        }
253
                    }
254
                }
255
 
256
            }
257
 
258
 
259
 
260
 
261
        }  else {
262
            $usertypes = getAclUsertype();
263
            foreach($usertypes as $usertype => $resources)
264
            {
265
                $this->acl->addRole(new GenericRole($usertype));
266
                foreach ($resources as $resourceName)
267
                {
268
                    $this->acl->allow($usertype, $resourceName);
269
                }
270
            }
271
 
272
        }
273
 
274
 
275
        $event->getViewModel()->setVariable('acl', $this->acl);
276
    }
277
 
278
    public function onDispatchError(MvcEvent $event)
279
    {
280
        $this->processError($event);
281
    }
282
 
283
    public function onRenderError(MvcEvent $event)
284
    {
285
        $this->processError($event);
286
    }
287
 
288
    public function sendResponse(\Laminas\Http\Response $response, $data)
289
    {
290
 
291
 
292
        if($this->isJson) {
293
            $headers = $response->getHeaders();
294
            $headers->clearHeaders();
295
            $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
296
 
297
            $response->setStatusCode(200);
298
            $response->setContent(json_encode($data));
299
            $response->send();
300
 
301
 
302
        } else {
303
            throw new \Exception($data['data']);
304
        }
305
        exit;
306
    }
307
 
308
    public function processError(MvcEvent $event)
309
    {
310
 
311
 
312
        $request =  $event->getRequest();
313
        if((method_exists($request, 'isXmlHttpRequest') && $request->isXmlHttpRequest()) || ($this->isJson && !$this->isHtml)) {
314
 
315
            $error = $event->getError();
316
            if (!$error) {
317
                return;
318
            }
319
 
320
            $response = $event->getResponse();
321
 
322
            if('error-exception' == $error) {
323
                $exception = $event->getParam('exception');
324
                error_log($exception->getCode() . ' ' . $exception->getMessage());
325
                //error_log($exception->getTraceAsString());
326
 
327
 
328
                $data = [
329
                    'success' => false,
330
                    'data' => 'An error occurred during execution; please try again later.'
331
                ];
332
 
333
            } else if('error-router-no-match' == $error) {
334
                $data = [
335
                    'success' => false,
336
                    'data' => 'Resource not found.'
337
 
338
                ];
339
            } else if(' error-controller-not-found' == $error) {
340
                $data = [
341
                    'success' => false,
342
                    'data' => 'Controller not found.'
343
 
344
                ];
345
            } else {
346
                $data = [
347
                    'success' => false,
348
                    'data' => 'Unknow error.' , 'error' => $error
349
 
350
                ];
351
            }
352
 
353
 
354
 
355
            $this->sendResponse($response, $data);
356
        }
357
 
358
        $this->initAcl($event);
359
    }
360
 
361
 
362
    public function authPreDispatch(MvcEvent $event)
363
    {
364
        $serviceManager = $event->getApplication()->getServiceManager();
365
        $adapter = $serviceManager->get('leaders-linked-db');
366
 
367
        $userTypeId = $this->currentUser->getUserTypeId();
368
 
369
 
370
 
371
 
372
        $routeName = $event->getRouteMatch()->getMatchedRouteName();
373
 
374
 
375
 
376
        if($this->acl->isAllowed($userTypeId, $routeName)) {
377
            $user = $this->currentUser->getUser();
378
 
14689 efrain 379
            if($user) {
380
 
381
 
382
                $updateLastActivity = true;
383
                if ('chat' == substr($routeName, 0, 4)) {
384
                    $updateLastActivity = false;
385
                }
386
                if ('inmail' == substr($routeName, 0, 6)) {
387
                    $updateLastActivity = false;
388
                }
389
                if ('check-session' == $routeName) {
390
                    $updateLastActivity = false;
391
                }
392
 
393
 
394
                if($updateLastActivity) {
395
                    $userMapper = UserMapper::getInstance($adapter);
396
                    $userMapper->updateLastActivity($user->id);
397
                }
14628 efrain 398
            }
1 www 399
 
400
        } else {
14690 efrain 401
 
402
 
403
            echo "userTypeId = $userTypeId routeName = $routeName";
404
            exit;
1 www 405
 
406
            $this->currentUser->clearIdentity();
407
 
408
 
409
            if($this->isJson) {
410
                $response = $event->getResponse();
411
                $headers = $response->getHeaders();
412
                $headers->clearHeaders();
413
                $headers->addHeaderLine('Content-type', 'application/json; charset=UTF-8');
414
 
415
                $response->setStatusCode(200);
416
                $response->setContent(json_encode(['success' => false, 'data' => 'Unauthorized.', 'fatal' => true]));
417
                $response->send();
418
            } else {
419
                $url = $event->getRouter()->assemble([], ['name' => 'signout']);
420
 
421
                $response = $event->getResponse();
422
                $headers = $response->getHeaders();
423
                $headers->clearHeaders();
424
                $headers->addHeaderLine('Location', $url);
425
 
426
                $response->setStatusCode(302);
427
                $response->send();
428
            }
429
            exit;
430
        }
431
 
432
 
433
    }
434
 
435
 
436
    public function authPosDispatch(MvcEvent $event)
437
    {
438
 
439
    }
440
 
441
 
442
}