Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17184 | Rev 17187 | 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\Controller;
5
 
6
use Laminas\Mvc\Controller\AbstractActionController;
7
use Laminas\View\Model\JsonModel;
17184 stevensc 8
use Laminas\View\Model\ViewModel;
1 www 9
use LeadersLinked\Library\Functions;
17002 efrain 10
use LeadersLinked\Mapper\MicrolearningTopicMapper;
17101 stevensc 11
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
17002 efrain 12
use LeadersLinked\Model\MicrolearningTopic;
13
use LeadersLinked\Form\Microlearning\TopicAddForm;
14
use LeadersLinked\Form\Microlearning\TopicEditForm;
15
use LeadersLinked\Library\Storage;
17107 stevensc 16
use LeadersLinked\Model\MicrolearningTopicCapsule;
17
use LeadersLinked\Mapper\MicrolearningTopicCapsuleMapper;
17178 stevensc 18
use LeadersLinked\Mapper\MicrolearningUserProgressMapper;
1 www 19
 
20
class MicrolearningTopicController extends AbstractActionController
21
{
22
    /**
23
     *
16769 efrain 24
     * @var \Laminas\Db\Adapter\AdapterInterface
1 www 25
     */
26
    private $adapter;
27
 
28
    /**
29
     *
16769 efrain 30
     * @var \LeadersLinked\Cache\CacheInterface
1 www 31
     */
16769 efrain 32
    private $cache;
33
 
34
 
35
    /**
36
     *
37
     * @var \Laminas\Log\LoggerInterface
38
     */
1 www 39
    private $logger;
40
 
41
    /**
42
     *
43
     * @var array
44
     */
45
    private $config;
46
 
16769 efrain 47
 
1 www 48
    /**
49
     *
16769 efrain 50
     * @var \Laminas\Mvc\I18n\Translator
51
     */
52
    private $translator;
53
 
54
 
55
    /**
56
     *
57
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
58
     * @param \LeadersLinked\Cache\CacheInterface $cache
59
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
1 www 60
     * @param array $config
16769 efrain 61
     * @param \Laminas\Mvc\I18n\Translator $translator
1 www 62
     */
16769 efrain 63
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 64
    {
16769 efrain 65
        $this->adapter      = $adapter;
66
        $this->cache        = $cache;
67
        $this->logger       = $logger;
68
        $this->config       = $config;
69
        $this->translator   = $translator;
1 www 70
    }
71
 
72
    /**
73
     *
17178 stevensc 74
     * Generación del listado de tópicos
1 www 75
     * {@inheritDoc}
76
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
17178 stevensc 77
     * @return JsonModel
1 www 78
     */
79
    public function indexAction()
80
    {
17178 stevensc 81
        try {
82
            $request = $this->getRequest();
83
 
84
            $currentUserPlugin = $this->plugin('currentUserPlugin');
85
            $currentCompany = $currentUserPlugin->getCompany();
86
            $currentUser    = $currentUserPlugin->getUser();
1 www 87
 
17178 stevensc 88
            if (!$request->isGet()) {
89
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
90
            }
91
 
92
            if(!$currentCompany) {
93
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
94
            }
95
 
96
            if(!$currentUser) {
97
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
98
            }
1 www 99
 
17178 stevensc 100
            if($this->isJsonRequest($request)) {
101
                return $this->handleJsonRequest($currentUser, $currentCompany);
102
            }
103
 
104
            return $this->handleHtmlRequest($currentCompany);
105
        } catch (\Exception $e) {
106
            $this->logger->err('Error in indexAction: ' . $e->getMessage());
107
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
108
        }
109
    }
110
 
111
    /**
112
     *
113
     * Agregar un tópico
114
     * {@inheritDoc}
115
     * @see \Laminas\Mvc\Controller\AbstractActionController::addAction()
116
     * @return JsonModel
117
     */
118
    public function addAction()
119
    {
120
        try {
121
            $request    = $this->getRequest();
122
 
123
            $currentUserPlugin  = $this->plugin('currentUserPlugin');
124
            $currentCompany     = $currentUserPlugin->getCompany();
125
            $currentUser        = $currentUserPlugin->getUser();
126
 
127
            if(!$currentCompany) {
128
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
129
            }
130
 
131
            if(!$currentUser) {
132
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
133
            }
134
 
135
            if(!$request->isPost() && !$request->isGet()) {
136
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
137
            }
138
 
139
            if($request->isGet()) {
140
                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
141
                $records =  $capsuleMapper->fetchAllByCompanyId($currentCompany->id);
1 www 142
 
17178 stevensc 143
                $capsules = [];
144
 
145
                foreach($records as $record) {
146
                    array_push($capsules, [
147
                        'id' => $record->uuid,
148
                        'name' => $record->name,
149
                    ]);
1 www 150
                }
17178 stevensc 151
 
152
                return new JsonModel([
153
                    'success' => true,
154
                    'data' => ['capsules' => $capsules]
155
                ]);
1 www 156
            }
17178 stevensc 157
 
158
            if($request->isPost()) {
159
                $form = new TopicAddForm($this->adapter, $currentCompany->id);
160
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1 www 161
 
17178 stevensc 162
                $form->setData($dataPost);
1 www 163
 
17178 stevensc 164
                if(!$form->isValid()) {
165
                    $messages = [];
166
                    $form_messages = (array) $form->getMessages();
167
 
168
                    foreach($form_messages  as $fieldname => $field_messages)
169
                    {
170
                        $messages[$fieldname] = array_values($field_messages);
171
                    }
172
 
173
                    return new JsonModel([
174
                        'success'   => false,
175
                        'data'   => $messages
176
                    ]);
1 www 177
                }
178
 
17178 stevensc 179
                $dataPost = (array) $form->getData();
180
 
181
                $topic = new MicrolearningTopic();
182
                $topic->name = $dataPost['name'];
183
                $topic->description = $dataPost['description'];
184
                $topic->order = $dataPost['order'];
185
                $topic->status = $dataPost['status'];
186
                $topic->privacy = $dataPost['privacy'];
187
                $topic->type = $dataPost['type'];
188
                $topic->cost = $dataPost['cost'];
189
                $topic->company_id = $currentCompany->id;
190
                $topic->image = '';
191
                $topic->marketplace = '';
1 www 192
 
17178 stevensc 193
                $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
1 www 194
 
17178 stevensc 195
                if(!$topicMapper->insert($topic)) {
196
                    return $this->createErrorResponse($topicMapper->getError());
197
                }
1 www 198
 
17178 stevensc 199
                $topic = $topicMapper->fetchOne($topic->id);
17002 efrain 200
 
17178 stevensc 201
                $capsuleUuids = $dataPost['capsule_id'];
202
                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
203
                $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
204
 
205
                foreach ($capsuleUuids as $capsuleUuid) {
206
                    $capsule = $capsuleMapper->fetchOneByUuid($capsuleUuid);
207
 
208
                    if ($capsule) {
209
                        $topicCapsule = new MicrolearningTopicCapsule();
210
                        $topicCapsule->topic_id = $topic->id;
211
                        $topicCapsule->capsule_id = $capsule->id;
212
                        $topicCapsule->company_id = $currentCompany->id;
213
                        $topicCapsuleMapper->insert($topicCapsule);
214
                    }
215
                }
216
 
17018 efrain 217
                $storage = Storage::getInstance($this->config, $this->adapter);
17178 stevensc 218
                $storage->setFiles($request->getFiles()->toArray());
219
 
220
                if (!$storage->setCurrentFilename('file')) {
221
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
222
                }
1 www 223
 
17178 stevensc 224
                $target_size = $this->config['leaderslinked.image_sizes.microlearning_image_size'];
225
                list($target_width, $target_height) = explode('x', $target_size);
17002 efrain 226
 
17178 stevensc 227
                $image_source_filename = $storage->getTmpFilename();
228
                $image_filename = 'topic-' . uniqid() . '.png';
229
                $image_target_filename = $storage->composePathToFilename(
230
                    Storage::TYPE_MICROLEARNING_TOPIC,
231
                    $topic->uuid,
232
                    $image_filename
233
                );
1 www 234
 
17178 stevensc 235
                if (!$storage->uploadImageCrop($image_source_filename, $image_target_filename, $target_width, $target_height)) {
236
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
237
                }
1 www 238
 
17178 stevensc 239
                if(!$storage->setCurrentFilename('marketplace')) {
240
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
1 www 241
                }
242
 
17178 stevensc 243
                $marketplace_source_filename = $storage->getTmpFilename();
244
                $marketplace_filename = 'marketplace-' . uniqid() . '.png';
245
                $marketplace_target_filename = $storage->composePathToFilename(
246
                    Storage::TYPE_MICROLEARNING_TOPIC,
247
                    $topic->uuid,
248
                    $marketplace_filename
249
                );
250
 
251
                if (!$storage->uploadImageCrop($marketplace_source_filename, $marketplace_target_filename, $target_width, $target_height)) {
252
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
253
                }
254
 
255
                $topic->image = $image_filename;
256
                $topic->marketplace = $marketplace_filename;
257
 
258
                if(!$topicMapper->update($topic)) {
259
                    return $this->createErrorResponse($topicMapper->getError());
260
                }
1 www 261
 
17178 stevensc 262
                $this->logger->info('Se agrego el tópico ' . $topic->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1 www 263
 
264
                return new JsonModel([
17178 stevensc 265
                    'success'   => true,
266
                    'data'   => 'LABEL_RECORD_ADDED'
1 www 267
                ]);
268
            }
17178 stevensc 269
        } catch (\Exception $e) {
270
            $this->logger->err('Error in addAction: ' . $e->getMessage());
271
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
1 www 272
        }
273
    }
17178 stevensc 274
 
275
    /**
276
     *
277
     * Borrar un tópico
278
     * {@inheritDoc}
279
     * @see \Laminas\Mvc\Controller\AbstractActionController::deleteAction()
280
     * @return JsonModel
281
     */
282
    public function deleteAction()
283
    {
284
        try {
285
            $request = $this->getRequest();
1 www 286
 
17178 stevensc 287
            $currentUserPlugin  = $this->plugin('currentUserPlugin');
288
            $currentCompany     = $currentUserPlugin->getCompany();
289
            $currentUser        = $currentUserPlugin->getUser();
290
 
291
            $id   = $this->params()->fromRoute('id');
292
 
293
            if(!$currentCompany) {
294
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
295
            }
296
 
297
            if(!$currentUser) {
298
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
299
            }
300
 
301
            if(!$request->isPost()) {
302
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
303
            }
304
 
305
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
306
            $topic = $topicMapper->fetchOneByUuid($id);
1 www 307
 
17178 stevensc 308
            if(!$topic) {
309
                return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
310
            }
311
 
312
            if($topic->company_id != $currentCompany->id) {
313
                return $this->createErrorResponse('ERROR_UNAUTHORIZED');
314
            }
16943 efrain 315
 
17178 stevensc 316
            // Eliminar las relaciones con cápsulas primero
317
            $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
318
 
319
            if(!$topicCapsuleMapper->deleteByTopicId($topic->id)) {
320
                return $this->createErrorResponse($topicCapsuleMapper->getError());
321
            }
17127 stevensc 322
 
17178 stevensc 323
            // Eliminar el progreso de los usuarios
324
            $userProgressMapper = MicrolearningUserProgressMapper::getInstance($this->adapter);
1 www 325
 
17178 stevensc 326
            if(!$userProgressMapper->deleteAllTopicProgressByTopicId($topic->id)) {
327
                return $this->createErrorResponse($userProgressMapper->getError());
17133 stevensc 328
            }
17127 stevensc 329
 
17178 stevensc 330
            // Eliminar archivos de almacenamiento
331
            $storage = Storage::getInstance($this->config, $this->adapter);
332
            $target_path = $storage->getPathMicrolearningTopic();
333
 
334
            if($topic->image) {
335
                if(!$storage->deleteFile($target_path, $topic->uuid, $topic->image)) {
336
                    return $this->createErrorResponse('ERROR_DELETING_FILE');
337
                }
338
            }
17127 stevensc 339
 
17178 stevensc 340
            if(!$topicMapper->delete($topic)) {
341
                return $this->createErrorResponse($topicMapper->getError());
17133 stevensc 342
            }
17127 stevensc 343
 
17178 stevensc 344
            if($topic->marketplace) {
345
                if(!$storage->deleteFile($target_path, $topic->uuid, $topic->marketplace)) {
346
                    return $this->createErrorResponse('ERROR_DELETING_FILE');
347
                }
348
            }
349
 
350
            // Registrar la acción en el log
351
            $this->logger->info('Se borro el tópico : ' . $topic->name, [
352
            'user_id' => $currentUser->id,
353
            'ip' => Functions::getUserIP()
354
            ]);
355
 
356
            return new JsonModel([
17133 stevensc 357
                'success' => true,
17178 stevensc 358
                'data' => 'LABEL_RECORD_DELETED'
359
            ]);
360
        } catch (\Exception $e) {
361
            $this->logger->err('Error in deleteAction: ' . $e->getMessage());
362
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17133 stevensc 363
        }
17178 stevensc 364
    }
365
 
366
    /**
367
     *
368
     * Editar un tópico
369
     * {@inheritDoc}
370
     * @see \Laminas\Mvc\Controller\AbstractActionController::editAction()
371
     * @return JsonModel
372
     */
373
    public function editAction()
374
    {
375
        try {
376
            $request = $this->getRequest();
17127 stevensc 377
 
17178 stevensc 378
            $currentUserPlugin  = $this->plugin('currentUserPlugin');
379
            $currentCompany     = $currentUserPlugin->getCompany();
380
            $currentUser        = $currentUserPlugin->getUser();
17133 stevensc 381
 
17178 stevensc 382
            $id   = $this->params()->fromRoute('id');
17133 stevensc 383
 
17178 stevensc 384
            if(!$currentCompany) {
385
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
386
            }
387
 
388
            if(!$currentUser) {
389
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
390
            }
391
 
392
            if(!$request->isPost() && !$request->isGet()) {
393
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
394
            }
395
 
396
            if($request->isGet()) {
397
                $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
398
                $topic = $topicMapper->fetchOneByUuid($id);
399
 
400
                if(!$topic) {
401
                    return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
1 www 402
                }
17178 stevensc 403
 
404
                if($topic->company_id != $currentCompany->id) {
405
                    return $this->createErrorResponse('ERROR_UNAUTHORIZED');
406
                }
1 www 407
 
17178 stevensc 408
                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
409
                $records =  $capsuleMapper->fetchAllByCompanyId($currentCompany->id);
410
 
411
                $capsules = [];
17133 stevensc 412
 
17178 stevensc 413
                foreach($records as $record) {
414
                    array_push($capsules, [
415
                        'id' => $record->uuid,
416
                        'name' => $record->name,
417
                    ]);
418
                }
17133 stevensc 419
 
17178 stevensc 420
                $storage = Storage::getInstance($this->config, $this->adapter);
421
                $path = $storage->getPathMicrolearningTopic();
422
 
17133 stevensc 423
                $data = [
17178 stevensc 424
                    'success' => true,
425
                    'data' => [
426
                        'capsules' => $capsules,
427
                        'name' => $topic->name,
428
                        'description' => $topic->description,
429
                        'order' => $topic->order,
430
                        'status' => $topic->status,
431
                        'privacy' => $topic->privacy,
432
                        'type' => $topic->type,
433
                        'cost' => $topic->cost,
434
                        'image'=> $storage->getGenericImage($path, $topic->uuid, $topic->image),
435
                        'marketplace'=> $storage->getGenericImage($path, $topic->uuid, $topic->marketplace)
436
                    ]
17133 stevensc 437
                ];
17178 stevensc 438
 
17133 stevensc 439
                return new JsonModel($data);
440
            }
441
 
17178 stevensc 442
            if($request->isPost()) {
443
                $form = new  TopicEditForm($this->adapter, $currentCompany->id, $currentCompany->internal);
444
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
17133 stevensc 445
 
17178 stevensc 446
                $form->setData($dataPost);
447
 
448
                if(!$form->isValid()) {
449
                    $messages = [];
450
                    $form_messages = (array) $form->getMessages();
451
                    foreach($form_messages  as $fieldname => $field_messages)
452
                    {
453
 
454
                        $messages[$fieldname] = array_values($field_messages);
455
                    }
456
 
457
                    return new JsonModel([
458
                        'success'   => false,
459
                        'data'   => $messages
460
                    ]);
17133 stevensc 461
                }
17101 stevensc 462
 
17178 stevensc 463
                $dataPost = (array) $form->getData();
17133 stevensc 464
 
17178 stevensc 465
                $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
466
                $topic = $topicMapper->fetchOneByUuid($id);
17133 stevensc 467
 
17178 stevensc 468
                if(!$topic) {
469
                    return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
470
                }
17101 stevensc 471
 
17178 stevensc 472
                if($topic->company_id != $currentCompany->id) {
473
                    return $this->createErrorResponse('ERROR_UNAUTHORIZED');
474
                }
17098 stevensc 475
 
17178 stevensc 476
                $topic->name = $dataPost['name'];
477
                $topic->description = $dataPost['description'];
478
                $topic->order = $dataPost['order'];
479
                $topic->status = $dataPost['status'];
480
                $topic->privacy = $dataPost['privacy'];
481
                $topic->type = $dataPost['type'];
482
                $topic->cost = $dataPost['cost'];
483
                $topic->image = $dataPost['image'];
484
                $topic->marketplace = $dataPost['marketplace'];
485
 
486
                if(!$topicMapper->update($topic)) {
487
                    return $this->createErrorResponse($topicMapper->getError());
488
                }
489
 
490
                $storage = Storage::getInstance($this->config, $this->adapter);
491
                $target_path = $storage->getPathMicrolearningTopic();
492
 
493
                $storage->setFiles($request->getFiles()->toArray());
494
 
495
                if(!$storage->setCurrentFilename('file')) {
496
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
497
                }
498
 
499
                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
500
                $image_source_filename = $storage->getTmpFilename();
501
                $image_filename = 'topic-' . uniqid() . '.png';
502
                $image_target_filename = $storage->composePathToFilename(
503
                    Storage::TYPE_MICROLEARNING_TOPIC,
504
                    $topic->uuid,
505
                    $image_filename
506
                );
507
 
508
                if (!$storage->uploadImageCrop($image_source_filename, $image_target_filename, $target_width, $target_height)) {
509
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
510
                }
511
 
512
                if(!$storage->setCurrentFilename('marketplace')) {
513
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
514
                }
515
 
516
                $marketplace_source_filename = $storage->getTmpFilename();
517
                $marketplace_filename = 'marketplace-' . uniqid() . '.png';
518
                $marketplace_target_filename = $storage->composePathToFilename(
519
                    Storage::TYPE_MICROLEARNING_TOPIC,
520
                    $topic->uuid,
521
                    $marketplace_filename
522
                );
523
 
524
                if (!$storage->uploadImageCrop($marketplace_source_filename, $marketplace_target_filename, $target_width, $target_height)) {
525
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
526
                }
527
 
528
                if($topic->image) {
529
                    if(!$storage->deleteFile($target_path, $topic->uuid, $topic->image)) {
530
                        return $this->createErrorResponse('ERROR_DELETING_FILE');
531
                    }
532
                }
533
 
534
                if($topic->marketplace) {
535
                    if(!$storage->deleteFile($target_path, $topic->uuid, $topic->marketplace)) {
536
                        return $this->createErrorResponse('ERROR_DELETING_FILE');
537
                    }
538
                }
539
 
540
                $topic->image = $image_filename;
541
                $topic->marketplace = $marketplace_filename;
542
 
543
                if(!$topicMapper->update($topic)) {
544
                    return $this->createErrorResponse($topicMapper->getError());
545
                }
546
 
547
                $this->logger->info('Se edito el tópico ' . $topic->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
548
 
17133 stevensc 549
                return new JsonModel([
17178 stevensc 550
                    'success'   => true,
551
                    'data'   => 'LABEL_RECORD_UPDATED'
17093 stevensc 552
                ]);
553
            }
17178 stevensc 554
        } catch (\Exception $e) {
555
            $this->logger->err('Error in editAction: ' . $e->getMessage());
556
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17093 stevensc 557
        }
1 www 558
    }
17178 stevensc 559
 
17185 stevensc 560
    /**
561
     *
562
     * Obtener los usuarios de un tópico
563
     * {@inheritDoc}
564
     * @see \Laminas\Mvc\Controller\AbstractActionController::usersAction()
565
     * @return JsonModel
566
     */
567
    public function usersAction()
568
    {
569
        try {
570
            $request = $this->getRequest();
571
 
572
            $currentUserPlugin = $this->plugin('currentUserPlugin');
573
            $currentUser    = $currentUserPlugin->getUser();
574
            $currentCompany = $currentUserPlugin->getCompany();
575
 
576
            if(!$currentCompany) {
577
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
578
            }
579
 
580
            if(!$currentUser) {
581
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
582
            }
583
 
584
            if(!$request->isGet()) {
585
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
586
            }
587
 
588
            $topic_uuid = $this->params()->fromRoute('topic_uuid');
589
            $type = $this->params()->fromRoute('type');
590
 
591
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
592
            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
593
            if(!$topic) {
594
                $this->logger->err('Error in usersAction: ' . $topic_uuid);
595
                return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
596
            }
597
 
598
            if($topic->company_id != $currentCompany->id) {
599
                $this->logger->err('Error in usersAction: ' . $topic_uuid);
600
                return $this->createErrorResponse('ERROR_UNAUTHORIZED');
601
            }
602
 
603
            $queryMapper = QueryMapper::getInstance($this->adapter);
604
            $sql = $queryMapper->getSql();
605
            $select = $sql->select();
606
            $select->columns(['access', 'paid_from', 'paid_to', 'added_on']);
607
            $select->from(['tb1' => MicrolearningTopicUserMapper::_TABLE] );
608
            $select->join(['tb2' => UserMapper::_TABLE], 'tb1.user_id = tb2.id', ['uuid', 'first_name', 'last_name', 'email']);
609
            $select->where->equalTo('tb1.company_id', $topic->company_id);
610
            $select->where->equalTo('tb1.topic_id', $topic->id);
611
 
612
            if($type == 'active') {
613
                $now = date('Y-m-d H:i:s');
614
                $select->where->nest->equalTo('access', MicrolearningTopicUser::ACCESS_UNLIMITED)->or->nest()
615
                ->equalTo('access', MicrolearningTopicUser::ACCESS_PAY_PERIOD)
616
                ->and->lessThanOrEqualTo('paid_from', $now)->and->greaterThanOrEqualTo('paid_to', $now )->unnest()->unnest();
617
 
618
            }
619
 
620
            $select->order(['first_name', 'last_name', 'email']);
621
            $records  = $queryMapper->fetchAll($select);
622
 
623
            $items = [];
624
 
625
            foreach($records as $record)
626
            {
627
                switch($record['access'])
628
                {
629
                    case MicrolearningTopicUser::ACCESS_UNLIMITED :
630
                        $details['access'] = 'LABEL_UNLIMIT';
631
                        break;
632
 
633
                    case MicrolearningTopicUser::ACCESS_REVOKE :
634
                        $details['access'] = 'LABEL_REVOKED';
635
                        break;
636
 
637
                    case MicrolearningTopicUser::ACCESS_PAY_PERIOD :
638
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
639
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
640
 
641
                        $details['access'] = 'LABEL_PAY_PERIOD';
642
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
643
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
644
                        break;
645
 
646
                    case MicrolearningTopicUser::ACCESS_SUPENDED :
647
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
648
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
649
 
650
                        $details['access'] = 'LABEL_SUSPENDED';
651
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
652
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
653
                        break;
654
 
655
                    case MicrolearningTopicUser::ACCESS_CANCELLED :
656
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
657
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
658
 
659
                        $details['access'] = 'LABEL_CANCELLED';
660
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
661
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
662
                        break;
663
                }
664
 
665
 
666
                $item = [
667
                    'first_name' => $record['first_name'],
668
                    'last_name' => $record['last_name'],
669
                    'email' => $record['email'],
670
                    'details' => $details,
671
                ];
672
 
673
                array_push($items, $item);
674
            }
675
 
676
            return new JsonModel([
677
                'success' => true,
678
                'data' => [
679
                    'topic' => $topic->name,
680
                    'items' => $items,
681
                ]
682
            ]);
683
        } catch (\Exception $e) {
684
            $this->logger->err('Error in usersAction: ' . $e->getMessage());
685
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
686
        }
687
    }
688
 
17178 stevensc 689
     /**
690
     * Check if request is JSON
691
     * @param \Laminas\Http\Request $request
692
     * @return bool
1 www 693
     */
17178 stevensc 694
    private function isJsonRequest($request)
1 www 695
    {
17178 stevensc 696
        $headers = $request->getHeaders();
697
        if (!$headers->has('Accept')) {
698
            return false;
17133 stevensc 699
        }
700
 
17178 stevensc 701
        $accept = $headers->get('Accept');
702
        $prioritized = $accept->getPrioritized();
17133 stevensc 703
 
17178 stevensc 704
        foreach ($prioritized as $value) {
705
            if (strpos(trim($value->getRaw()), 'json') !== false) {
706
                return true;
707
            }
1 www 708
        }
709
 
17178 stevensc 710
        return false;
711
    }
1 www 712
 
17178 stevensc 713
    /**
714
     * Handle JSON request for datatable
715
     * @param \LeadersLinked\Model\User $currentUser
716
     * @param \LeadersLinked\Model\Company $currentCompany
717
     * @return \Laminas\View\Model\JsonModel
718
     */
719
    private function handleJsonRequest($currentUser, $currentCompany)
720
    {
721
        try {
722
            $search = $this->params()->fromQuery('search', []);
723
            $search = empty($search['value']) ? '' : Functions::sanitizeFilterString($search['value']);
724
 
725
            $recordsPerPage = intval($this->params()->fromQuery('length', 10), 10);
726
            $page = (intval($this->params()->fromQuery('start', 1), 10) / $recordsPerPage) + 1;
727
 
728
            $order = $this->params()->fromQuery('order', []);
729
            $orderField = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
730
            $orderDirection = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
731
 
732
            $fields = ['name'];
733
            $orderField = isset($fields[$orderField]) ? $fields[$orderField] : 'name';
734
 
735
            if (!in_array($orderDirection, ['ASC', 'DESC'])) {
736
                $orderDirection = 'ASC';
737
            }
738
 
739
            $acl = $this->getEvent()->getViewModel()->getVariable('acl');
740
            $permissions = $this->getUserPermissions($acl, $currentUser);
741
 
742
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
743
            $paginator = $topicMapper->fetchAllDataTableByCompanyId(
744
                $currentCompany->id,
745
                $search,
746
                $page,
747
                $recordsPerPage,
748
                $orderField,
749
                $orderDirection
750
            );
751
 
752
            $items = $this->prepareTopicItems($paginator->getCurrentItems(), $currentCompany, $permissions);
753
 
754
            $response = [
755
                'success' => true,
756
                'data' => [
757
                    'link_add' => $permissions['allowAdd'] ? $this->url()->fromRoute('microlearning/content/topics/add') : '',
758
                    'items' => $items,
759
                    'total' => $paginator->getTotalItemCount(),
760
                ]
761
            ];
762
 
763
            return new JsonModel($response);
764
 
765
        } catch (\Exception $e) {
766
            $this->logger->err('Error in handleJsonRequest: ' . $e->getMessage());
767
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17133 stevensc 768
        }
17178 stevensc 769
    }
17133 stevensc 770
 
17178 stevensc 771
    /**
772
     * Handle HTML request for view
773
     * @param \LeadersLinked\Model\Company $currentCompany
774
     * @return \Laminas\View\Model\ViewModel
775
     */
776
    private function handleHtmlRequest($currentCompany)
777
    {
778
        $imageSize = $this->config['leaderslinked.image_sizes.microlearning_image_upload'];
779
        $marketplaceSize = $this->config['leaderslinked.image_sizes.marketplace'];
1 www 780
 
17178 stevensc 781
        $formAdd = new TopicAddForm($this->adapter, $currentCompany->id, $currentCompany->internal);
782
        $formEdit = new TopicEditForm($this->adapter, $currentCompany->id, $currentCompany->internal);
17002 efrain 783
 
17178 stevensc 784
        $this->layout()->setTemplate('layout/layout-backend.phtml');
785
        $viewModel = new ViewModel();
786
        $viewModel->setTemplate('leaders-linked/microlearning-topics/index.phtml');
787
        $viewModel->setVariables([
788
            'formAdd' => $formAdd,
789
            'formEdit' => $formEdit,
790
            'company_uuid' => $currentCompany->uuid,
791
            'image_size' => $imageSize,
792
            'marketplace_size' => $marketplaceSize,
17133 stevensc 793
        ]);
1 www 794
 
17178 stevensc 795
        return $viewModel;
796
    }
797
 
798
    /**
799
     * Get user permissions for topic actions
800
     * @param \Laminas\Permissions\Acl\Acl $acl
801
     * @param \LeadersLinked\Model\User $currentUser
802
     * @return array
803
     */
804
    private function getUserPermissions($acl, $currentUser)
805
    {
806
        return [
807
            'allowAdd' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/add'),
808
            'allowEdit' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/edit'),
809
            'allowDelete' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/delete'),
810
            'allowUsers' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/users')
811
        ];
812
    }
813
 
814
    /**
815
     * Create error response
816
     * @param string $message
817
     * @return \Laminas\View\Model\JsonModel
818
     */
819
    private function createErrorResponse($message)
820
    {
17133 stevensc 821
        return new JsonModel([
17178 stevensc 822
            'success' => false,
823
            'data' => $message
17133 stevensc 824
        ]);
1 www 825
    }
826
 
17178 stevensc 827
     /**
828
     * Prepare topic items for datatable
829
     * @param array $records
830
     * @param \LeadersLinked\Model\Company $currentCompany
831
     * @param array $permissions
832
     * @return array
833
     */
834
    private function prepareTopicItems($records, $currentCompany, $permissions)
1 www 835
    {
17178 stevensc 836
        $items = [];
837
        $microlearningTopicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
838
        $storage = Storage::getInstance($this->config, $this->adapter);
839
        $path = $storage->getPathMicrolearningTopic();
17109 stevensc 840
 
17178 stevensc 841
        foreach ($records as $record) {
842
            $totalUsers = $microlearningTopicUserMapper->fetchCountUsersByCompanyIdAndTopicId($currentCompany->id, $record->id);
843
            $totalUsersActive = $microlearningTopicUserMapper->fetchCountUsersActiveByCompanyIdAndTopicId($currentCompany->id, $record->id);
844
 
845
            $status = $this->getTopicStatus($record->status);
846
            $privacy = $this->getTopicPrivacy($record->privacy);
847
            $type = $this->getTopicType($record->type);
848
 
849
            $params = ['capsule_uuid' => $record->uuid];
850
 
851
            $items[] = [
852
                'name' => $record->name,
853
                'details' => [
854
                    'status' => $status,
855
                    'privacy' => $privacy,
856
                    'type' => $type,
857
                    'cost' => $record->cost,
858
                    'total_users' => $totalUsers,
859
                    'total_users_active' => $totalUsersActive,
860
                ],
861
                'images' => [
862
                    'image' => $storage->getGenericImage($path, $record->uuid, $record->image),
863
                ],
864
                'actions' => $this->prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
865
            ];
1 www 866
        }
17178 stevensc 867
 
868
        return $items;
869
    }
870
 
871
        /**
872
     * Get topic status label
873
     * @param int $status
874
     * @return string
875
     */
876
    private function getTopicStatus($status)
877
    {
878
        switch ($status) {
879
            case MicrolearningTopic::STATUS_ACTIVE:
880
                return 'LABEL_ACTIVE';
881
            case MicrolearningTopic::STATUS_INACTIVE:
882
                return 'LABEL_INACTIVE';
883
            default:
884
                return '';
1 www 885
        }
17178 stevensc 886
    }
887
 
888
    /**
889
     * Get topic privacy label
890
     * @param int $privacy
891
     * @return string
892
     */
893
    private function getTopicPrivacy($privacy)
894
    {
895
        switch ($privacy) {
896
            case MicrolearningTopic::PRIVACY_PUBLIC:
897
                return 'LABEL_PUBLIC';
898
            case MicrolearningTopic::PRIVACY_PRIVATE:
899
                return 'LABEL_PRIVATE';
900
            default:
901
                return '';
1 www 902
        }
903
    }
17178 stevensc 904
 
905
    /**
906
     * Get topic type label
907
     * @param int $type
908
     * @return string
909
     */
910
    private function getTopicType($type)
911
    {
912
        switch ($type) {
913
            case MicrolearningTopic::TYPE_FREE:
914
                return 'LABEL_FREE';
915
            case MicrolearningTopic::TYPE_PRIVATE:
916
                return 'LABEL_PRIVATE';
917
            case MicrolearningTopic::TYPE_SELLING:
918
                return 'LABEL_SELLING';
919
            default:
920
                return '';
921
        }
922
    }
923
 
924
     /**
925
     * Prepare topic actions
926
     * @param \LeadersLinked\Model\MicrolearningTopic $record
927
     * @param array $permissions
928
     * @param int $totalUsers
929
     * @param int $totalUsersActive
930
     * @return array
931
     */
932
    private function prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
933
    {
934
        $params = ['topic_uuid' => $record->uuid];
935
 
936
        return [
937
            'link_edit' => $permissions['allowEdit'] ? $this->url()->fromRoute('microlearning/content/topics/edit', $params) : '',
938
            'link_delete' => $permissions['allowDelete'] ? $this->url()->fromRoute('microlearning/content/topics/delete', $params) : '',
939
            'link_total_users' => $permissions['allowUsers'] && $totalUsers ?
940
                $this->url()->fromRoute('microlearning/content/topics/users', [
941
                    'topic_uuid' => $record->uuid,
942
                    'type' => 'all'
943
                ]) : '',
944
            'link_total_users_actives' => $permissions['allowUsers'] && $totalUsersActive ?
945
                $this->url()->fromRoute('microlearning/content/topics/users', [
946
                    'topic_uuid' => $record->uuid,
947
                    'type' => 'active'
948
                ]) : ''
949
        ];
950
    }
1 www 951
}