Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17134 | Rev 17138 | 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;
16
 
17
 
18
use LeadersLinked\Mapper\CompanyMapper;
17002 efrain 19
use LeadersLinked\Mapper\MicrolearningTopicMapper;
20
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
21
use LeadersLinked\Mapper\MicrolearningSlideMapper;
22
use LeadersLinked\Model\MicrolearningSlide;
1 www 23
use LeadersLinked\Model\VideoConvert;
24
use LeadersLinked\Mapper\VideoConvertMapper;
17133 stevensc 25
use LeadersLinked\Form\Microlearning\SlideForm;
17134 stevensc 26
use LeadersLinked\Form\Microlearning\SlideTextAddForm;
27
use LeadersLinked\Form\Microlearning\SlideTextEditForm;
28
use LeadersLinked\Form\Microlearning\SlideImageAddForm;
29
use LeadersLinked\Form\Microlearning\SlideImageEditForm;
30
use LeadersLinked\Form\Microlearning\SlideVideoAddForm;
31
use LeadersLinked\Form\Microlearning\SlideDocumentAddForm;
32
use LeadersLinked\Form\Microlearning\SlideDocumentEditForm;
33
use LeadersLinked\Form\Microlearning\SlideAudioAddForm;
34
use LeadersLinked\Form\Microlearning\SlideAudioEditForm;
35
use LeadersLinked\Form\Microlearning\SlideQuizzAddForm;
36
use LeadersLinked\Form\Microlearning\SlideQuizzEditForm;
37
use LeadersLinked\Form\Microlearning\SlideVideoEditForm;
17002 efrain 38
use LeadersLinked\Library\Storage;
1 www 39
 
40
 
41
class MicrolearningSlideController extends AbstractActionController
42
{
43
    /**
44
     *
16769 efrain 45
     * @var \Laminas\Db\Adapter\AdapterInterface
1 www 46
     */
47
    private $adapter;
48
 
49
    /**
50
     *
16769 efrain 51
     * @var \LeadersLinked\Cache\CacheInterface
1 www 52
     */
16769 efrain 53
    private $cache;
54
 
55
 
56
    /**
57
     *
58
     * @var \Laminas\Log\LoggerInterface
59
     */
1 www 60
    private $logger;
61
 
62
    /**
63
     *
64
     * @var array
65
     */
66
    private $config;
67
 
16769 efrain 68
 
1 www 69
    /**
70
     *
16769 efrain 71
     * @var \Laminas\Mvc\I18n\Translator
72
     */
73
    private $translator;
74
 
75
 
76
    /**
77
     *
78
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
79
     * @param \LeadersLinked\Cache\CacheInterface $cache
80
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
1 www 81
     * @param array $config
16769 efrain 82
     * @param \Laminas\Mvc\I18n\Translator $translator
1 www 83
     */
16769 efrain 84
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 85
    {
16769 efrain 86
        $this->adapter      = $adapter;
87
        $this->cache        = $cache;
88
        $this->logger       = $logger;
89
        $this->config       = $config;
90
        $this->translator   = $translator;
1 www 91
    }
92
 
93
    /**
94
     *
95
     * Generación del listado de perfiles
96
     * {@inheritDoc}
97
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
98
     */
99
    public function indexAction()
100
    {
101
        $currentUserPlugin = $this->plugin('currentUserPlugin');
102
        $currentUser = $currentUserPlugin->getUser();
103
        $currentCompany = $currentUserPlugin->getCompany();
104
 
105
        $request = $this->getRequest();
106
        if($request->isGet()) {
107
 
108
 
109
            $headers  = $request->getHeaders();
110
 
111
            $isJson = false;
112
            if($headers->has('Accept')) {
113
                $accept = $headers->get('Accept');
114
 
115
                $prioritized = $accept->getPrioritized();
116
 
117
                foreach($prioritized as $key => $value) {
118
                    $raw = trim($value->getRaw());
119
 
120
                    if(!$isJson) {
121
                        $isJson = strpos($raw, 'json');
122
                    }
123
 
124
                }
125
            }
126
 
127
            if($isJson) {
17136 stevensc 128
                $capsule_uuid = Functions::sanitizeFilterString($this->params()->fromQuery('capsule_uuid'));
1 www 129
 
130
                $data = [
131
                    'link_add' => '',
132
                    'items' => [] ,
133
                    'total' => 0,
134
                ];
135
 
17002 efrain 136
                $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 137
                $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
17136 stevensc 138
 
1 www 139
                if(!$capsule) {
140
                    return new JsonModel([
141
                        'success' => true,
142
                        'data' => 'ERROR_CAPSULE_NOT_FOUND'
143
                    ]);
144
                }
145
 
17002 efrain 146
                if($capsule->company_id != $currentCompany->id) {
1 www 147
                    return new JsonModel([
148
                        'success' => true,
149
                        'data' => 'ERROR_UNAUTHORIZED'
150
                    ]);
151
                }
152
 
153
                $search = $this->params()->fromQuery('search', []);
16766 efrain 154
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
1 www 155
 
156
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
7065 nelberth 157
                $page               = (intval($this->params()->fromQuery('start', 1), 10)/$records_x_page)+1;
1 www 158
                $order =  $this->params()->fromQuery('order', []);
159
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
16766 efrain 160
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
1 www 161
 
162
                $fields =  ['name'];
163
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
164
 
165
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
166
                    $order_direction = 'ASC';
167
                }
168
 
169
 
170
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
171
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/slides/add');
172
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/slides/edit');
173
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/slides/delete');
174
 
17002 efrain 175
                $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
176
                $paginator = $slideMapper->fetchAllDataTableByCompanyIdAndCapsuleId($currentCompany->id, $capsule->id,  $search, $page, $records_x_page, $order_field, $order_direction);
1 www 177
 
178
                $records = $paginator->getCurrentItems();
179
 
17018 efrain 180
                $storage = Storage::getInstance($this->config, $this->adapter);
17002 efrain 181
                $path = $storage->getPathMicrolearningSlide();
1 www 182
 
17002 efrain 183
 
1 www 184
                $items = [];
185
                foreach($records as $record)
186
                {
187
 
188
                    $params = [
189
                        'capsule_uuid'  => $capsule->uuid,
190
                        'slide_uuid'    => $record->uuid,
191
 
192
                    ];
193
 
194
 
195
                    $item = [
196
 
197
                        'name' => $record->name,
198
                        'details' => [
199
                            'type' => '',
200
                         ],
201
                         'media' => [
202
                            'image' => '',
203
                            'audio' => '',
204
                            'video' => '',
205
                            'document' => '',
206
                            'text'
207
                        ],
208
 
209
                        'actions' => [
210
                            'link_edit' => $allowEdit ? $this->url()->fromRoute('microlearning/content/slides/edit', $params)  : '',
211
                            'link_delete' => $allowDelete ? $this->url()->fromRoute('microlearning/content/slides/delete', $params )  : '',
212
                         ],
213
 
214
                    ];
215
 
216
 
217
                    switch($record->type)
218
                    {
17002 efrain 219
                        case MicrolearningSlide::TYPE_AUDIO :
1 www 220
 
17002 efrain 221
                            $item['media']['audio'] = $storage->getGenericFile($path, $record->uuid, $record->file );
222
                            $item['media']['image'] = $storage->getGenericImage($path, $record->uuid, $record->background );
1 www 223
                            $item['details']['type'] = 'LABEL_AUDIO';
224
                            break;
225
 
17002 efrain 226
                        case MicrolearningSlide::TYPE_VIDEO :
227
                            $item['media']['video'] = $storage->getGenericFile($path, $record->uuid, $record->file );
228
                            $item['media']['image'] = $storage->getGenericImage($path, $record->uuid, $record->background );
1 www 229
                            $item['details']['type'] = 'LABEL_VIDEO';
230
                            break;
231
 
17002 efrain 232
                        case MicrolearningSlide::TYPE_DOCUMENT :
233
                            $item['media']['document'] =  $storage->getGenericFile($path, $record->uuid, $record->file );
234
                            $item['media']['image'] = $storage->getGenericImage($path, $record->uuid, $record->background );
1 www 235
                            $item['details']['type'] = 'LABEL_DOCUMENT';
236
                            break;
237
 
17002 efrain 238
                        case MicrolearningSlide::TYPE_TEXT :
239
                            $item['media']['image'] = $storage->getGenericImage($path, $record->uuid, $record->background );
1 www 240
                            $item['media']['text'] = $this->url()->fromRoute('microlearning/content/slides/text', $params);
241
                            $item['details']['type'] = 'LABEL_TEXT';
242
                            break;
243
 
17002 efrain 244
                        case MicrolearningSlide::TYPE_QUIZ :
245
                            $item['media']['image'] = $storage->getGenericImage($path, $record->uuid, $record->background );
1 www 246
                            $item['details']['type'] = 'LABEL_QUIZ';
247
                            break;
248
 
17002 efrain 249
                        case MicrolearningSlide::TYPE_IMAGE :
250
                            $item['media']['image'] =  $storage->getGenericImage($path, $record->uuid, $record->file );
1 www 251
                            $item['details']['type'] = 'LABEL_IMAGE';
252
                            break;
253
 
254
                    }
17136 stevensc 255
 
1 www 256
                    array_push($items, $item);
257
                }
258
 
17002 efrain 259
                if($allowAdd  && $capsule) {
260
                    $data['link_add'] = $this->url()->fromRoute('microlearning/content/slides/add', ['capsule_uuid' => $capsule->uuid ]);
1 www 261
                }
262
                $data['items'] = $items;
263
                $data['total'] = $paginator->getTotalItemCount();
264
 
265
                return new JsonModel([
266
                    'success' => true,
267
                    'data' => $data
268
                ]);
269
 
270
            } else {
271
                $image_size = $this->config['leaderslinked.image_sizes.microlearning_image_upload'];
272
 
17002 efrain 273
 
1 www 274
 
17002 efrain 275
                $form = new SlideForm($this->adapter,  $currentCompany->id);
1 www 276
                $formTextAdd = new SlideTextAddForm();
277
                $formTextEdit = new SlideTextEditForm();
278
                $formImageAdd = new SlideImageAddForm();
279
                $formImageEdit = new SlideImageEditForm();
280
                $formVideoAdd = new SlideVideoAddForm();
281
                $formVideoEdit = new SlideVideoEditForm();
282
                $formDocumentAdd = new SlideDocumentAddForm();
283
                $formDocumentEdit = new SlideDocumentEditForm();
284
                $formAudioAdd = new SlideAudioAddForm();
285
                $formAudioEdit = new SlideAudioEditForm();
286
                $formQuizzAdd = new SlideQuizzAddForm($this->adapter, $currentCompany->id);
287
                $formQuizzEdit = new SlideQuizzEditForm($this->adapter, $currentCompany->id);
288
 
289
                $this->layout()->setTemplate('layout/layout-backend.phtml');
290
                $viewModel = new ViewModel();
291
                $viewModel->setTemplate('leaders-linked/microlearning-slides/index.phtml');
292
                $viewModel->setVariables([
293
                    'form' => $form,
294
                    'formTextAdd' => $formTextAdd,
295
                    'formTextEdit' => $formTextEdit,
296
                    'formImageAdd' => $formImageAdd,
297
                    'formImageEdit' => $formImageEdit,
298
                    'formVideoAdd' => $formVideoAdd,
299
                    'formVideoEdit' => $formVideoEdit,
300
                    'formDocumentAdd' => $formDocumentAdd,
301
                    'formDocumentEdit' => $formDocumentEdit,
302
                    'formAudioAdd' => $formAudioAdd,
303
                    'formAudioEdit' => $formAudioEdit,
304
                    'formQuizzAdd' => $formQuizzAdd,
305
                    'formQuizzEdit' => $formQuizzEdit,
306
                    'image_size' => $image_size,
307
 
308
                ]);
309
                return $viewModel ;
310
            }
311
        }
312
 
313
        return new JsonModel([
314
            'success' => false,
315
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
316
        ]);
317
 
318
 
319
 
320
 
321
 
322
 
323
 
324
    }
325
 
326
    public function addAction()
327
    {
328
 
329
        $currentUserPlugin = $this->plugin('currentUserPlugin');
330
        $currentUser = $currentUserPlugin->getUser();
331
        $currentCompany = $currentUserPlugin->getCompany();
332
 
333
        $request    = $this->getRequest();
334
        $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
335
 
336
 
337
 
17002 efrain 338
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 339
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
340
        if(!$capsule) {
341
            return new JsonModel([
342
                'success'   => false,
343
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
344
            ]);
345
        }
346
 
17002 efrain 347
        if($capsule->company_id != $currentCompany->id) {
1 www 348
            return new JsonModel([
349
                'success'   => false,
350
                'data'   => 'ERROR_UNAUTHORIZED'
351
            ]);
352
        }
353
 
354
 
355
        if($request->isPost()) {
356
 
357
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
358
 
359
            switch($dataPost['type'])
360
            {
17002 efrain 361
                case MicrolearningSlide::TYPE_AUDIO :
1 www 362
                    $form = new SlideAudioAddForm();
363
                    break;
364
 
17002 efrain 365
                case MicrolearningSlide::TYPE_VIDEO :
1 www 366
                    $form = new SlideVideoAddForm();
367
                    break;
368
 
17002 efrain 369
                case MicrolearningSlide::TYPE_DOCUMENT:
1 www 370
                    $form = new SlideDocumentAddForm();
371
                    break;
372
 
17002 efrain 373
                case MicrolearningSlide::TYPE_IMAGE :
1 www 374
                    $form = new SlideImageAddForm();
375
                    break;
376
 
377
 
17002 efrain 378
                case MicrolearningSlide::TYPE_QUIZ:
1 www 379
                    $form = new SlideQuizzAddForm($this->adapter, $currentCompany->id);
380
                    break;
381
 
382
                default :
383
                    $form = new SlideTextAddForm();
384
                    break;
385
            }
386
 
387
            $form->setData($dataPost);
388
 
389
            if($form->isValid()) {
390
                $dataPost = (array) $form->getData();
391
 
392
                $hydrator = new ObjectPropertyHydrator();
17002 efrain 393
                $slide = new MicrolearningSlide();
1 www 394
                $hydrator->hydrate($dataPost, $slide);
395
 
17002 efrain 396
                $slide->company_id = $capsule->company_id;
1 www 397
                $slide->capsule_id = $capsule->id;
398
                $slide->file = null;
399
                $slide->background = null;
6194 nelberth 400
 
17002 efrain 401
                $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1 www 402
                if($slideMapper->insert($slide)) {
403
                    $slide = $slideMapper->fetchOne($slide->id);
404
 
17002 efrain 405
 
406
                    $image = Image::getInstance($this->config);
407
                    $target_path = $image->getStorage()->getPathMicrolearningSlide();
408
 
409
 
1 www 410
                    $files = $this->getRequest()->getFiles()->toArray();
17002 efrain 411
 
1 www 412
 
16943 efrain 413
                    if(isset($files['file']) && empty($files['file']['error'])) {
17002 efrain 414
 
415
 
1 www 416
 
16943 efrain 417
                        switch($slide->type)
418
                        {
419
 
17002 efrain 420
                            case MicrolearningSlide::TYPE_IMAGE :
1 www 421
 
16943 efrain 422
 
423
                                $tmp_filename  = $files['file']['tmp_name'];
17018 efrain 424
                                // $filename      = \LeadersLinked\Library\Functions::normalizeStringFilename($files['file']['name']);
16943 efrain 425
 
426
                                try {
427
                                    list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
428
 
429
                                    $filename =  'slide-' .uniqid() . '.jpg';
430
                                    $crop_to_dimensions = false;
17002 efrain 431
                                    $unlink_source = true;
432
 
17018 efrain 433
                                    if($image->uploadProcessChangeSize($tmp_filename, $target_path, $slide->uuid, $filename, $target_width, $target_height, $crop_to_dimensions, $unlink_source)) {
17002 efrain 434
                                        $slide->file = $filename;
16943 efrain 435
                                        $slideMapper->update($slide);
436
 
437
                                    }
438
                                } catch(\Throwable $e) {
439
                                    error_log($e->getTraceAsString());
440
                                }
441
 
442
                                break;
443
 
1 www 444
 
17002 efrain 445
                            case MicrolearningSlide::TYPE_DOCUMENT :
16943 efrain 446
                                $tmp_filename       = $files['file']['tmp_name'];
447
                                $original_filename  = trim(strtolower($files['file']['name']));
448
 
449
 
450
                                if($slide->file) {
17002 efrain 451
                                    if(!$image->getStorage()->deleteFile($target_path, $slide->uuid, $slide->file)) {
16943 efrain 452
                                        return new JsonModel([
453
                                            'success'   => false,
454
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
455
                                        ]);
456
                                    }
457
                                }
458
 
459
                                try {
460
 
461
                                    $parts = explode('.', $original_filename);
462
                                    $filename = 'document-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
463
 
17002 efrain 464
 
465
                                    if($image->getStorage()->moveAndputFile($target_path, $slide->uuid, $tmp_filename, $full_filename)) {
466
                                        $slide->file = $filename;
16943 efrain 467
                                        $slideMapper->update($slide);
468
                                    }
469
                                } catch(\Throwable $e) {
470
                                    error_log($e->getTraceAsString());
471
                                }
1 www 472
 
16943 efrain 473
                                break;
1 www 474
 
17002 efrain 475
                            case  MicrolearningSlide::TYPE_AUDIO :
16943 efrain 476
                                $tmp_filename       = $files['file']['tmp_name'];
477
                                $original_filename  = trim(strtolower($files['file']['name']));
1 www 478
 
16943 efrain 479
 
480
                                if($slide->file) {
481
                                    if(!image ::delete($target_path, $slide->file)) {
482
                                        return new JsonModel([
483
                                            'success'   => false,
484
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
485
                                        ]);
486
                                    }
1 www 487
                                }
488
 
16943 efrain 489
                                try {
1 www 490
 
16943 efrain 491
                                    $parts = explode('.', $original_filename);
492
                                    $filename = 'audio-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
1 www 493
 
17002 efrain 494
                                    $full_filename      =  sys_get_temp_dir() . DIRECTORY_SEPARATOR .$filename;
16943 efrain 495
                                    if(move_uploaded_file($tmp_filename , $full_filename)) {
496
 
497
 
17002 efrain 498
                                        $generateFileName   = substr($filename, 0, strrpos($filename, '.')) .  '.mp3';
499
                                        $generateFile       = sys_get_temp_dir() .  DIRECTORY_SEPARATOR . $generateFileName;
16943 efrain 500
                                        $cmd                = "/usr/bin/ffmpeg -i $full_filename -b:a 320000 $generateFile";
501
                                        exec($cmd);
502
 
17002 efrain 503
                                        if($image->getStorage()->putFile($target_path, $slide->uuid, $generateFile)) {
504
 
505
                                            $slide->file =  $generateFileName;
506
                                            $slideMapper->update($slide);
507
                                        }
16943 efrain 508
                                    }
1 www 509
 
16943 efrain 510
                                } catch(\Throwable $e) {
511
                                    error_log($e->getTraceAsString());
1 www 512
                                }
513
 
16943 efrain 514
                                break;
1 www 515
 
516
 
17002 efrain 517
                            case MicrolearningSlide::TYPE_VIDEO :
16943 efrain 518
                                $tmp_filename       = $files['file']['tmp_name'];
519
                                $original_filename  = trim(strtolower($files['file']['name']));
520
 
521
 
522
                                if($slide->file) {
523
                                    if(!image ::delete($target_path, $slide->file)) {
524
                                        return new JsonModel([
525
                                            'success'   => false,
526
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
527
                                        ]);
528
                                    }
529
                                }
530
 
531
                                try {
532
                                    $parts = explode('.', $original_filename);
533
                                    $filename = 'video-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
1 www 534
 
17002 efrain 535
                                    $full_filename      = $image->getStorage()->getTempPath()  . DIRECTORY_SEPARATOR .$filename;
1 www 536
 
16943 efrain 537
                                    if(move_uploaded_file($tmp_filename , $full_filename)) {
538
 
17002 efrain 539
                                        if($image->getStorage()->putFile($target_path, $slide->uuid, $full_filename)) {
16943 efrain 540
 
17002 efrain 541
                                            $videoConvert = new VideoConvert();
542
                                            $videoConvert->uuid = $slide->uuid;
543
                                            $videoConvert->filename = $full_filename;
544
                                            $videoConvert->type = VideoConvert::TYPE_MICRO_LEARNING_SLIDES;
545
 
546
                                            $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
547
                                            $videoConvertMapper->insert($videoConvert);
548
 
549
 
550
 
551
                                            $slide->file = $filename;
552
                                            $slideMapper->update($slide);
553
                                        }
16943 efrain 554
                                    }
1 www 555
 
16943 efrain 556
                                } catch(\Throwable $e) {
557
                                    echo $e->getMessage();
558
 
559
                                    error_log($e->getTraceAsString());
1 www 560
                                }
16943 efrain 561
                                break;
1 www 562
                        }
563
                    }
564
 
16943 efrain 565
                    if(isset($files['background']) && empty($files['background']['error'])) {
1 www 566
                        if($slide->background) {
567
                            if(!image ::delete($target_path, $slide->background)) {
568
                                return new JsonModel([
569
                                    'success'   => false,
570
                                    'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
571
                                ]);
572
                            }
573
                        }
574
 
575
                        $tmp_filename  = $files['background']['tmp_name'];
576
 
577
                        try {
578
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
579
 
580
                            $filename = 'background-' .uniqid() . '.png';
581
                            $crop_to_dimensions = true;
17002 efrain 582
                            $unlink_source = true;
583
 
17018 efrain 584
                            if($image->uploadProcessChangeSize($tmp_filename, $target_path, $slide->uuid, $filename, $target_width, $target_height, $crop_to_dimensions, $unlink_source)) {
1 www 585
                                $slide->background = $filename;
586
                                $slideMapper->update($slide);
587
                            }
588
                        } catch(\Throwable $e) {
589
                            error_log($e->getTraceAsString());
590
                        }
16943 efrain 591
                    }
1 www 592
 
593
                    $this->logger->info('Se agrego la diapositiva ' . $slide->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
594
 
595
                    $data = [
596
                        'success'   => true,
597
                        'data'   => 'LABEL_RECORD_ADDED'
598
                    ];
599
                } else {
600
                    $data = [
601
                        'success'   => false,
17002 efrain 602
                        'data'      => $slideMapper->getError()
1 www 603
                    ];
604
 
605
                }
606
 
607
                return new JsonModel($data);
608
 
609
            } else {
610
                $messages = [];
611
                $form_messages = (array) $form->getMessages();
612
                foreach($form_messages  as $fieldname => $field_messages)
613
                {
614
 
615
                    $messages[$fieldname] = array_values($field_messages);
616
                }
617
 
618
                return new JsonModel([
619
                    'success'   => false,
620
                    'data'   => $messages
621
                ]);
622
            }
623
 
624
        } else {
625
            $data = [
626
                'success' => false,
627
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
628
            ];
629
 
630
            return new JsonModel($data);
631
        }
632
 
633
        return new JsonModel($data);
634
    }
635
 
636
    /**
637
     *
638
     * Borrar un perfil excepto el público
639
     * @return \Laminas\View\Model\JsonModel
640
     */
641
    public function deleteAction()
642
    {
643
        $currentUserPlugin = $this->plugin('currentUserPlugin');
644
        $currentUser = $currentUserPlugin->getUser();
645
        $currentCompany = $currentUserPlugin->getCompany();
646
 
647
        $request    = $this->getRequest();
17002 efrain 648
 
1 www 649
        $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
650
        $slide_uuid = $this->params()->fromRoute('slide_uuid');
651
 
652
 
17002 efrain 653
 
1 www 654
 
17002 efrain 655
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 656
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
657
        if(!$capsule) {
658
            return new JsonModel([
659
                'success'   => false,
660
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
661
            ]);
662
        }
663
 
17002 efrain 664
        if($capsule->company_id != $currentCompany->id) {
1 www 665
            return new JsonModel([
666
                'success'   => false,
667
                'data'   => 'ERROR_UNAUTHORIZED'
668
            ]);
669
        }
670
 
17002 efrain 671
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1 www 672
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
673
        if(!$slide) {
674
            return new JsonModel([
675
                'success'   => false,
676
                'data'   => 'ERROR_SLIDE_NOT_FOUND'
677
            ]);
678
        }
679
 
680
        if($slide->capsule_id != $capsule->id) {
681
            return new JsonModel([
682
                'success'   => false,
683
                'data'   => 'ERROR_UNAUTHORIZED'
684
            ]);
685
        }
686
 
687
        if($request->isPost()) {
688
 
689
            $result =  $slideMapper->delete($slide);
690
            if($result) {
691
                $this->logger->info('Se borro la diapositiva : ' .  $capsule->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
17002 efrain 692
 
693
 
694
 
17018 efrain 695
                $storage = Storage::getInstance($this->config, $this->adapter);
17002 efrain 696
                $target_path = $storage->getPathMicrolearningSlide();
697
 
698
                $storage->deleteFile($target_path, $slide->uuid, $slide->file);
699
 
700
                if($slide->background) {
701
                    $storage->deleteFile($target_path, $slide->uuid, $slide->background);
1 www 702
                }
703
 
704
                $data = [
705
                    'success' => true,
706
                    'data' => 'LABEL_RECORD_DELETED'
707
                ];
708
            } else {
709
 
710
                $data = [
711
                    'success'   => false,
712
                    'data'      => $capsuleMapper->getError()
713
                ];
714
 
715
                return new JsonModel($data);
716
            }
717
 
718
        } else {
719
            $data = [
720
                'success' => false,
721
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
722
            ];
723
 
724
            return new JsonModel($data);
725
        }
726
 
727
        return new JsonModel($data);
728
    }
729
 
730
 
731
    public function editAction()
732
    {
733
        $currentUserPlugin = $this->plugin('currentUserPlugin');
734
        $currentUser = $currentUserPlugin->getUser();
735
        $currentCompany = $currentUserPlugin->getCompany();
736
 
737
        $request    = $this->getRequest();
738
        $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
739
        $slide_uuid   = $this->params()->fromRoute('slide_uuid');
17002 efrain 740
 
741
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 742
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
743
        if(!$capsule) {
744
            return new JsonModel([
745
                'success'   => false,
746
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
747
            ]);
748
        }
749
 
17002 efrain 750
        if($capsule->company_id != $currentCompany->id) {
1 www 751
            return new JsonModel([
752
                'success'   => false,
753
                'data'   => 'ERROR_UNAUTHORIZED'
754
            ]);
755
        }
756
 
757
 
17002 efrain 758
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1 www 759
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
760
        if(!$slide) {
761
            return new JsonModel([
762
                'success'   => false,
763
                'data'   => 'ERROR_SLIDE_NOT_FOUND'
764
            ]);
765
        }
766
 
767
        if($slide->capsule_id != $capsule->id) {
768
            return new JsonModel([
769
                'success'   => false,
770
                'data'   => 'ERROR_UNAUTHORIZED'
771
            ]);
772
        }
773
 
774
        if($request->isGet()) {
17002 efrain 775
 
17018 efrain 776
            $storage = Storage::getInstance($this->config, $this->adapter);
17002 efrain 777
            $path = $storage->getPathMicrolearningSlide();
778
 
779
 
780
            if($slide->type =='image'){
781
                $data = [
782
                    'success' => true,
783
                    'data' => [
784
                        'name' => $slide->name,
785
                        'type' => $slide->type,
786
                        'description' => $slide->description,
787
                        'order' => $slide->order,
788
                        'quiz_id' => $slide->quiz_id,
789
                        'file'=> $storage->getGenericImage($path, $slide->uuid, $slide->file),
790
                        'background' => ''
791
                    ]
792
                ];
793
            } else {
794
                $data = [
795
                    'success' => true,
796
                    'data' => [
797
                        'name' => $slide->name,
798
                        'type' => $slide->type,
799
                        'description' => $slide->description,
800
                        'order' => $slide->order,
801
                        'quiz_id' => $slide->quiz_id,
802
                        'file'=> $storage->getGenericFile($path, $slide->uuid, $slide->file),
803
                        'background' => $storage->getGenericImage($path, $slide->uuid, $slide->background),
804
                    ]
805
                ];
6647 nelberth 806
            }
1 www 807
 
808
            return new JsonModel($data);
809
        }
810
        else if($request->isPost()) {
811
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
812
 
813
            switch($dataPost['type'])
814
            {
17002 efrain 815
                case MicrolearningSlide::TYPE_AUDIO :
1 www 816
                    $form = new SlideAudioEditForm();
817
                    break;
818
 
17002 efrain 819
                case MicrolearningSlide::TYPE_VIDEO :
1 www 820
                    $form = new SlideVideoEditForm();
821
                    break;
822
 
17002 efrain 823
                case MicrolearningSlide::TYPE_DOCUMENT:
1 www 824
                    $form = new SlideDocumentEditForm();
825
                    break;
826
 
17002 efrain 827
                case MicrolearningSlide::TYPE_IMAGE :
1 www 828
                    $form = new SlideImageEditForm();
829
                    break;
830
 
17002 efrain 831
                case MicrolearningSlide::TYPE_QUIZ:
1 www 832
                    $form = new SlideQuizzEditForm($this->adapter, $currentCompany->id);
833
                    break;
834
 
835
                default :
836
                    $form = new SlideTextEditForm();
837
                    break;
838
 
839
            }
840
            $form->setData($dataPost);
841
 
842
            if($form->isValid()) {
843
                $dataPost = (array) $form->getData();
844
                $hydrator = new ObjectPropertyHydrator();
845
                $hydrator->hydrate($dataPost, $slide);
846
 
847
                $slide->file = null;
848
                $slide->background = null;
849
 
850
                if($slideMapper->update($slide)) {
851
                    $slide = $slideMapper->fetchOne($slide->id);
852
 
853
 
17002 efrain 854
 
16943 efrain 855
                    $files = $this->getRequest()->getFiles()->toArray();
1 www 856
 
17002 efrain 857
 
858
                    $image = Image::getInstance($this->config);
859
                    $target_path = $image->getStorage()->getPathMicrolearningSlide();
860
 
16943 efrain 861
                    if(isset($files['file']) && empty($files['file']['error'])) {
6520 nelberth 862
 
16943 efrain 863
                        switch($slide->type)
864
                        {
7238 nelberth 865
 
17002 efrain 866
                            case MicrolearningSlide::TYPE_IMAGE :
16943 efrain 867
 
868
 
869
                                $tmp_filename  = $files['file']['tmp_name'];
17018 efrain 870
                                // $filename      = \LeadersLinked\Library\Functions::normalizeStringFilename($files['file']['name']);
16943 efrain 871
 
872
                                try {
873
                                    list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
874
 
875
                                    $filename =  'slide-' .uniqid() . '.jpg';
876
                                    $crop_to_dimensions = false;
17002 efrain 877
                                    $unlink_source = true;
878
 
17018 efrain 879
                                    if($image->uploadProcessChangeSize($tmp_filename, $target_path, $slide->uuid, $filename, $target_width, $target_height, $crop_to_dimensions, $unlink_source)) {
16943 efrain 880
                                        $slide->file = basename($filename);
881
                                        $slideMapper->update($slide);
882
 
883
                                    }
884
                                } catch(\Throwable $e) {
885
                                    error_log($e->getTraceAsString());
7236 nelberth 886
                                }
1 www 887
 
16943 efrain 888
                                break;
1 www 889
 
16943 efrain 890
 
17002 efrain 891
                            case MicrolearningSlide::TYPE_DOCUMENT :
16943 efrain 892
                                $tmp_filename       = $files['file']['tmp_name'];
893
                                $original_filename  = trim(strtolower($files['file']['name']));
894
 
895
 
896
                                if($slide->file) {
17002 efrain 897
                                    if(!$image->getStorage()->deleteFile($target_path, $slide->uuid, $slide->file)) {
16943 efrain 898
                                        return new JsonModel([
899
                                            'success'   => false,
900
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
901
                                        ]);
902
                                    }
1 www 903
                                }
904
 
16943 efrain 905
                                try {
906
 
907
                                    $parts = explode('.', $original_filename);
908
                                    $filename = 'document-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
909
 
17002 efrain 910
                                    if($image->getStorage()->moveAndPutFile($target_path, $slide->uuid, $tmp_filename, $filename)) {
911
                                        $slide->file = $filename;
16943 efrain 912
                                        $slideMapper->update($slide);
913
                                    }
914
                                } catch(\Throwable $e) {
915
                                    error_log($e->getTraceAsString());
916
                                }
1 www 917
 
16943 efrain 918
                                break;
919
 
17002 efrain 920
                            case  MicrolearningSlide::TYPE_AUDIO :
16943 efrain 921
                                $tmp_filename       = $files['file']['tmp_name'];
922
                                $original_filename  = trim(strtolower($files['file']['name']));
923
 
924
 
925
                                if($slide->file) {
926
                                    if(!image ::delete($target_path, $slide->file)) {
927
                                        return new JsonModel([
928
                                            'success'   => false,
929
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
930
                                        ]);
931
                                    }
932
                                }
933
 
934
                                try {
1 www 935
 
16943 efrain 936
                                    $parts = explode('.', $original_filename);
937
                                    $filename = 'audio-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
1 www 938
 
17002 efrain 939
                                    $full_filename      = $image->getStorage()->getTempPath()  . DIRECTORY_SEPARATOR .$filename;
16943 efrain 940
                                    if(move_uploaded_file($tmp_filename , $full_filename)) {
941
 
942
 
17002 efrain 943
                                        $generateFileName   = substr($filename, 0, strrpos($filename, '.')).  '.mp3';
944
                                        $generateFile       =  $image->getStorage()->getTempPath()  . DIRECTORY_SEPARATOR . $generateFileName ;
16943 efrain 945
                                        $cmd                = "/usr/bin/ffmpeg -i $full_filename -b:a 320000 $generateFile";
946
                                        exec($cmd);
947
 
17002 efrain 948
                                        if($image->getStorage()->putFile($target_path, $slide->uuid, $generateFile)) {
949
 
950
                                            $slide->file = $generateFileName;
951
                                            $slideMapper->update($slide);
952
                                        }
16943 efrain 953
                                    }
1 www 954
 
16943 efrain 955
                                } catch(\Throwable $e) {
956
                                    error_log($e->getTraceAsString());
1 www 957
                                }
958
 
16943 efrain 959
                                break;
1 www 960
 
16943 efrain 961
 
17002 efrain 962
                            case MicrolearningSlide::TYPE_VIDEO :
16943 efrain 963
                                $tmp_filename       = $files['file']['tmp_name'];
964
                                $original_filename  = trim(strtolower($files['file']['name']));
965
 
966
 
967
                                if($slide->file) {
968
                                    if(!image ::delete($target_path, $slide->file)) {
969
                                        return new JsonModel([
970
                                            'success'   => false,
971
                                            'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
972
                                        ]);
973
                                    }
974
                                }
975
 
976
                                try {
977
                                    $parts = explode('.', $original_filename);
978
                                    $filename = 'video-' . uniqid() . '.' . $parts[ count($parts) - 1 ];
1 www 979
 
16943 efrain 980
                                    $full_filename      = $target_path  . DIRECTORY_SEPARATOR .$filename;
1 www 981
 
16943 efrain 982
                                    if(move_uploaded_file($tmp_filename , $full_filename)) {
983
 
984
                                        $videoConvert = new VideoConvert();
985
                                        $videoConvert->filename = $full_filename;
986
                                        $videoConvert->type = VideoConvert::TYPE_MICRO_LEARNING;
987
 
988
                                        $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
989
                                        $videoConvertMapper->insert($videoConvert);
990
 
991
                                        $slide->file = basename($full_filename);
992
                                        $slideMapper->update($slide);
993
                                    }
1 www 994
 
16943 efrain 995
                                } catch(\Throwable $e) {
996
                                    echo $e->getMessage();
997
 
998
                                    error_log($e->getTraceAsString());
1 www 999
                                }
16943 efrain 1000
                                break;
1 www 1001
                        }
1002
                    }
1003
 
1004
                    if(isset($files['background']) && empty($files['background']['error'])) {
1005
                        if($slide->background) {
1006
                            if(!image ::delete($target_path, $slide->background)) {
1007
                                return new JsonModel([
1008
                                    'success'   => false,
1009
                                    'data'   =>  'ERROR_THERE_WAS_AN_ERROR'
1010
                                ]);
1011
                            }
1012
                        }
1013
 
1014
                        $tmp_filename  = $files['background']['tmp_name'];
1015
 
1016
                        try {
1017
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.microlearning_image_size']);
1018
 
1019
                            $filename = 'background-' .uniqid() . '.png';
1020
                            $crop_to_dimensions = true;
17002 efrain 1021
                            $unlink_source = true;
1022
 
17018 efrain 1023
                            if($image->uploadProcessChangeSize($tmp_filename, $target_path, $slide->uuid, $filename, $target_width, $target_height, $crop_to_dimensions, $unlink_source)) {
17002 efrain 1024
                               $slide->background = $filename;
1 www 1025
                                $slideMapper->update($slide);
1026
                            }
1027
                        } catch(\Throwable $e) {
1028
                            error_log($e->getTraceAsString());
1029
                        }
16943 efrain 1030
                    }
1 www 1031
 
1032
                    $this->logger->info('Se edito la diapositiva ' . $slide->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1033
 
1034
                    $data = [
1035
                        'success'   => true,
1036
                        'data'   => 'LABEL_RECORD_UPDATED'
1037
                    ];
1038
                } else {
1039
                    $data = [
1040
                        'success'   => false,
1041
                        'data'      => $capsuleMapper->getError()
1042
                    ];
1043
 
1044
                }
1045
 
1046
                return new JsonModel($data);
1047
 
1048
            } else {
1049
                $messages = [];
1050
                $form_messages = (array) $form->getMessages();
1051
                foreach($form_messages  as $fieldname => $field_messages)
1052
                {
1053
 
1054
                    $messages[$fieldname] = array_values($field_messages);
1055
                }
1056
 
1057
                return new JsonModel([
1058
                    'success'   => false,
1059
                    'data'   => $messages
1060
                ]);
1061
            }
1062
        } else {
1063
            $data = [
1064
                'success' => false,
1065
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1066
            ];
1067
 
1068
            return new JsonModel($data);
1069
        }
1070
 
1071
        return new JsonModel($data);
1072
    }
1073
 
1074
 
1075
    public function textAction()
1076
    {
1077
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1078
        $currentUser = $currentUserPlugin->getUser();
1079
        $currentCompany = $currentUserPlugin->getCompany();
1080
 
1081
        $request    = $this->getRequest();
1082
        $capsule_uuid = $this->params()->fromRoute('capsule_uuid');
1083
        $slide_uuid   = $this->params()->fromRoute('slide_uuid');
1084
 
17002 efrain 1085
        $capsuleMapper = MicrolearningCapsuleMapper::getInstance($this->adapter);
1 www 1086
        $capsule = $capsuleMapper->fetchOneByUuid($capsule_uuid);
1087
        if(!$capsule) {
1088
            return new JsonModel([
1089
                'success'   => false,
1090
                'data'   => 'ERROR_CAPSULE_NOT_FOUND'
1091
            ]);
1092
        }
1093
 
17002 efrain 1094
        if($capsule->company_id != $currentCompany->id) {
1 www 1095
            return new JsonModel([
1096
                'success'   => false,
1097
                'data'   => 'ERROR_UNAUTHORIZED'
1098
            ]);
1099
        }
1100
 
1101
 
17002 efrain 1102
        $slideMapper = MicrolearningSlideMapper::getInstance($this->adapter);
1 www 1103
        $slide = $slideMapper->fetchOneByUuid($slide_uuid);
1104
        if(!$slide) {
1105
            return new JsonModel([
1106
                'success'   => false,
1107
                'data'   => 'ERROR_SLIDE_NOT_FOUND'
1108
            ]);
1109
        }
1110
 
1111
        if($slide->capsule_id != $capsule->id) {
1112
            return new JsonModel([
1113
                'success'   => false,
1114
                'data'   => 'ERROR_UNAUTHORIZED'
1115
            ]);
1116
        }
1117
 
1118
        if($request->isGet()) {
1119
            $data = [
1120
                'success' => true,
1121
                'data' => $slide->description,
1122
            ];
1123
 
1124
            return new JsonModel($data);
1125
 
1126
        } else {
1127
            $data = [
1128
                'success' => false,
1129
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1130
            ];
1131
 
1132
            return new JsonModel($data);
1133
        }
1134
 
1135
        return new JsonModel($data);
1136
    }
1137
 
1138
 
1139
 
1140
 
1141
 
1142
}