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