Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17195 | Rev 17214 | 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) {
17211 stevensc 418
                    $topicCapsuleMapper = MicrolearningTopicCapsuleMapper::getInstance($this->adapter);
419
                    $topicCapsule = $topicCapsuleMapper->fetchOneByTopicIdAndCapsuleId($topic->id, $record->id);
420
 
421
                    $selected = $topicCapsule ? true : false;
422
 
17178 stevensc 423
                    array_push($capsules, [
424
                        'id' => $record->uuid,
425
                        'name' => $record->name,
17211 stevensc 426
                        'selected' => $selected
17178 stevensc 427
                    ]);
428
                }
17133 stevensc 429
 
17178 stevensc 430
                $storage = Storage::getInstance($this->config, $this->adapter);
431
                $path = $storage->getPathMicrolearningTopic();
432
 
17133 stevensc 433
                $data = [
17178 stevensc 434
                    'success' => true,
435
                    'data' => [
436
                        'capsules' => $capsules,
437
                        'name' => $topic->name,
438
                        'description' => $topic->description,
439
                        'order' => $topic->order,
440
                        'status' => $topic->status,
441
                        'privacy' => $topic->privacy,
442
                        'type' => $topic->type,
443
                        'cost' => $topic->cost,
444
                        'image'=> $storage->getGenericImage($path, $topic->uuid, $topic->image),
445
                        'marketplace'=> $storage->getGenericImage($path, $topic->uuid, $topic->marketplace)
446
                    ]
17133 stevensc 447
                ];
17178 stevensc 448
 
17133 stevensc 449
                return new JsonModel($data);
450
            }
451
 
17178 stevensc 452
            if($request->isPost()) {
453
                $form = new  TopicEditForm($this->adapter, $currentCompany->id, $currentCompany->internal);
454
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
17133 stevensc 455
 
17178 stevensc 456
                $form->setData($dataPost);
457
 
458
                if(!$form->isValid()) {
459
                    $messages = [];
460
                    $form_messages = (array) $form->getMessages();
461
                    foreach($form_messages  as $fieldname => $field_messages)
462
                    {
463
 
464
                        $messages[$fieldname] = array_values($field_messages);
465
                    }
466
 
467
                    return new JsonModel([
468
                        'success'   => false,
469
                        'data'   => $messages
470
                    ]);
17133 stevensc 471
                }
17101 stevensc 472
 
17178 stevensc 473
                $dataPost = (array) $form->getData();
17133 stevensc 474
 
17178 stevensc 475
                $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
476
                $topic = $topicMapper->fetchOneByUuid($id);
17133 stevensc 477
 
17178 stevensc 478
                if(!$topic) {
479
                    return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
480
                }
17101 stevensc 481
 
17178 stevensc 482
                if($topic->company_id != $currentCompany->id) {
483
                    return $this->createErrorResponse('ERROR_UNAUTHORIZED');
484
                }
17098 stevensc 485
 
17178 stevensc 486
                $topic->name = $dataPost['name'];
487
                $topic->description = $dataPost['description'];
488
                $topic->order = $dataPost['order'];
489
                $topic->status = $dataPost['status'];
490
                $topic->privacy = $dataPost['privacy'];
491
                $topic->type = $dataPost['type'];
492
                $topic->cost = $dataPost['cost'];
493
                $topic->image = $dataPost['image'];
494
                $topic->marketplace = $dataPost['marketplace'];
495
 
496
                if(!$topicMapper->update($topic)) {
497
                    return $this->createErrorResponse($topicMapper->getError());
498
                }
499
 
500
                $storage = Storage::getInstance($this->config, $this->adapter);
501
                $target_path = $storage->getPathMicrolearningTopic();
502
 
503
                $storage->setFiles($request->getFiles()->toArray());
504
 
505
                if(!$storage->setCurrentFilename('file')) {
506
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
507
                }
508
 
509
                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
510
                $image_source_filename = $storage->getTmpFilename();
511
                $image_filename = 'topic-' . uniqid() . '.png';
512
                $image_target_filename = $storage->composePathToFilename(
513
                    Storage::TYPE_MICROLEARNING_TOPIC,
514
                    $topic->uuid,
515
                    $image_filename
516
                );
517
 
518
                if (!$storage->uploadImageCrop($image_source_filename, $image_target_filename, $target_width, $target_height)) {
519
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
520
                }
521
 
522
                if(!$storage->setCurrentFilename('marketplace')) {
523
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
524
                }
525
 
526
                $marketplace_source_filename = $storage->getTmpFilename();
527
                $marketplace_filename = 'marketplace-' . uniqid() . '.png';
528
                $marketplace_target_filename = $storage->composePathToFilename(
529
                    Storage::TYPE_MICROLEARNING_TOPIC,
530
                    $topic->uuid,
531
                    $marketplace_filename
532
                );
533
 
534
                if (!$storage->uploadImageCrop($marketplace_source_filename, $marketplace_target_filename, $target_width, $target_height)) {
535
                    return $this->createErrorResponse('ERROR_UPLOAD_IMAGE');
536
                }
537
 
538
                if($topic->image) {
539
                    if(!$storage->deleteFile($target_path, $topic->uuid, $topic->image)) {
540
                        return $this->createErrorResponse('ERROR_DELETING_FILE');
541
                    }
542
                }
543
 
544
                if($topic->marketplace) {
545
                    if(!$storage->deleteFile($target_path, $topic->uuid, $topic->marketplace)) {
546
                        return $this->createErrorResponse('ERROR_DELETING_FILE');
547
                    }
548
                }
549
 
550
                $topic->image = $image_filename;
551
                $topic->marketplace = $marketplace_filename;
552
 
553
                if(!$topicMapper->update($topic)) {
554
                    return $this->createErrorResponse($topicMapper->getError());
555
                }
556
 
557
                $this->logger->info('Se edito el tópico ' . $topic->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
558
 
17133 stevensc 559
                return new JsonModel([
17178 stevensc 560
                    'success'   => true,
561
                    'data'   => 'LABEL_RECORD_UPDATED'
17093 stevensc 562
                ]);
563
            }
17178 stevensc 564
        } catch (\Exception $e) {
565
            $this->logger->err('Error in editAction: ' . $e->getMessage());
566
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17093 stevensc 567
        }
1 www 568
    }
17178 stevensc 569
 
17185 stevensc 570
    /**
571
     *
572
     * Obtener los usuarios de un tópico
573
     * {@inheritDoc}
574
     * @see \Laminas\Mvc\Controller\AbstractActionController::usersAction()
575
     * @return JsonModel
576
     */
577
    public function usersAction()
578
    {
579
        try {
580
            $request = $this->getRequest();
581
 
582
            $currentUserPlugin = $this->plugin('currentUserPlugin');
583
            $currentUser    = $currentUserPlugin->getUser();
584
            $currentCompany = $currentUserPlugin->getCompany();
585
 
586
            if(!$currentCompany) {
587
                return $this->createErrorResponse('ERROR_COMPANY_NOT_FOUND');
588
            }
589
 
590
            if(!$currentUser) {
591
                return $this->createErrorResponse('ERROR_USER_NOT_FOUND');
592
            }
593
 
594
            if(!$request->isGet()) {
595
                return $this->createErrorResponse('ERROR_METHOD_NOT_ALLOWED');
596
            }
597
 
598
            $topic_uuid = $this->params()->fromRoute('topic_uuid');
599
            $type = $this->params()->fromRoute('type');
600
 
601
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
602
            $topic = $topicMapper->fetchOneByUuid($topic_uuid);
603
            if(!$topic) {
604
                $this->logger->err('Error in usersAction: ' . $topic_uuid);
605
                return $this->createErrorResponse('ERROR_TOPIC_NOT_FOUND');
606
            }
607
 
608
            if($topic->company_id != $currentCompany->id) {
609
                $this->logger->err('Error in usersAction: ' . $topic_uuid);
610
                return $this->createErrorResponse('ERROR_UNAUTHORIZED');
611
            }
612
 
613
            $queryMapper = QueryMapper::getInstance($this->adapter);
614
            $sql = $queryMapper->getSql();
615
            $select = $sql->select();
616
            $select->columns(['access', 'paid_from', 'paid_to', 'added_on']);
617
            $select->from(['tb1' => MicrolearningTopicUserMapper::_TABLE] );
618
            $select->join(['tb2' => UserMapper::_TABLE], 'tb1.user_id = tb2.id', ['uuid', 'first_name', 'last_name', 'email']);
619
            $select->where->equalTo('tb1.company_id', $topic->company_id);
620
            $select->where->equalTo('tb1.topic_id', $topic->id);
621
 
622
            if($type == 'active') {
623
                $now = date('Y-m-d H:i:s');
624
                $select->where->nest->equalTo('access', MicrolearningTopicUser::ACCESS_UNLIMITED)->or->nest()
625
                ->equalTo('access', MicrolearningTopicUser::ACCESS_PAY_PERIOD)
626
                ->and->lessThanOrEqualTo('paid_from', $now)->and->greaterThanOrEqualTo('paid_to', $now )->unnest()->unnest();
627
 
628
            }
629
 
630
            $select->order(['first_name', 'last_name', 'email']);
631
            $records  = $queryMapper->fetchAll($select);
632
 
633
            $items = [];
634
 
635
            foreach($records as $record)
636
            {
637
                switch($record['access'])
638
                {
639
                    case MicrolearningTopicUser::ACCESS_UNLIMITED :
640
                        $details['access'] = 'LABEL_UNLIMIT';
641
                        break;
642
 
643
                    case MicrolearningTopicUser::ACCESS_REVOKE :
644
                        $details['access'] = 'LABEL_REVOKED';
645
                        break;
646
 
647
                    case MicrolearningTopicUser::ACCESS_PAY_PERIOD :
648
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
649
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
650
 
651
                        $details['access'] = 'LABEL_PAY_PERIOD';
652
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
653
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
654
                        break;
655
 
656
                    case MicrolearningTopicUser::ACCESS_SUPENDED :
657
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
658
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
659
 
660
                        $details['access'] = 'LABEL_SUSPENDED';
661
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
662
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
663
                        break;
664
 
665
                    case MicrolearningTopicUser::ACCESS_CANCELLED :
666
                        $dt_paid_from = \DateTime::createFromFormat('Y-m-d', $record['paid_from']);
667
                        $dt_paid_to = \DateTime::createFromFormat('Y-m-d', $record['paid_to']);
668
 
669
                        $details['access'] = 'LABEL_CANCELLED';
670
                        $details['paid_from'] = $dt_paid_from->format('d/m/Y');
671
                        $details['paid_to'] = $dt_paid_to->format('d/m/Y');
672
                        break;
673
                }
674
 
675
 
676
                $item = [
677
                    'first_name' => $record['first_name'],
678
                    'last_name' => $record['last_name'],
679
                    'email' => $record['email'],
680
                    'details' => $details,
681
                ];
682
 
683
                array_push($items, $item);
684
            }
685
 
686
            return new JsonModel([
687
                'success' => true,
688
                'data' => [
689
                    'topic' => $topic->name,
690
                    'items' => $items,
691
                ]
692
            ]);
693
        } catch (\Exception $e) {
694
            $this->logger->err('Error in usersAction: ' . $e->getMessage());
695
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
696
        }
697
    }
698
 
17178 stevensc 699
     /**
700
     * Check if request is JSON
701
     * @param \Laminas\Http\Request $request
702
     * @return bool
1 www 703
     */
17178 stevensc 704
    private function isJsonRequest($request)
1 www 705
    {
17178 stevensc 706
        $headers = $request->getHeaders();
707
        if (!$headers->has('Accept')) {
708
            return false;
17133 stevensc 709
        }
710
 
17178 stevensc 711
        $accept = $headers->get('Accept');
712
        $prioritized = $accept->getPrioritized();
17133 stevensc 713
 
17178 stevensc 714
        foreach ($prioritized as $value) {
715
            if (strpos(trim($value->getRaw()), 'json') !== false) {
716
                return true;
717
            }
1 www 718
        }
719
 
17178 stevensc 720
        return false;
721
    }
1 www 722
 
17178 stevensc 723
    /**
724
     * Handle JSON request for datatable
725
     * @param \LeadersLinked\Model\User $currentUser
726
     * @param \LeadersLinked\Model\Company $currentCompany
727
     * @return \Laminas\View\Model\JsonModel
728
     */
729
    private function handleJsonRequest($currentUser, $currentCompany)
730
    {
731
        try {
732
            $search = $this->params()->fromQuery('search', []);
733
            $search = empty($search['value']) ? '' : Functions::sanitizeFilterString($search['value']);
734
 
735
            $recordsPerPage = intval($this->params()->fromQuery('length', 10), 10);
736
            $page = (intval($this->params()->fromQuery('start', 1), 10) / $recordsPerPage) + 1;
737
 
738
            $order = $this->params()->fromQuery('order', []);
739
            $orderField = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
740
            $orderDirection = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
741
 
742
            $fields = ['name'];
743
            $orderField = isset($fields[$orderField]) ? $fields[$orderField] : 'name';
744
 
745
            if (!in_array($orderDirection, ['ASC', 'DESC'])) {
746
                $orderDirection = 'ASC';
747
            }
748
 
749
            $acl = $this->getEvent()->getViewModel()->getVariable('acl');
750
            $permissions = $this->getUserPermissions($acl, $currentUser);
751
 
752
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
753
            $paginator = $topicMapper->fetchAllDataTableByCompanyId(
754
                $currentCompany->id,
755
                $search,
756
                $page,
757
                $recordsPerPage,
758
                $orderField,
759
                $orderDirection
760
            );
761
 
762
            $items = $this->prepareTopicItems($paginator->getCurrentItems(), $currentCompany, $permissions);
763
 
764
            $response = [
765
                'success' => true,
766
                'data' => [
767
                    'link_add' => $permissions['allowAdd'] ? $this->url()->fromRoute('microlearning/content/topics/add') : '',
768
                    'items' => $items,
769
                    'total' => $paginator->getTotalItemCount(),
770
                ]
771
            ];
772
 
773
            return new JsonModel($response);
774
 
775
        } catch (\Exception $e) {
776
            $this->logger->err('Error in handleJsonRequest: ' . $e->getMessage());
777
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17133 stevensc 778
        }
17178 stevensc 779
    }
17133 stevensc 780
 
17178 stevensc 781
    /**
782
     * Handle HTML request for view
783
     * @param \LeadersLinked\Model\Company $currentCompany
784
     * @return \Laminas\View\Model\ViewModel
785
     */
786
    private function handleHtmlRequest($currentCompany)
787
    {
788
        $imageSize = $this->config['leaderslinked.image_sizes.microlearning_image_upload'];
789
        $marketplaceSize = $this->config['leaderslinked.image_sizes.marketplace'];
1 www 790
 
17178 stevensc 791
        $formAdd = new TopicAddForm($this->adapter, $currentCompany->id, $currentCompany->internal);
792
        $formEdit = new TopicEditForm($this->adapter, $currentCompany->id, $currentCompany->internal);
17002 efrain 793
 
17178 stevensc 794
        $this->layout()->setTemplate('layout/layout-backend.phtml');
795
        $viewModel = new ViewModel();
796
        $viewModel->setTemplate('leaders-linked/microlearning-topics/index.phtml');
797
        $viewModel->setVariables([
798
            'formAdd' => $formAdd,
799
            'formEdit' => $formEdit,
800
            'company_uuid' => $currentCompany->uuid,
801
            'image_size' => $imageSize,
802
            'marketplace_size' => $marketplaceSize,
17133 stevensc 803
        ]);
1 www 804
 
17178 stevensc 805
        return $viewModel;
806
    }
807
 
808
    /**
809
     * Get user permissions for topic actions
810
     * @param \Laminas\Permissions\Acl\Acl $acl
811
     * @param \LeadersLinked\Model\User $currentUser
812
     * @return array
813
     */
814
    private function getUserPermissions($acl, $currentUser)
815
    {
816
        return [
817
            'allowAdd' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/add'),
818
            'allowEdit' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/edit'),
819
            'allowDelete' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/delete'),
820
            'allowUsers' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/users')
821
        ];
822
    }
823
 
824
    /**
825
     * Create error response
826
     * @param string $message
827
     * @return \Laminas\View\Model\JsonModel
828
     */
829
    private function createErrorResponse($message)
830
    {
17133 stevensc 831
        return new JsonModel([
17178 stevensc 832
            'success' => false,
833
            'data' => $message
17133 stevensc 834
        ]);
1 www 835
    }
836
 
17178 stevensc 837
     /**
838
     * Prepare topic items for datatable
839
     * @param array $records
840
     * @param \LeadersLinked\Model\Company $currentCompany
841
     * @param array $permissions
842
     * @return array
843
     */
844
    private function prepareTopicItems($records, $currentCompany, $permissions)
1 www 845
    {
17178 stevensc 846
        $items = [];
847
        $microlearningTopicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
848
        $storage = Storage::getInstance($this->config, $this->adapter);
849
        $path = $storage->getPathMicrolearningTopic();
17109 stevensc 850
 
17178 stevensc 851
        foreach ($records as $record) {
852
            $totalUsers = $microlearningTopicUserMapper->fetchCountUsersByCompanyIdAndTopicId($currentCompany->id, $record->id);
853
            $totalUsersActive = $microlearningTopicUserMapper->fetchCountUsersActiveByCompanyIdAndTopicId($currentCompany->id, $record->id);
854
 
855
            $status = $this->getTopicStatus($record->status);
856
            $privacy = $this->getTopicPrivacy($record->privacy);
857
            $type = $this->getTopicType($record->type);
858
 
859
            $items[] = [
860
                'name' => $record->name,
861
                'details' => [
862
                    'status' => $status,
863
                    'privacy' => $privacy,
864
                    'type' => $type,
865
                    'cost' => $record->cost,
866
                    'total_users' => $totalUsers,
867
                    'total_users_active' => $totalUsersActive,
868
                ],
869
                'images' => [
870
                    'image' => $storage->getGenericImage($path, $record->uuid, $record->image),
17195 stevensc 871
                    'marketplace' => $storage->getGenericImage($path, $record->uuid, $record->marketplace)
17178 stevensc 872
                ],
873
                'actions' => $this->prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
874
            ];
1 www 875
        }
17178 stevensc 876
 
877
        return $items;
878
    }
879
 
880
        /**
881
     * Get topic status label
882
     * @param int $status
883
     * @return string
884
     */
885
    private function getTopicStatus($status)
886
    {
887
        switch ($status) {
888
            case MicrolearningTopic::STATUS_ACTIVE:
889
                return 'LABEL_ACTIVE';
890
            case MicrolearningTopic::STATUS_INACTIVE:
891
                return 'LABEL_INACTIVE';
892
            default:
893
                return '';
1 www 894
        }
17178 stevensc 895
    }
896
 
897
    /**
898
     * Get topic privacy label
899
     * @param int $privacy
900
     * @return string
901
     */
902
    private function getTopicPrivacy($privacy)
903
    {
904
        switch ($privacy) {
905
            case MicrolearningTopic::PRIVACY_PUBLIC:
906
                return 'LABEL_PUBLIC';
907
            case MicrolearningTopic::PRIVACY_PRIVATE:
908
                return 'LABEL_PRIVATE';
909
            default:
910
                return '';
1 www 911
        }
912
    }
17178 stevensc 913
 
914
    /**
915
     * Get topic type label
916
     * @param int $type
917
     * @return string
918
     */
919
    private function getTopicType($type)
920
    {
921
        switch ($type) {
922
            case MicrolearningTopic::TYPE_FREE:
923
                return 'LABEL_FREE';
924
            case MicrolearningTopic::TYPE_PRIVATE:
925
                return 'LABEL_PRIVATE';
926
            case MicrolearningTopic::TYPE_SELLING:
927
                return 'LABEL_SELLING';
928
            default:
929
                return '';
930
        }
931
    }
932
 
933
     /**
934
     * Prepare topic actions
935
     * @param \LeadersLinked\Model\MicrolearningTopic $record
936
     * @param array $permissions
937
     * @param int $totalUsers
938
     * @param int $totalUsersActive
939
     * @return array
940
     */
941
    private function prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
942
    {
17188 stevensc 943
        $editDeleteParams = ['id' => $record->uuid];
17178 stevensc 944
 
945
        return [
17188 stevensc 946
            'link_edit' => $permissions['allowEdit'] ? $this->url()->fromRoute('microlearning/content/topics/edit', $editDeleteParams) : '',
947
            'link_delete' => $permissions['allowDelete'] ? $this->url()->fromRoute('microlearning/content/topics/delete', $editDeleteParams) : '',
17178 stevensc 948
            'link_total_users' => $permissions['allowUsers'] && $totalUsers ?
949
                $this->url()->fromRoute('microlearning/content/topics/users', [
950
                    'topic_uuid' => $record->uuid,
951
                    'type' => 'all'
952
                ]) : '',
953
            'link_total_users_actives' => $permissions['allowUsers'] && $totalUsersActive ?
954
                $this->url()->fromRoute('microlearning/content/topics/users', [
955
                    'topic_uuid' => $record->uuid,
956
                    'type' => 'active'
957
                ]) : ''
958
        ];
959
    }
1 www 960
}