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