Proyectos de Subversion LeadersLinked - Backend

Rev

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