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