Proyectos de Subversion LeadersLinked - Backend

Rev

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