Proyectos de Subversion LeadersLinked - Backend

Rev

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