Proyectos de Subversion LeadersLinked - Backend

Rev

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