Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
13304 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\FeedMapper;
15
use LeadersLinked\Mapper\TopicMapper;
14748 kerby 16
use LeadersLinked\Mapper\FeedTopicMapper;
17
use LeadersLinked\Mapper\QueryMapper;
18
use Laminas\Paginator\Adapter\DbSelect;
19
use Laminas\Paginator\Paginator;
14880 kerby 20
use LeadersLinked\Form\DevelopmentContentCreateFeedForm;
14748 kerby 21
use LeadersLinked\Form\TopicForm;
22
use Laminas\Hydrator\ArraySerializableHydrator;
23
use Laminas\Db\ResultSet\HydratingResultSet;
24
use LeadersLinked\Model\FeedTopic;
13304 eleazar 25
use LeadersLinked\Model\Feed;
14748 kerby 26
use LeadersLinked\Model\Topic;
27
use LeadersLinked\Mapper\CompanyMapper;
28
use LeadersLinked\Model\Company;
13304 eleazar 29
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
30
 
14748 kerby 31
 
14743 kerby 32
class DevelopmentContentController extends AbstractActionController
33
{
13304 eleazar 34
 
35
    /**
36
     *
37
     * @var AdapterInterface
38
     */
39
    private $adapter;
40
 
41
    /**
42
     *
43
     * @var AbstractAdapter
44
     */
45
    private $cache;
46
 
47
    /**
48
     *
49
     * @var  LoggerInterface
50
     */
51
    private $logger;
52
 
53
    /**
54
     *
55
     * @var array
56
     */
57
    private $config;
58
 
59
    /**
60
     *
61
     * @param AdapterInterface $adapter
62
     * @param AbstractAdapter $cache
63
     * @param LoggerInterface $logger
64
     * @param array $config
65
     */
14743 kerby 66
    public function __construct($adapter, $cache, $logger, $config)
67
    {
13304 eleazar 68
        $this->adapter = $adapter;
69
        $this->cache = $cache;
70
        $this->logger = $logger;
71
        $this->config = $config;
72
    }
15028 efrain 73
 
14743 kerby 74
    public function indexAction()
75
    {
15028 efrain 76
        return new JsonModel([
77
            'success' => false,
78
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
79
        ]);
80
    }
81
 
82
    public function listingAction()
83
    {
13304 eleazar 84
        $request = $this->getRequest();
85
        $currentUserPlugin = $this->plugin('currentUserPlugin');
86
        $currentCompany = $currentUserPlugin->getCompany();
87
        $currentUser = $currentUserPlugin->getUser();
88
 
89
        if ($request->isGet()) {
90
 
91
            $headers = $request->getHeaders();
92
 
93
            $isJson = false;
94
            if ($headers->has('Accept')) {
95
                $accept = $headers->get('Accept');
96
 
97
                $prioritized = $accept->getPrioritized();
98
 
99
                foreach ($prioritized as $key => $value) {
100
                    $raw = trim($value->getRaw());
101
 
102
                    if (!$isJson) {
103
                        $isJson = strpos($raw, 'json');
104
                    }
105
                }
106
            }
107
 
14997 kerby 108
 
13304 eleazar 109
            if ($isJson) {
14749 kerby 110
 
14750 kerby 111
 
13304 eleazar 112
                $search = $this->params()->fromQuery('search', []);
113
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
114
 
115
                $page = intval($this->params()->fromQuery('start', 1), 10);
116
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
117
 
14743 kerby 118
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
119
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'development-and-content/add');
120
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'development-and-content/edit');
121
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'development-and-content/delete');
122
                $allowAproved = $acl->isAllowed($currentUser->usertype_id, 'development-and-content/aproved');
123
                $allowCategories = $acl->isAllowed($currentUser->usertype_id, 'development-and-content/categories');
14751 kerby 124
 
13304 eleazar 125
                $items = [];
126
                $feedMapper = FeedMapper::getInstance($this->adapter);
14967 kerby 127
                $category_uuid = $this->params()->fromRoute('category_id');
128
 
129
                if (!$category_uuid) {
130
                    $paginator = $feedMapper->fetchAllByDevelop($allowEdit);
131
                }else{
132
                    $topicMapper = TopicMapper::getInstance($this->adapter);
133
                    $topic = $topicMapper->fetchOneByUuid($category_uuid);
134
                    if (!$topic) {
135
                        $data = [
136
                            'success' => false,
137
                            'data' => 'ERROR_RECORD_NOT_FOUND'
138
                        ];
14743 kerby 139
 
14967 kerby 140
                        return new JsonModel($data);
141
                    }
142
                    $paginator = $feedMapper->fetchAllByDevelopAndCategoryId($topic->id, $allowEdit);
143
                }
144
 
145
 
13304 eleazar 146
                foreach ($paginator as $record) {
14743 kerby 147
                    $topicMapper = TopicMapper::getInstance($this->adapter);
148
                    $topic = $topicMapper->fetchOne($record->topic_id);
149
                    $topic_title =  ($topic) ? $topic->title : '';
150
                    $preview = ($record->file_image_preview != null && $record->file_image_preview != '') ? $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_image_preview]) : '';
13304 eleazar 151
                    $item = [
14743 kerby 152
                        'uuid' => $record->uuid,
13304 eleazar 153
                        'title' => $record->title,
14743 kerby 154
                        'topic' => $topic_title,
14605 kerby 155
                        'added_on' => $record->added_on,
13304 eleazar 156
                        'description' => $record->description,
14604 kerby 157
                        'file' => $record->file_type ? $record->file_type : '',
158
                        'link_media' => $record->link_media ? $record->link_media : '',
159
                        'link_name' => $record->link_name,
160
                        'file_name' => $record->file_name ? $record->file_name : '',
161
                        'link_file' => $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_name]),
14743 kerby 162
                        'status' => $record->status,
163
                        'preview' => $preview,
164
                        'actions' => [
14754 kerby 165
                            'link_edit' => ($allowEdit) ? $this->url()->fromRoute('development-and-content/edit', ['id' => $record->uuid]) : '',
166
                            'link_aproved' => ($allowAproved) ? $this->url()->fromRoute('development-and-content/aproved', ['id' => $record->uuid]) : '',
167
                            'link_delete' => ($allowDelete) ? $this->url()->fromRoute('development-and-content/delete', ['id' => $record->uuid]) : '',
14743 kerby 168
                        ]
13304 eleazar 169
                    ];
170
 
171
                    array_push($items, $item);
172
                }
14756 kerby 173
 
13304 eleazar 174
                return new JsonModel([
175
                    'success' => true,
176
                    'data' => [
177
                        'items' => $items,
178
                    ]
179
                ]);
180
            } else {
14997 kerby 181
                $topicMapper = TopicMapper::getInstance($this->adapter);
182
                $result = $topicMapper->fetchAllDevelopment();
14999 kerby 183
                $categories=[];
14997 kerby 184
                foreach ($result as $record) {
15004 kerby 185
 
14997 kerby 186
                    $item = [
187
                        'uuid'=>$record->uuid,
188
                        'title'=>$record->title,
15024 kerby 189
                        'filter'=>$this->url()->fromRoute('development-and-content', ['category_id' => $record->uuid]),
14997 kerby 190
                    ];
191
                    array_push($categories, $item);
192
                }
15004 kerby 193
 
15005 kerby 194
                // print_r($categories);
195
                // exit;
14997 kerby 196
 
14880 kerby 197
                $form = new DevelopmentContentCreateFeedForm($this->adapter, $currentCompany->id);
13304 eleazar 198
 
199
                $this->layout()->setTemplate('layout/layout-backend');
200
                $viewModel = new ViewModel();
13309 eleazar 201
                $viewModel->setTemplate('leaders-linked/development-content/index.phtml');
14743 kerby 202
                $viewModel->setVariables([
203
                    'form' => $form,
204
                    'categories' => $categories,
205
                ]);
13304 eleazar 206
                return $viewModel;
207
            }
208
        } else {
209
            return new JsonModel([
210
                'success' => false,
211
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
212
            ]);
213
        }
14743 kerby 214
    }
215
 
15028 efrain 216
    public function viewAction()
14743 kerby 217
    {
218
        $request = $this->getRequest();
219
        $currentUserPlugin = $this->plugin('currentUserPlugin');
220
        $currentCompany = $currentUserPlugin->getCompany();
221
        $currentUser = $currentUserPlugin->getUser();
222
 
223
 
224
        if ($request->isGet()) {
225
 
226
 
227
            $uuid = $this->params()->fromRoute('id');
228
            if (!$uuid) {
229
                $data = [
230
                    'success' => false,
231
                    'data' => 'ERROR_INVALID_PARAMETER'
232
                ];
233
 
234
                return new JsonModel($data);
235
            }
236
 
237
 
238
            $feedMapper = FeedMapper::getInstance($this->adapter);
239
            $record = $feedMapper->fetchOneByUuid($uuid);
240
 
241
            if ($record->company_id != $currentCompany->id) {
242
                $response = [
243
                    'success' => false,
244
                    'data' => 'ERROR_UNAUTHORIZED'
245
                ];
246
                return new JsonModel($response);
247
            }
248
 
249
            $topicMapper = TopicMapper::getInstance($this->adapter);
250
            $topic = $topicMapper->fetchOne($record->topic_id);
251
            $link_file = ($record->file_name != null && $record->file_name != '') ? $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_name]) : null;
252
            $preview = ($record->file_image_preview != null && $record->file_image_preview != '') ? $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_image_preview]) : null;
13304 eleazar 253
            return new JsonModel([
14743 kerby 254
                'success' => true,
255
                'data' => [
14968 kerby 256
                    'feed' => [
257
                        'uuid' => $record->uuid,
258
                        'title' => $record->title,
259
                        'added_on' => $record->added_on,
260
                        'description' => $record->description,
261
                        'file' => $record->file_type ? $record->file_type : '',
262
                        'link_media' => $record->link_media ? $record->link_media : '',
263
                        'link_name' => $record->link_name,
264
                        'file_name' => $record->file_name ? $record->file_name : '',
265
                        'link_file' => $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_name]),
266
                        'status' => $record->status,
267
                    ],
14743 kerby 268
                    'topic' => $topic,
269
                    'titulo' => $record->title,
270
                    'description' => $record->description,
271
                    'action' => $this->url()->fromRoute('development-and-content/edit', ['id' => $record->uuid]),
272
                    'link_file' => $link_file,
273
                    'preview' => $preview
274
                ]
275
            ]);
276
        } else {
277
            return new JsonModel([
13304 eleazar 278
                'success' => false,
14743 kerby 279
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
13304 eleazar 280
            ]);
281
        }
282
    }
283
 
14743 kerby 284
    public function addAction()
285
    {
13304 eleazar 286
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
14743 kerby 287
        $currentCompany     = $currentUserPlugin->getCompany();
13304 eleazar 288
        $currentUser        = $currentUserPlugin->getUser();
289
 
14743 kerby 290
        $request    = $this->getRequest();
291
        try {
292
            if ($request->isPost()) {
14880 kerby 293
                $form = new  DevelopmentContentCreateFeedForm($this->adapter);
14743 kerby 294
 
295
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
296
                $form->setData($dataPost);
297
 
298
                if ($form->isValid()) {
299
                    $dataPost = (array) $form->getData();
300
                    $hydrator = new ObjectPropertyHydrator();
301
                    $feed = new Feed();
302
                    $hydrator->hydrate($dataPost, $feed);
303
 
304
                    $topicMapper = TopicMapper::getInstance($this->adapter);
14829 kerby 305
                    $topic = $topicMapper->fetchOneByUuid($dataPost['category_content']);
14743 kerby 306
 
307
                    $feed->user_id = $currentUser->id;
308
                    $feed->company_id = $currentCompany->id;
309
                    $feed->user_id          = $currentUser->id;
310
                    $feed->status           = Feed::STATUS_SAVED;
311
                    $feed->topic_id         = $topic->id;
312
                    $feed->type             = Feed::TYPE_DC;
313
                    $feed->posted_or_shared = Feed::POSTED;
314
                    $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
315
 
316
                    $feed->total_comments   = 0;
317
                    $feed->total_shared     = 0;
318
 
319
 
14834 kerby 320
                    $filesArray = $this->getRequest()->getFiles()->toArray();
14743 kerby 321
                    $file_type = '';
14834 kerby 322
                    $files = null;
14833 kerby 323
 
14834 kerby 324
                    if (isset($filesArray['doc']) && empty($filesArray['doc']['error'])) {
325
                        $files = $filesArray['doc'];
326
                    }
327
                    if (isset($filesArray['video']) && empty($filesArray['video']['error'])) {
328
                        $files = $filesArray['video'];
329
                    }
14743 kerby 330
 
14834 kerby 331
                    if (isset($files) && empty($files['error'])) {
332
                        $feed_tmp_filename  = $files['tmp_name'];
333
                        $feed_filename      = $this->normalizeString($files['name']);
334
 
14743 kerby 335
                        $mime_type = mime_content_type($feed_tmp_filename);
336
                        if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
337
                            $file_type = Feed::FILE_TYPE_IMAGE;
338
                        } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
339
                            $file_type = Feed::FILE_TYPE_VIDEO;
340
                        } else if ($mime_type == 'application/pdf') {
341
                            $file_type = Feed::FILE_TYPE_DOCUMENT;
342
                        }
13304 eleazar 343
                    }
14743 kerby 344
                    //preview
14832 kerby 345
                    $fileImg = $this->params()->fromFiles('image');
14743 kerby 346
                    if (isset($fileImg) && empty($fileImg['error'])) {
13304 eleazar 347
 
14743 kerby 348
                        $img_tmp_filename  = $fileImg['tmp_name'];
349
                        $img_filename  = $this->normalizeString($fileImg['name']);
350
                    } else {
351
                        $img_tmp_filename = null;
352
                        $img_filename = null;
353
                    }
13304 eleazar 354
 
14743 kerby 355
                    $feedMapper = FeedMapper::getInstance($this->adapter);
13304 eleazar 356
 
14743 kerby 357
                    if ($feedMapper->insert($feed)) {
13304 eleazar 358
                        $feed = $feedMapper->fetchOne($feed->id);
14743 kerby 359
                        $feedMapper->update($feed);
360
                        if ($file_type == Feed::FILE_TYPE_DOCUMENT) {
13304 eleazar 361
                            try {
362
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
14743 kerby 363
                                if (!file_exists($target_path)) {
13304 eleazar 364
                                    mkdir($target_path, 0755);
365
                                }
14743 kerby 366
 
367
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
368
                                $result = move_uploaded_file($feed_tmp_filename, $full_filename);
369
                                if ($result) {
370
 
13304 eleazar 371
                                    $feed->file_type = $file_type;
372
                                    $feed->file_name = basename($feed_filename);
373
                                    $feedMapper->update($feed);
374
                                } else {
14743 kerby 375
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);
13304 eleazar 376
                                }
14743 kerby 377
                            } catch (\Throwable $e) {
13304 eleazar 378
                                error_log($e->getTraceAsString());
379
                            }
380
                        }
14743 kerby 381
                        if ($file_type == Feed::FILE_TYPE_IMAGE) {
13304 eleazar 382
                            try {
383
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
14743 kerby 384
                                if (!file_exists($target_path)) {
13304 eleazar 385
                                    mkdir($target_path, 0755);
386
                                }
14743 kerby 387
 
13304 eleazar 388
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
14743 kerby 389
 
13304 eleazar 390
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
391
                                $crop_to_dimensions = false;
14743 kerby 392
                                if (Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions)) {
13304 eleazar 393
                                    $feed->file_type = $file_type;
394
                                    $feed->file_name = basename($feed_filename);
395
                                    $feedMapper->update($feed);
396
                                }
14743 kerby 397
                            } catch (\Throwable $e) {
13304 eleazar 398
                                error_log($e->getTraceAsString());
399
                            }
400
                        }
14743 kerby 401
                        if ($file_type == Feed::FILE_TYPE_VIDEO) {
13304 eleazar 402
                            try {
403
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
14743 kerby 404
                                if (!file_exists($target_path)) {
13304 eleazar 405
                                    mkdir($target_path, 0755);
406
                                }
14743 kerby 407
 
13304 eleazar 408
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
14743 kerby 409
 
410
                                $result = move_uploaded_file($feed_tmp_filename, $full_filename);
411
                                if ($result) {
412
 
13304 eleazar 413
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
414
                                    $getFromSecound = 2;
14743 kerby 415
 
13304 eleazar 416
                                    //extracción del cover
417
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
418
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
419
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
420
                                    exec($cmd);
14743 kerby 421
 
422
 
13304 eleazar 423
                                    $feed->file_type = $file_type;
424
                                    $feed->file_name = basename($feed_filename);
425
                                    $feed->file_image_preview = basename($generateFile);
426
                                    $feedMapper->update($feed);
14743 kerby 427
 
13304 eleazar 428
                                    $videoConvert = new VideoConvert();
429
                                    $videoConvert->filename = $full_filename;
430
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
14743 kerby 431
 
13304 eleazar 432
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
433
                                    $videoConvertMapper->insert($videoConvert);
434
                                } else {
14743 kerby 435
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);
13304 eleazar 436
                                }
14743 kerby 437
                            } catch (\Throwable $e) {
13304 eleazar 438
                                error_log($e->getTraceAsString());
439
                            }
440
                        }
14743 kerby 441
 
442
                        if ($file_type != Feed::FILE_TYPE_VIDEO && !empty($img_tmp_filename) && !empty($img_filename)) {
443
 
444
                            try {
445
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
446
                                if (!file_exists($target_path)) {
447
                                    mkdir($target_path, 0755);
448
                                }
449
 
450
                                Functions::deleteFilename($target_path, $feed->file_image_preview);
451
 
452
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
453
 
454
                                $img_filename = substr($img_filename, 0, strrpos($img_filename, '.'))  . '.png';
455
 
456
 
457
                                if (Functions::uploadImage($img_tmp_filename, $target_path, $img_filename, $target_width, $target_height)) {
458
                                    $feed->file_image_preview = basename($img_filename);
459
                                    $feedMapper->update($feed);
460
                                }
461
                            } catch (\Throwable $e) {
462
                                error_log($e->getTraceAsString());
463
                            }
464
                        }
465
 
466
 
13304 eleazar 467
                        $response = [
468
                            'success'   => true,
469
                            'data'   => 'success'
470
                        ];
14743 kerby 471
                    } else {
472
                        $messages = [];
473
                        $form_messages = (array) $form->getMessages();
474
                        foreach ($form_messages  as $fieldname => $field_messages) {
475
                            $messages[$fieldname] = array_values($field_messages);
476
                        }
477
                    }
13304 eleazar 478
                } else {
14743 kerby 479
                    $response = [
480
                        'success' => false,
481
                        'data' => 'ERROR_METHOD_NOT_ALLOWED'
482
                    ];
13304 eleazar 483
                }
14743 kerby 484
 
485
                return new JsonModel($response);
486
            }
487
        } catch (\Throwable $e) {
488
            $e->getMessage();
489
            return new JsonModel([
490
                'success' => false,
491
                'data' => $e
492
            ]);
493
        }
494
    }
495
 
496
    public function deleteAction()
497
    {
498
        $currentUserPlugin = $this->plugin('currentUserPlugin');
499
        $currentUser = $currentUserPlugin->getUser();
500
        $currentCompany = $currentUserPlugin->getCompany();
501
 
502
        $request = $this->getRequest();
503
        if ($request->isPost()) {
504
 
505
 
506
            $id =  $this->params()->fromRoute('id');
507
 
508
            $feedMapper = FeedMapper::getInstance($this->adapter);
509
            $feed = $feedMapper->fetchOneByUuid($id);
510
            if (!$feed) {
511
                $response = [
512
                    'success' => false,
513
                    'data' => 'ERROR_POST_NOT_FOUND'
514
                ];
515
                return new JsonModel($response);
516
            }
517
 
518
            if ($feed->company_id != $currentCompany->id) {
519
                $response = [
520
                    'success' => false,
521
                    'data' => 'ERROR_UNAUTHORIZED'
522
                ];
523
                return new JsonModel($response);
524
            }
525
 
526
            $feedMapper = FeedMapper::getInstance($this->adapter);
527
            $feed->status = Feed::STATUS_DELETED;
528
            if ($feedMapper->update($feed)) {
529
 
530
                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
531
 
532
                Functions::deleteFilename($target_path, $feed->file_image_preview);
533
                Functions::deleteFilename($target_path, $feed->file_name);
534
 
535
                $response = [
536
                    'success' => true,
537
                    'data' => 'LABEL_FEED_WAS_DELETED'
538
                ];
13304 eleazar 539
            } else {
540
                $response = [
541
                    'success' => false,
14743 kerby 542
                    'data' => $feedMapper->getError()
13304 eleazar 543
                ];
544
            }
14743 kerby 545
 
546
 
13304 eleazar 547
            return new JsonModel($response);
14743 kerby 548
        } else {
549
            $response = [
550
                'success' => false,
551
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
552
            ];
13304 eleazar 553
        }
14743 kerby 554
 
555
        return new JsonModel($response);
13304 eleazar 556
    }
557
 
14743 kerby 558
    private function normalizeString($str = '')
559
    {
560
        $basename  = substr($str, 0, strrpos($str, '.'));
561
        $basename  = str_replace('.', '-', $basename);
562
 
563
        $extension  = substr($str, strrpos($str, '.'));
564
 
565
        $str = $basename . $extension;
566
 
567
        $str = strip_tags($str);
568
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
569
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
570
        $str = strtolower($str);
571
        $str = html_entity_decode($str, ENT_QUOTES, "utf-8");
572
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
573
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
574
        $str = str_replace(' ', '-', $str);
575
        $str = rawurlencode($str);
576
        $str = str_replace('%', '-', $str);
577
        return trim(strtolower($str));
578
    }
579
 
580
    public function aprovedAction()
581
    {
13304 eleazar 582
        $currentUserPlugin = $this->plugin('currentUserPlugin');
583
        $currentUser = $currentUserPlugin->getUser();
584
        $currentCompany = $currentUserPlugin->getCompany();
14743 kerby 585
 
13304 eleazar 586
        $request = $this->getRequest();
14743 kerby 587
        if ($request->isPost()) {
13304 eleazar 588
 
589
            $id =  $this->params()->fromRoute('id');
14743 kerby 590
 
13304 eleazar 591
            $feedMapper = FeedMapper::getInstance($this->adapter);
592
            $feed = $feedMapper->fetchOneByUuid($id);
14743 kerby 593
            if (!$feed) {
13304 eleazar 594
                $response = [
595
                    'success' => false,
596
                    'data' => 'ERROR_POST_NOT_FOUND'
597
                ];
598
                return new JsonModel($response);
599
            }
14743 kerby 600
 
601
            if ($feed->company_id != $currentCompany->id) {
13304 eleazar 602
                $response = [
603
                    'success' => false,
604
                    'data' => 'ERROR_UNAUTHORIZED'
605
                ];
606
                return new JsonModel($response);
607
            }
14743 kerby 608
 
13304 eleazar 609
            $feedMapper = FeedMapper::getInstance($this->adapter);
14743 kerby 610
            $feed->status = Feed::STATUS_PUBLISHED;
611
            if ($feedMapper->update($feed)) {
13304 eleazar 612
                $response = [
613
                    'success' => true,
14743 kerby 614
                    'data' => 'LABEL_FEED_WAS_ADDED'
13304 eleazar 615
                ];
616
            } else {
617
                $response = [
618
                    'success' => false,
619
                    'data' => $feedMapper->getError()
620
                ];
621
            }
622
 
14743 kerby 623
 
13304 eleazar 624
            return new JsonModel($response);
625
        } else {
626
            $response = [
627
                'success' => false,
628
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
629
            ];
630
        }
14743 kerby 631
 
13304 eleazar 632
        return new JsonModel($response);
633
    }
14743 kerby 634
 
635
    public function editAction()
636
    {
637
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
638
        $currentCompany     = $currentUserPlugin->getCompany();
639
        $currentUser        = $currentUserPlugin->getUser();
640
        $request    = $this->getRequest();
641
 
642
 
15028 efrain 643
        $uuid = $this->params()->fromRoute('id');
644
        if (!$uuid) {
645
            $data = [
646
                'success' => false,
647
                'data' => 'ERROR_INVALID_PARAMETER'
648
            ];
14743 kerby 649
 
15028 efrain 650
            return new JsonModel($data);
651
        }
14743 kerby 652
 
15028 efrain 653
        $feedMapper = FeedMapper::getInstance($this->adapter);
654
        $feed = $feedMapper->fetchOneByUuid($uuid);
14743 kerby 655
 
656
 
15028 efrain 657
        if (!$feed) {
658
            $data = [
659
                'success' => false,
660
                'data' => 'ERROR_RECORD_NOT_FOUND'
661
             ];
662
 
663
            return new JsonModel($data);
664
        }
665
 
666
        if ($currentCompany) {
667
            if ($feed->company_id != $currentCompany->id) {
14743 kerby 668
                $data = [
669
                    'success' => false,
15028 efrain 670
                    'data' => 'ERROR_UNAUTHORIZED'
14743 kerby 671
                ];
672
 
673
                return new JsonModel($data);
674
            }
15028 efrain 675
        } else {
676
            if ($feed->company_id) {
677
                $data = [
678
                    'success' => false,
679
                    'data' => 'ERROR_UNAUTHORIZED'
680
                ];
14743 kerby 681
 
15028 efrain 682
                return new JsonModel($data);
14743 kerby 683
            }
15028 efrain 684
        }
685
 
686
        if($request->isGet()) {
687
 
688
            $topicMapper = TopicMapper::getInstance($this->adapter);
689
            $topic = $topicMapper->fetchOne($feed->topic_id);
690
            $link_file = ($feed->file_name != null && $feed->file_name != '') ? $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]) : null;
691
            $preview = ($feed->file_image_preview != null && $feed->file_image_preview != '') ? $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_image_preview]) : null;
692
            return new JsonModel([
693
                'success' => true,
694
                'data' => [
695
                    'feed' => [
696
                        'uuid' => $feed->uuid,
697
                        'title' => $feed->title,
698
                        'added_on' => $feed->added_on,
699
                        'description' => $feed->description,
700
                        'file' => $feed->file_type ? $feed->file_type : '',
701
                        'link_media' => $feed->link_media ? $feed->link_media : '',
702
                        'link_name' => $feed->link_name,
703
                        'file_name' => $feed->file_name ? $feed->file_name : '',
704
                        'link_file' => $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]),
705
                        'status' => $feed->status,
706
                    ],
707
                    'topic' => $topic,
708
                    'titulo' => $feed->title,
709
                    'description' => $feed->description,
710
                    'action' => $this->url()->fromRoute('development-and-content/edit', ['id' => $feed->uuid]),
711
                    'link_file' => $link_file,
712
                    'preview' => $preview
713
                ]
714
            ]);
715
 
716
        } else  if ($request->isPost()) {
14743 kerby 717
 
718
 
14880 kerby 719
                $form = new DevelopmentContentCreateFeedForm($this->adapter);
14743 kerby 720
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
721
                // $categoriesId = $dataPost['category_id'] ?? [];
14829 kerby 722
                $categoryUuid = $dataPost['category_content'];
14743 kerby 723
                $dataPost['category_id'] = null;
724
                $form->setData($dataPost);
725
 
726
                if ($form->isValid()) {
727
                    $dataPost = (array) $form->getData();
14835 kerby 728
                    $filesArray = $this->getRequest()->getFiles()->toArray();
14743 kerby 729
                    $files = null;
730
 
14835 kerby 731
                    if (isset($filesArray['doc']) && empty($filesArray['doc']['error'])) {
732
                        $files = $filesArray['doc'];
14743 kerby 733
                    }
14835 kerby 734
                    if (isset($filesArray['video']) && empty($filesArray['video']['error'])) {
735
                        $files = $filesArray['video'];
14743 kerby 736
                    }
737
 
738
                    $file_type = '';
739
                    if (isset($files) && empty($files['error'])) {
740
                        $feed_tmp_filename  = $files['tmp_name'];
741
                        $feed_filename      = $this->normalizeString($files['name']);
742
 
743
                        $mime_type = mime_content_type($feed_tmp_filename);
744
                        if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
745
                            $file_type = Feed::FILE_TYPE_IMAGE;
746
                        } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
747
                            $file_type = Feed::FILE_TYPE_VIDEO;
748
                        } else if ($mime_type == 'application/pdf') {
749
                            $file_type = Feed::FILE_TYPE_DOCUMENT;
750
                        }
751
                    }
752
                    //preview
14834 kerby 753
                    $fileImg = $this->params()->fromFiles('image');
14743 kerby 754
                    if (isset($fileImg) && empty($fileImg['error'])) {
755
 
756
                        $img_tmp_filename  = $fileImg['tmp_name'];
757
                        $img_filename  = $this->normalizeString($fileImg['name']);
758
                    } else {
759
                        $img_tmp_filename = null;
760
                        $img_filename = null;
761
                    }
762
 
763
                    $feedMapper = FeedMapper::getInstance($this->adapter);
764
                    $feed = $feedMapper->fetchOne($feed->id);
765
 
14946 kerby 766
                    $hydrator = new ObjectPropertyHydrator();
767
                    $hydrator->hydrate($dataPost, $feed);
768
 
14743 kerby 769
                    $categoriesMapper = TopicMapper::getInstance($this->adapter);
770
                    $category = $categoriesMapper->fetchOneByUuidOrTitle($categoryUuid);
771
 
772
                    $feed->topic_id = $category->id;
773
                    $feed->status = Feed::STATUS_SAVED;
14946 kerby 774
 
14743 kerby 775
                    if ($feedMapper->update($feed)) {
776
 
777
                        if ($file_type == Feed::FILE_TYPE_DOCUMENT) {
778
                            try {
779
 
780
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
781
 
782
 
783
                                if (!file_exists($target_path)) {
784
                                    mkdir($target_path, 0755);
785
                                }
786
 
787
                                Functions::deleteFilename($target_path, $feed->file_name);
788
 
789
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
790
                                $result = move_uploaded_file($feed_tmp_filename, $full_filename);
791
                                if ($result) {
792
 
793
                                    $feed->file_type = $file_type;
794
                                    $feed->file_name = basename($feed_filename);
795
                                    $feedMapper->update($feed);
796
                                } else {
797
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);
798
                                }
799
                            } catch (\Throwable $e) {
800
                                error_log($e->getTraceAsString());
801
                            }
802
                        }
803
                        if ($file_type == Feed::FILE_TYPE_IMAGE) {
804
                            try {
805
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
806
                                if (!file_exists($target_path)) {
807
                                    mkdir($target_path, 0755);
808
                                }
809
 
810
                                Functions::deleteFilename($target_path, $feed->file_name);
811
 
812
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
813
 
814
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
815
                                $crop_to_dimensions = false;
816
                                if (Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions)) {
817
                                    $feed->file_type = $file_type;
818
                                    $feed->file_name = basename($feed_filename);
819
                                    $feedMapper->update($feed);
820
                                }
821
                            } catch (\Throwable $e) {
822
                                error_log($e->getTraceAsString());
823
                            }
824
                        }
825
                        if ($file_type == Feed::FILE_TYPE_VIDEO) {
826
                            try {
827
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
828
                                if (!file_exists($target_path)) {
829
                                    mkdir($target_path, 0755);
830
                                }
831
 
832
 
833
                                Functions::deleteFilename($target_path, $feed->file_name);
834
 
835
                                Functions::deleteFilename($target_path, $feed->file_image_preview);
836
 
837
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
838
 
839
                                $result = move_uploaded_file($feed_tmp_filename, $full_filename);
840
                                if ($result) {
841
 
842
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
843
                                    $getFromSecound = 2;
844
 
845
                                    //extracción del cover
846
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
847
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
848
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
849
                                    exec($cmd);
850
 
851
 
852
                                    $feed->file_type = $file_type;
853
                                    $feed->file_name = basename($feed_filename);
854
                                    $feed->file_image_preview = basename($generateFile);
855
                                    $feedMapper->update($feed);
856
 
857
                                    $videoConvert = new VideoConvert();
858
                                    $videoConvert->filename = $full_filename;
859
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
860
 
861
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
862
                                    $videoConvertMapper->insert($videoConvert);
863
                                } else {
864
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename);
865
                                }
866
                            } catch (\Throwable $e) {
867
                                error_log($e->getTraceAsString());
868
                            }
869
                        }
870
                        if ($file_type != Feed::FILE_TYPE_VIDEO && !empty($img_tmp_filename) && !empty($img_filename)) {
871
 
872
                            try {
873
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
874
                                if (!file_exists($target_path)) {
875
                                    mkdir($target_path, 0755);
876
                                }
877
 
878
                                Functions::deleteFilename($target_path, $feed->file_image_preview);
879
 
880
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
881
 
882
                                $img_filename = substr($img_filename, 0, strrpos($img_filename, '.'))  . '.png';
883
 
884
 
885
                                if (Functions::uploadImage($img_tmp_filename, $target_path, $img_filename, $target_width, $target_height)) {
886
                                    $feed->file_image_preview = basename($img_filename);
887
                                    $feedMapper->update($feed);
888
                                }
889
                            } catch (\Throwable $e) {
890
                                error_log($e->getTraceAsString());
891
                            }
892
                        }
893
 
894
                        $response = [
895
                            'success'   => true,
896
                            'data'   => 'success'
897
                        ];
898
                    } else {
899
                        $messages = [];
900
                        $form_messages = (array) $form->getMessages();
901
                        foreach ($form_messages  as $fieldname => $field_messages) {
902
                            $messages[$fieldname] = array_values($field_messages);
903
                        }
904
                        $response = [
905
                            'success' => false,
906
                            'data' => $messages
907
                        ];
908
                    }
909
                } else {
910
                    $response = [
911
                        'success' => false,
912
                        'data' => 'ERROR_METHOD_NOT_ALLOWED'
913
                    ];
914
                }
915
 
916
                return new JsonModel($response);
917
            }
15028 efrain 918
 
919
            /*
14743 kerby 920
        } catch (\Throwable $e) {
15028 efrain 921
 
14743 kerby 922
            return new JsonModel([
923
                'success' => false,
924
                'data' => $e
925
            ]);
15028 efrain 926
        }*/
14743 kerby 927
    }
928
 
929
 
930
}