Proyectos de Subversion LeadersLinked - Backend

Rev

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