Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17178 | Rev 17185 | 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
 
560
     /**
561
     * Check if request is JSON
562
     * @param \Laminas\Http\Request $request
563
     * @return bool
1 www 564
     */
17178 stevensc 565
    private function isJsonRequest($request)
1 www 566
    {
17178 stevensc 567
        $headers = $request->getHeaders();
568
        if (!$headers->has('Accept')) {
569
            return false;
17133 stevensc 570
        }
571
 
17178 stevensc 572
        $accept = $headers->get('Accept');
573
        $prioritized = $accept->getPrioritized();
17133 stevensc 574
 
17178 stevensc 575
        foreach ($prioritized as $value) {
576
            if (strpos(trim($value->getRaw()), 'json') !== false) {
577
                return true;
578
            }
1 www 579
        }
580
 
17178 stevensc 581
        return false;
582
    }
1 www 583
 
17178 stevensc 584
    /**
585
     * Handle JSON request for datatable
586
     * @param \LeadersLinked\Model\User $currentUser
587
     * @param \LeadersLinked\Model\Company $currentCompany
588
     * @return \Laminas\View\Model\JsonModel
589
     */
590
    private function handleJsonRequest($currentUser, $currentCompany)
591
    {
592
        try {
593
            $search = $this->params()->fromQuery('search', []);
594
            $search = empty($search['value']) ? '' : Functions::sanitizeFilterString($search['value']);
595
 
596
            $recordsPerPage = intval($this->params()->fromQuery('length', 10), 10);
597
            $page = (intval($this->params()->fromQuery('start', 1), 10) / $recordsPerPage) + 1;
598
 
599
            $order = $this->params()->fromQuery('order', []);
600
            $orderField = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
601
            $orderDirection = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
602
 
603
            $fields = ['name'];
604
            $orderField = isset($fields[$orderField]) ? $fields[$orderField] : 'name';
605
 
606
            if (!in_array($orderDirection, ['ASC', 'DESC'])) {
607
                $orderDirection = 'ASC';
608
            }
609
 
610
            $acl = $this->getEvent()->getViewModel()->getVariable('acl');
611
            $permissions = $this->getUserPermissions($acl, $currentUser);
612
 
613
            $topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
614
            $paginator = $topicMapper->fetchAllDataTableByCompanyId(
615
                $currentCompany->id,
616
                $search,
617
                $page,
618
                $recordsPerPage,
619
                $orderField,
620
                $orderDirection
621
            );
622
 
623
            $items = $this->prepareTopicItems($paginator->getCurrentItems(), $currentCompany, $permissions);
624
 
625
            $response = [
626
                'success' => true,
627
                'data' => [
628
                    'link_add' => $permissions['allowAdd'] ? $this->url()->fromRoute('microlearning/content/topics/add') : '',
629
                    'items' => $items,
630
                    'total' => $paginator->getTotalItemCount(),
631
                ]
632
            ];
633
 
634
            return new JsonModel($response);
635
 
636
        } catch (\Exception $e) {
637
            $this->logger->err('Error in handleJsonRequest: ' . $e->getMessage());
638
            return $this->createErrorResponse('ERROR_INTERNAL_SERVER_ERROR');
17133 stevensc 639
        }
17178 stevensc 640
    }
17133 stevensc 641
 
17178 stevensc 642
    /**
643
     * Handle HTML request for view
644
     * @param \LeadersLinked\Model\Company $currentCompany
645
     * @return \Laminas\View\Model\ViewModel
646
     */
647
    private function handleHtmlRequest($currentCompany)
648
    {
649
        $imageSize = $this->config['leaderslinked.image_sizes.microlearning_image_upload'];
650
        $marketplaceSize = $this->config['leaderslinked.image_sizes.marketplace'];
1 www 651
 
17178 stevensc 652
        $formAdd = new TopicAddForm($this->adapter, $currentCompany->id, $currentCompany->internal);
653
        $formEdit = new TopicEditForm($this->adapter, $currentCompany->id, $currentCompany->internal);
17002 efrain 654
 
17178 stevensc 655
        $this->layout()->setTemplate('layout/layout-backend.phtml');
656
        $viewModel = new ViewModel();
657
        $viewModel->setTemplate('leaders-linked/microlearning-topics/index.phtml');
658
        $viewModel->setVariables([
659
            'formAdd' => $formAdd,
660
            'formEdit' => $formEdit,
661
            'company_uuid' => $currentCompany->uuid,
662
            'image_size' => $imageSize,
663
            'marketplace_size' => $marketplaceSize,
17133 stevensc 664
        ]);
1 www 665
 
17178 stevensc 666
        return $viewModel;
667
    }
668
 
669
    /**
670
     * Get user permissions for topic actions
671
     * @param \Laminas\Permissions\Acl\Acl $acl
672
     * @param \LeadersLinked\Model\User $currentUser
673
     * @return array
674
     */
675
    private function getUserPermissions($acl, $currentUser)
676
    {
677
        return [
678
            'allowAdd' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/add'),
679
            'allowEdit' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/edit'),
680
            'allowDelete' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/delete'),
681
            'allowUsers' => $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/topics/users')
682
        ];
683
    }
684
 
685
    /**
686
     * Create error response
687
     * @param string $message
688
     * @return \Laminas\View\Model\JsonModel
689
     */
690
    private function createErrorResponse($message)
691
    {
17133 stevensc 692
        return new JsonModel([
17178 stevensc 693
            'success' => false,
694
            'data' => $message
17133 stevensc 695
        ]);
1 www 696
    }
697
 
17178 stevensc 698
     /**
699
     * Prepare topic items for datatable
700
     * @param array $records
701
     * @param \LeadersLinked\Model\Company $currentCompany
702
     * @param array $permissions
703
     * @return array
704
     */
705
    private function prepareTopicItems($records, $currentCompany, $permissions)
1 www 706
    {
17178 stevensc 707
        $items = [];
708
        $microlearningTopicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
709
        $storage = Storage::getInstance($this->config, $this->adapter);
710
        $path = $storage->getPathMicrolearningTopic();
17109 stevensc 711
 
17178 stevensc 712
        foreach ($records as $record) {
713
            $totalUsers = $microlearningTopicUserMapper->fetchCountUsersByCompanyIdAndTopicId($currentCompany->id, $record->id);
714
            $totalUsersActive = $microlearningTopicUserMapper->fetchCountUsersActiveByCompanyIdAndTopicId($currentCompany->id, $record->id);
715
 
716
            $status = $this->getTopicStatus($record->status);
717
            $privacy = $this->getTopicPrivacy($record->privacy);
718
            $type = $this->getTopicType($record->type);
719
 
720
            $params = ['capsule_uuid' => $record->uuid];
721
 
722
            $items[] = [
723
                'name' => $record->name,
724
                'details' => [
725
                    'status' => $status,
726
                    'privacy' => $privacy,
727
                    'type' => $type,
728
                    'cost' => $record->cost,
729
                    'total_users' => $totalUsers,
730
                    'total_users_active' => $totalUsersActive,
731
                ],
732
                'images' => [
733
                    'image' => $storage->getGenericImage($path, $record->uuid, $record->image),
734
                ],
735
                'actions' => $this->prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
736
            ];
1 www 737
        }
17178 stevensc 738
 
739
        return $items;
740
    }
741
 
742
        /**
743
     * Get topic status label
744
     * @param int $status
745
     * @return string
746
     */
747
    private function getTopicStatus($status)
748
    {
749
        switch ($status) {
750
            case MicrolearningTopic::STATUS_ACTIVE:
751
                return 'LABEL_ACTIVE';
752
            case MicrolearningTopic::STATUS_INACTIVE:
753
                return 'LABEL_INACTIVE';
754
            default:
755
                return '';
1 www 756
        }
17178 stevensc 757
    }
758
 
759
    /**
760
     * Get topic privacy label
761
     * @param int $privacy
762
     * @return string
763
     */
764
    private function getTopicPrivacy($privacy)
765
    {
766
        switch ($privacy) {
767
            case MicrolearningTopic::PRIVACY_PUBLIC:
768
                return 'LABEL_PUBLIC';
769
            case MicrolearningTopic::PRIVACY_PRIVATE:
770
                return 'LABEL_PRIVATE';
771
            default:
772
                return '';
1 www 773
        }
774
    }
17178 stevensc 775
 
776
    /**
777
     * Get topic type label
778
     * @param int $type
779
     * @return string
780
     */
781
    private function getTopicType($type)
782
    {
783
        switch ($type) {
784
            case MicrolearningTopic::TYPE_FREE:
785
                return 'LABEL_FREE';
786
            case MicrolearningTopic::TYPE_PRIVATE:
787
                return 'LABEL_PRIVATE';
788
            case MicrolearningTopic::TYPE_SELLING:
789
                return 'LABEL_SELLING';
790
            default:
791
                return '';
792
        }
793
    }
794
 
795
     /**
796
     * Prepare topic actions
797
     * @param \LeadersLinked\Model\MicrolearningTopic $record
798
     * @param array $permissions
799
     * @param int $totalUsers
800
     * @param int $totalUsersActive
801
     * @return array
802
     */
803
    private function prepareTopicActions($record, $permissions, $totalUsers, $totalUsersActive)
804
    {
805
        $params = ['topic_uuid' => $record->uuid];
806
 
807
        return [
808
            'link_edit' => $permissions['allowEdit'] ? $this->url()->fromRoute('microlearning/content/topics/edit', $params) : '',
809
            'link_delete' => $permissions['allowDelete'] ? $this->url()->fromRoute('microlearning/content/topics/delete', $params) : '',
810
            'link_total_users' => $permissions['allowUsers'] && $totalUsers ?
811
                $this->url()->fromRoute('microlearning/content/topics/users', [
812
                    'topic_uuid' => $record->uuid,
813
                    'type' => 'all'
814
                ]) : '',
815
            'link_total_users_actives' => $permissions['allowUsers'] && $totalUsersActive ?
816
                $this->url()->fromRoute('microlearning/content/topics/users', [
817
                    'topic_uuid' => $record->uuid,
818
                    'type' => 'active'
819
                ]) : ''
820
        ];
821
    }
1 www 822
}