Proyectos de Subversion LeadersLinked - Backend

Rev

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