Proyectos de Subversion LeadersLinked - Backend

Rev

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