Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 4778 | Rev 5500 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
/**
3
 *
4
 * Controlador: Mis Perfiles
5
 *
6
 */
7
declare(strict_types=1);
8
 
9
namespace LeadersLinked\Controller;
10
 
11
use Laminas\Db\Adapter\AdapterInterface;
12
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
13
use Laminas\Mvc\Controller\AbstractActionController;
14
use Laminas\Log\LoggerInterface;
15
use Laminas\View\Model\JsonModel;
16
 
17
use LeadersLinked\Library\Functions;
18
use LeadersLinked\Mapper\CompanyUserMapper;
19
use LeadersLinked\Form\Feed\CreateForm;
20
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
21
use LeadersLinked\Model\Feed;
22
use LeadersLinked\Mapper\FeedMapper;
23
use LeadersLinked\Library\Image;
24
use LeadersLinked\Mapper\GroupMapper;
25
use LeadersLinked\Mapper\UserMapper;
26
use LeadersLinked\Mapper\CommentMapper;
27
use LeadersLinked\Mapper\ConnectionMapper;
28
use LeadersLinked\Mapper\CompanyFollowerMapper;
29
use LeadersLinked\Mapper\QueryMapper;
30
use Laminas\Paginator\Paginator;
31
use Laminas\Paginator\Adapter\DbSelect;
32
use LeadersLinked\Mapper\LikeMapper;
33
use LeadersLinked\Model\Like;
34
use LeadersLinked\Form\Feed\CommentForm;
35
use LeadersLinked\Model\Comment;
36
use LeadersLinked\Form\Feed\CreateGroupCompanyForm;
37
use LeadersLinked\Model\CompanyUser;
38
use LeadersLinked\Model\VideoConvert;
39
use LeadersLinked\Mapper\VideoConvertMapper;
40
use LeadersLinked\Mapper\CompanyMapper;
41
use LeadersLinked\Model\Company;
42
use LeadersLinked\Model\Group;
43
use LeadersLinked\Mapper\GroupMemberMapper;
44
use LeadersLinked\Model\GroupMember;
45
use LeadersLinked\Model\Notification;
46
use LeadersLinked\Mapper\NotificationMapper;
47
use LeadersLinked\Mapper\UserNotificationSettingMapper;
48
use LeadersLinked\Mapper\EmailTemplateMapper;
49
use LeadersLinked\Model\EmailTemplate;
50
use LeadersLinked\Library\QueueEmail;
3138 efrain 51
use LeadersLinked\Mapper\UtilMapper;
1 www 52
 
53
 
54
class FeedController extends AbstractActionController
55
{
56
    /**
57
     *
58
     * @var AdapterInterface
59
     */
60
    private $adapter;
61
 
62
 
63
    /**
64
     *
65
     * @var AbstractAdapter
66
     */
67
    private $cache;
68
 
69
    /**
70
     *
71
     * @var  LoggerInterface
72
     */
73
    private $logger;
74
 
75
 
76
    /**
77
     *
78
     * @var array
79
     */
80
    private $config;
81
 
82
    /**
83
     *
84
     * @param AdapterInterface $adapter
85
     * @param AbstractAdapter $cache
86
     * @param LoggerInterface $logger
87
     * @param array $config
88
     */
89
    public function __construct($adapter, $cache , $logger,  $config)
90
    {
91
        $this->adapter      = $adapter;
92
        $this->cache        = $cache;
93
        $this->logger       = $logger;
94
        $this->config       = $config;
95
 
96
    }
97
 
98
    /**
99
     *
100
     * Generación del listado de perfiles
101
     * {@inheritDoc}
102
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
103
     */
104
    public function indexAction()
105
    {
106
 
107
        return new JsonModel([
108
            'success' => false,
109
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
110
        ]);
111
    }
112
 
113
    public function commentAction()
114
    {
115
        $id = $this->params()->fromRoute('id');
116
 
117
        $request = $this->getRequest();
118
        if($request->isPost()) {
3639 efrain 119
 
120
 
121
 
1 www 122
            $feedMapper = FeedMapper::getInstance($this->adapter);
123
            $feed = $feedMapper->fetchOneByUuid($id);
124
            if(!$feed) {
125
                $response = [
126
                    'success' => false,
127
                    'data' => 'ERROR_POST_NOT_FOUND'
128
                ];
129
                return new JsonModel($response);
130
            }
131
 
132
            $dataPost = $request->getPost()->toArray();
133
            $form = new CommentForm();
134
            $form->setData($dataPost);
135
 
136
            if($form->isValid()) {
3138 efrain 137
                $utilMapper = UtilMapper::getInstance($this->adapter);
138
                $now = $utilMapper->getDatebaseNow();
139
 
1 www 140
                $currentUserPlugin = $this->plugin('currentUserPlugin');
141
                $currentUser = $currentUserPlugin->getUser();
142
 
143
                $dataPost = (array) $form->getData();
144
 
3639 efrain 145
 
146
 
1 www 147
                $comment = new Comment();
3639 efrain 148
                $comment->network_id = $currentUser->network_id;
1 www 149
                $comment->comment = $dataPost['comment'];
150
                $comment->user_id = $currentUser->id;
151
                $comment->feed_id = $feed->id;
4808 efrain 152
                $comment->relational = Comment::RELATIONAL_FEED;
1 www 153
 
154
                $commentMapper = CommentMapper::getInstance($this->adapter);
155
                if($commentMapper->insert($comment)) {
156
 
157
 
158
                    if($feed->type == Feed::TYPE_UPDATE) {
159
                        $userMapper = UserMapper::getInstance($this->adapter);
160
                        $ownerFeed = $userMapper->fetchOne($feed->user_id);
161
 
162
                        $notification = new Notification();
163
                        $notification->type = Notification::TYPE_COMMENT_MY_FEED;
164
                        $notification->feed_id = $feed->id;
165
                        $notification->read     = Notification::NO;
166
                        $notification->user_id  = $ownerFeed->id;
167
                        $notification->message  = 'LABEL_COMMENT_MY_FEED';
168
                        $notification->url      = $this->url()->fromRoute('dashboard',['feed' => $feed->uuid]);
169
 
170
                        $notificationMapper = NotificationMapper::getInstance($this->adapter);
171
                        $notificationMapper->insert($notification);
172
 
173
                        $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
174
                        $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
175
 
176
                        if($userNotification && $userNotification->comment_my_feed)
177
                        {
178
                            $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
3712 efrain 179
                            $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_COMMENT_MY_FEED,  $currentUser->network_id);
1 www 180
 
181
                            if($emailTemplate) {
182
                                $arrayCont = [
183
                                    'firstname'             => $currentUser->first_name,
184
                                    'lastname'              => $currentUser->last_name,
185
                                    'other_user_firstname'  => $ownerFeed->first_name,
186
                                    'other_user_lastname'   => $ownerFeed->last_name,
187
                                    'company_name'          => '',
188
                                    'group_name'            => '',
189
                                    'content'               => '',
190
                                    'code'                  => '',
191
                                    'link'                  => $this->url()->fromRoute('dashboard',['feed' => $feed->uuid], ['force_canonical' => true])
192
                                ];
193
 
194
                                $email = new QueueEmail($this->adapter);
195
                                $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
196
                            }
197
                        }
198
                    }
199
 
200
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
201
 
202
                    $feed->total_comments = $total_comments;
203
                    $feedMapper->update($feed);
204
 
205
                    $response = [
206
                        'success'   => true,
3138 efrain 207
                        'data'   => $this->renderComment($comment->id, $now),
1 www 208
                        'total_comments' => $total_comments
209
                    ];
210
 
211
                    return new JsonModel($response);
212
 
213
                } else {
214
 
215
                    $response = [
216
                        'success'   => false,
217
                        'data'   => $commentMapper->getError()
218
                    ];
219
 
220
                    return new JsonModel($response);
221
                }
222
 
223
            } else {
224
                $message = '';;
225
                $form_messages = (array) $form->getMessages();
226
                foreach($form_messages  as $fieldname => $field_messages)
227
                {
228
                    foreach( $field_messages as $key => $value)
229
                    {
230
                        $message = $value;
231
                    }
232
                }
233
 
234
                $response = [
235
                    'success'   => false,
236
                    'data'   => $message
237
                ];
238
 
239
                return new JsonModel($response);
240
            }
241
 
242
 
243
        } else {
244
            $response = [
245
                'success' => false,
246
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
247
            ];
248
 
249
            return new JsonModel($response);
250
        }
251
 
252
 
253
    }
254
 
255
    public function shareAction()
256
    {
257
        $id = $this->params()->fromRoute('id');
258
 
259
        $request = $this->getRequest();
260
        if($request->isPost()) {
3639 efrain 261
 
262
            $currentUserPlugin = $this->plugin('currentUserPlugin');
263
            $currentUser = $currentUserPlugin->getUser();
264
 
265
 
1 www 266
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 267
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1 www 268
            if(!$feed) {
269
                $response = [
270
                    'success' => false,
271
                    'data' => 'ERROR_POST_NOT_FOUND'
272
                ];
273
                return new JsonModel($response);
274
            }
275
 
276
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
277
            $dataPost['company_id'] = $this->params()->fromRoute('company_id');
278
            $dataPost['group_id'] = $this->params()->fromRoute('group_id');
279
            $dataPost['shared_feed_id'] = $feed->id;
280
 
281
 
282
 
283
 
284
            $response = $this->postOrShareFeed($dataPost);
285
            if( $response ['success']) {
286
                $feedMapper->incTotalShared($feed->id);
287
                $total_shared = $feedMapper->fetchTotalShared($feed->id);
288
 
289
                $response['total_shared'] = $total_shared;
290
            }
291
 
292
 
293
            return new JsonModel($response);
294
 
295
        } else {
296
            $response = [
297
                'success' => false,
298
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
299
            ];
300
        }
301
 
302
        return new JsonModel($response);
303
    }
304
 
305
    public function commentDeleteAction()
306
    {
307
        $request = $this->getRequest();
308
        if($request->isPost()) {
309
            $currentUserPlugin = $this->plugin('currentUserPlugin');
310
            $currentUser = $currentUserPlugin->getUser();
311
 
312
            $feed_id = $this->params()->fromRoute('id');
313
            $comment = $this->params()->fromRoute('comment');
314
 
315
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 316
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);
1 www 317
 
318
            if($feed) {
319
 
320
                $commentMapper = CommentMapper::getInstance($this->adapter);
321
                $comment = $commentMapper->fetchOneByUuid($comment);
322
 
323
                if($comment && $comment->feed_id == $feed->id && $comment->user_id == $currentUser->id) {
324
 
325
                    $comment->status = Comment::STATUS_DELETED;
326
 
327
                    if($commentMapper->update($comment)) {
328
 
329
                        $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
330
 
331
 
332
                        $feedMapper = FeedMapper::getInstance($this->adapter);
333
                        $feed = $feedMapper->fetchOne($comment->feed_id);
334
                        $feed->total_comments = $total_comments;
335
                        $feedMapper->update($feed);
336
 
337
 
338
 
339
 
340
 
341
                        $response = [
342
                            'success' => true,
343
                            'data' => 'LABEL_COMMENT_WAS_DELETED',
344
                            'total_comments' => $total_comments
345
                        ];
346
 
347
                    } else {
348
                        $response = [
349
                            'success' => false,
350
                            'data' => $commentMapper->getError()
351
                        ];
352
                    }
353
 
354
                } else {
355
                    $response = [
356
                        'success' => false,
357
                        'data' => 'ERROR_COMMENT_NOT_FOUND'
358
                    ];
359
                }
360
            } else {
361
                $response = [
362
                    'success' => false,
363
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
364
                ];
365
            }
366
        } else {
367
            $response = [
368
                'success' => false,
369
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
370
            ];
371
        }
372
 
373
        return new JsonModel($response);
374
    }
375
 
376
    public function deleteAction()
377
    {
378
        $request = $this->getRequest();
379
        if($request->isPost()) {
380
            $currentUserPlugin = $this->plugin('currentUserPlugin');
381
            $currentUser = $currentUserPlugin->getUser();
382
 
383
            $feed_id =  $this->params()->fromRoute('id');
384
 
385
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 386
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);
1 www 387
 
388
            if($feed) {
389
 
390
                if($feed->user_id && $feed->user_id == $currentUser->id) {
391
 
392
                    return new JsonModel($this->deleteFeed($feed));
393
                } else if ($feed->group_id) {
394
 
395
                    $groupMapper = GroupMapper::getInstance($this->adapter);
396
                    $group = $groupMapper->fetchOne($feed->group_id);
397
                    if($group && $group->user_id == $currentUser->id) {
398
                        return new JsonModel($this->deleteFeed($feed));
399
                    }
400
 
401
                } else if ($feed->company_id) {
402
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
403
                    $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($feed->company_id, $currentUser->id);
404
                    if($companyUser) {
405
                        if(in_array($companyUser->type, [CompanyUser::TYPE_OWNER, CompanyUser::TYPE_ADMINISTRATOR, CompanyUser::TYPE_MANAGER])) {
406
                            return new JsonModel($this->deleteFeed($feed));
407
                        }
408
                    }
409
                }
410
 
411
                $response = [
412
                    'success' => false,
413
                    'data' => ' ERROR_UNAUTHORIZED'
414
                ];
415
 
416
 
417
            } else {
418
                $response = [
419
                    'success' => false,
420
                    'data' => 'ERROR_FEED_NOT_FOUND'
421
                ];
422
            }
423
 
424
            return new JsonModel($response);
425
 
426
        } else {
427
            $response = [
428
                'success' => false,
429
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
430
            ];
431
        }
432
 
433
        return new JsonModel($response);
434
    }
435
 
436
    public function addAction()
437
    {
438
        $request = $this->getRequest();
439
        if($request->isPost()) {
440
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
441
            $dataPost['company_id'] = $this->params()->fromRoute('company_id');
442
            $dataPost['group_id'] = $this->params()->fromRoute('group_id');
443
            $response = $this->postOrShareFeed($dataPost);
444
 
445
 
446
            return new JsonModel($response);
447
 
448
        } else {
449
            $response = [
450
                'success' => false,
451
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
452
            ];
453
        }
454
 
455
        return new JsonModel($response);
456
    }
457
 
458
    public function postOrShareFeed($dataPost)
459
    {
3138 efrain 460
        $utilMapper = UtilMapper::getInstance($this->adapter);
461
        $now = $utilMapper->getDatebaseNow();
462
 
1 www 463
        $currentUserPlugin = $this->plugin('currentUserPlugin');
464
        $currentUser = $currentUserPlugin->getUser();
465
 
466
        $companyId  = empty($dataPost['company_id']) ? '' : $dataPost['company_id'];
467
        $groupId    = empty($dataPost['group_id']) ? '' : $dataPost['group_id'];
468
 
469
 
470
        if($groupId || $companyId) {
471
            $form = new  CreateGroupCompanyForm($this->adapter);
472
        } else {
473
            $form = new  CreateForm($this->adapter);
474
        }
475
        $form->setData($dataPost);
476
        if($form->isValid()) {
477
 
412 geraldo 478
 
479
 
1 www 480
 
481
            $hydrator = new ObjectPropertyHydrator();
482
            $feed = new Feed();
483
            $hydrator->hydrate($dataPost, $feed);
484
 
485
            $company = null;
486
            $group = null;
487
 
488
            if($companyId) {
489
                $companyMapper = CompanyMapper::getInstance($this->adapter);
3639 efrain 490
                $company = $companyMapper->fetchOneByUuidAndNetworkId($companyId, $currentUser->network_id);
1 www 491
 
492
 
493
                if(!$company) {
494
                    return [
495
                        'success'   => false,
496
                        'data'   => 'ERROR_COMPANY_NOT_FOUND'
497
                    ];
498
                }
499
 
500
                if($company->status != Company::STATUS_ACTIVE) {
501
                    return [
502
                        'success'   => false,
503
                        'data'   => 'ERROR_COMPANY_IS_NOT_ACTIVE'
504
                    ];
505
                }
506
 
507
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
508
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
509
 
510
                //print_r($companyUser); exit;
511
 
512
 
513
                if(!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {
514
                    return [
515
                        'success'   => false,
516
                        'data'   => 'ERROR_UNAUTHORIZED'
517
                    ];
518
                }
519
 
520
            }
521
 
522
            if($groupId) {
523
                $groupMapper = GroupMapper::getInstance($this->adapter);
3639 efrain 524
                $group = $groupMapper->fetchOneByUuidAndNetworkId($groupId, $currentUser->network_id);
1 www 525
 
526
                if(!$group) {
527
                    return [
528
                        'success'   => false,
529
                        'data'   => 'ERROR_GROUP_NOT_FOUND'
530
                    ];
531
                }
532
 
533
                if($group->status != Group::STATUS_ACTIVE) {
534
                    return [
535
                        'success'   => false,
536
                        'data'   => 'ERROR_GROUP_IS_NOT_ACTIVE'
537
                    ];
538
                }
539
 
540
                $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
541
                $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
542
                if(!$groupMember || !in_array($groupMember->status, [GroupMember::STATUS_ACCEPTED, GroupMember::STATUS_AUTO_JOIN])) {
543
                    return [
544
                        'success'   => false,
545
                        'data'   => 'ERROR_UNAUTHORIZED'
546
                    ];
547
                }
548
            }
549
 
3639 efrain 550
            $feed->network_id   = $currentUser->network_id;
1 www 551
            $feed->company_id   = $company ? $company->id : null;
552
            $feed->group_id     = $group ? $group->id : null;
553
            $feed->user_id      = $currentUser->id;
424 geraldo 554
 
413 geraldo 555
            if($companyId) {
556
                $feed->type = Feed::TYPE_COMPANY;
557
            } else if ($groupId) {
558
                $feed->type = Feed::TYPE_GROUP;
559
            } else {
560
                $feed->type = Feed::TYPE_UPDATE;
561
            }
562
 
563
            $posted_or_shared   = $dataPost['posted_or_shared'];
564
            if($posted_or_shared != Feed::POSTED && $posted_or_shared != Feed::SHARED) {
565
                return [
566
                    'success'   => false,
567
                    'data'      => 'ERROR_SUPPLY_VALID_SHARING_STATUS'
568
                ];
569
            }
570
            $feed->posted_or_shared = $posted_or_shared;
571
            $feedMapper = FeedMapper::getInstance($this->adapter);
424 geraldo 572
 
414 geraldo 573
            $shared_with = isset($dataPost['shared_with']) ? $dataPost['shared_with'] : Feed::SHARE_WITH_PUBLIC;
574
            if ($shared_with != Feed::SHARE_WITH_PUBLIC && $shared_with != Feed::SHARE_WITH_CONNECTIONS) {
575
                return [
576
                    'status' => false,
577
                    'error' => 'ERROR_SUPPLY_VALID_SHARING_WITH_TYPE',
578
                ];
579
            }
580
 
581
            $feed->shared_with = $shared_with;
582
            if(Feed::SHARED == $feed->posted_or_shared) {
583
                $shared_feed_id     = empty($dataPost['shared_feed_id']) ? 0 : $dataPost['shared_feed_id'];
584
 
585
 
3639 efrain 586
                $sharedFeed = $feedMapper->fetchOneByIdAndNetworkId($shared_feed_id, $currentUser->network_id);
414 geraldo 587
                if(!$sharedFeed) {
588
                    return [
589
                        'status' => false,
590
                        'error' => 'ERROR_POST_SHARE',
591
                    ];
592
 
593
                }
594
 
595
                $feed->shared_feed_id       = $sharedFeed->id;
596
                $feed->shared_company_id    = $sharedFeed->shared_company_id;
597
                $feed->shared_group_id      = $sharedFeed->shared_group_id;
598
                $feed->shared_job_id        = $sharedFeed->shared_job_id;
599
            } else {
600
                $sharedFeed = null;
601
            }
602
 
603
            $feed->status = Feed::STATUS_PUBLISHED;
604
            $feed->total_comments    = 0;
605
            $feed->total_shared     = 0;
606
 
1 www 607
 
414 geraldo 608
            $files = $this->getRequest()->getFiles()->toArray();
609
            $file_type = '';
424 geraldo 610
 
415 geraldo 611
            $encoding = $this->params()->fromRoute('encoding');
612
            if($encoding == 'base64') {
613
 
614
 
615
                $fileBase64Name = $this->params()->fromPost('file_base64_name');
616
                $fileBase64Content = $this->params()->fromPost('file_base64_content');
617
 
618
                if($fileBase64Name && $fileBase64Content) {
619
 
620
                    try {
621
                        $fileBase64Content = base64_decode($fileBase64Content);
622
                        if($fileBase64Content) {
623
                            $feed_filename      = $this->normalizeString($fileBase64Name);
624
                            $feed_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp';
625
                            if(!file_exists($feed_tmp_filename)) {
626
                                mkdir($feed_tmp_filename, 0755, true);
627
                            }
628
 
629
 
630
 
631
                            $feed_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $feed_filename;
632
                            file_put_contents($feed_tmp_filename, $fileBase64Content);
633
 
634
 
635
 
636
                            $mime_type = mime_content_type($feed_tmp_filename);
637
                            //echo '$mime_type = '. $mime_type; exit;
638
 
639
 
640
                            if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
641
                                $file_type = Feed::FILE_TYPE_IMAGE;
642
                            } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
643
                                $file_type = Feed::FILE_TYPE_VIDEO;
644
                            } else if($mime_type == 'application/pdf') {
645
                                $file_type = Feed::FILE_TYPE_DOCUMENT;
646
                            }
647
 
648
                        }
649
                    } catch(\Exception $e) {
650
 
651
                    }
652
                }
653
 
654
            } else {
655
 
656
                if(isset($files['file']) && empty($files['file']['error'])) {
657
                    $feed_tmp_filename  = $files['file']['tmp_name'];
658
                    $feed_filename      = $this->normalizeString($files['file']['name']);
659
 
660
                    $mime_type = mime_content_type($feed_tmp_filename);
661
 
662
 
663
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
664
                        $file_type = Feed::FILE_TYPE_IMAGE;
665
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
666
                        $file_type = Feed::FILE_TYPE_VIDEO;
667
                    } else if($mime_type == 'application/pdf') {
668
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
669
                    }
670
                }
671
            }
424 geraldo 672
 
673
 
416 geraldo 674
            $result = $feedMapper->insert($feed);
675
            if($result) {
424 geraldo 676
 
677
                if($sharedFeed && $sharedFeed->type == Feed::TYPE_UPDATE) {
678
 
679
 
680
                    $userMapper = UserMapper::getInstance($this->adapter);
681
                    $ownerFeed = $userMapper->fetchOne($sharedFeed->user_id);
682
 
683
                    $notification = new Notification();
684
                    $notification->type     = Notification::TYPE_SHARE_MY_FEED;
685
                    $notification->read     = Notification::NO;
686
                    $notification->user_id  = $ownerFeed->id;
687
                    $notification->feed_id = $feed->id;
688
                    $notification->message  = 'LABEL_SHARE_MY_FEED';
689
                    $notification->url      = $this->url()->fromRoute('dashboard',['feed' => $sharedFeed->uuid]);
690
 
691
                    $notificationMapper = NotificationMapper::getInstance($this->adapter);
692
                    $notificationMapper->insert($notification);
693
 
694
                    $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
695
                    $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
696
 
697
                    if($userNotification && $userNotification->share_my_feed)
698
                    {
699
                        $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
3639 efrain 700
                        $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_SHARE_MY_FEED, $currentUser->network_id);
424 geraldo 701
 
702
                        if($emailTemplate) {
703
                            $arrayCont = [
704
                                'firstname'             => $currentUser->first_name,
705
                                'lastname'              => $currentUser->last_name,
706
                                'other_user_firstname'  => $ownerFeed->first_name,
707
                                'other_user_lastname'   => $ownerFeed->last_name,
708
                                'company_name'          => '',
709
                                'group_name'            => '',
710
                                'content'               => '',
711
                                'code'                  => '',
712
                                'link'                  => $this->url()->fromRoute('dashboard',['feed' => $feed->uuid], ['force_canonical' => true])
713
                            ];
714
 
715
                            $email = new QueueEmail($this->adapter);
716
                            $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
717
                        }
718
                    }
719
                }
720
 
721
 
722
                $feed = $feedMapper->fetchOne($feed->id);
430 geraldo 723
 
424 geraldo 724
                if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
725
                    try {
726
                        $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
727
                        if(!file_exists($target_path)) {
728
                            mkdir($target_path, 0755);
729
                        }
730
 
731
                        $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
732
 
733
                        if($encoding == 'base64') {
734
                            $resultMoveOrRename = rename($feed_tmp_filename , $full_filename);
735
                        } else {
736
                            $resultMoveOrRename = move_uploaded_file($feed_tmp_filename , $full_filename);
737
                        }
738
 
739
                        if($resultMoveOrRename) {
740
 
741
                            $feed->file_type = $file_type;
742
                            $feed->file_name = basename($feed_filename);
743
                            $feedMapper->update($feed);
744
                        } else {
745
                            error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
746
                        }
747
                    } catch(\Throwable $e) {
748
                        error_log($e->getTraceAsString());
749
                    }
750
                }
751
                if( $file_type == Feed::FILE_TYPE_IMAGE) {
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
                        list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
759
 
760
                        $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
3293 efrain 761
                        //$crop_to_dimensions = false;
762
                        //if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
763
                        if(Image::uploadImageWithoutCompletationSize($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height)) {
764
 
424 geraldo 765
                            $feed->file_type = $file_type;
766
                            $feed->file_name = basename($feed_filename);
767
                            $feedMapper->update($feed);
768
                        }
769
                    } catch(\Throwable $e) {
770
                        error_log($e->getTraceAsString());
771
                    }
772
                }
773
                if( $file_type == Feed::FILE_TYPE_VIDEO) {
774
                    try {
775
                        $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
776
                        if(!file_exists($target_path)) {
777
                            mkdir($target_path, 0755);
778
                        }
779
 
780
                        $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
781
 
782
                        if($encoding == 'base64') {
783
                            $resultMoveOrRename = rename($feed_tmp_filename , $full_filename);
784
                        } else {
785
                            $resultMoveOrRename = move_uploaded_file($feed_tmp_filename , $full_filename);
786
                        }
787
 
788
                        if($resultMoveOrRename) {
789
 
3477 efrain 790
 
424 geraldo 791
                           // $getFromSecound = 2;
792
 
793
                            //extracción del cover
794
                            $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
3477 efrain 795
                            $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.jpg';
796
 
797
                            $cmd        = "/usr/bin/ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width,duration  $full_filename";
3639 efrain 798
                            //error_log($cmd);
424 geraldo 799
 
3477 efrain 800
                            $response   = trim(shell_exec($cmd));
424 geraldo 801
 
3477 efrain 802
                            $source_duration = 0;
803
 
804
 
805
                            $lines = explode("\n", $response);
806
                            foreach($lines as $line)
807
                            {
808
                                $line = trim(strtolower($line));
809
                                if(strpos($line, 'duration') !== false) {
810
                                    $values = explode('=', $line);
811
                                    $source_duration = intval(str_replace($values[1], '#', ''), 10);
812
                                }
813
                            }
814
 
815
 
816
                            if($source_duration == 0) {
817
                                $second_extract = '00:00:02';
818
                            } else {
819
                                if($source_duration > 10) {
820
                                    $second_extract = '00:00:10';
821
                                } else {
822
                                    $second_extract = '00:00:02';
823
                                }
824
 
825
                            }
826
 
827
                            $imageSize = $this->config['leaderslinked.image_sizes.feed_image_size'];
828
 
829
                            //$cmd = "/usr/bin/ffmpeg -y -i $full_filename  -pix_fmt yuvj422p -deinterlace -an -ss $second_extract -f mjpeg -t 1 -r 1 -y -s $imageSize $generateFile";
830
                            $cmd = "/usr/bin/ffmpeg -y -i $full_filename  -pix_fmt yuvj422p -an -ss $second_extract -f mjpeg -t 1 -r 1 -y -s $imageSize $generateFile";
3639 efrain 831
                            //error_log($cmd);
3477 efrain 832
 
833
 
424 geraldo 834
                            exec($cmd);
835
 
836
 
837
                            $feed->file_type = $file_type;
838
                            $feed->file_name = basename($feed_filename);
839
                            $feed->file_image_preview = basename($generateFile);
840
                            $feedMapper->update($feed);
841
 
842
                            $videoConvert = new VideoConvert();
843
                            $videoConvert->filename = $full_filename;
844
                            $videoConvert->type = VideoConvert::TYPE_FEED;
845
 
846
                            $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
847
                            $videoConvertMapper->insert($videoConvert);
848
                        } else {
849
                            error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
850
                        }
851
                    } catch(\Throwable $e) {
852
                        error_log($e->getTraceAsString());
853
                    }
854
                }
855
 
856
 
857
                return [
858
                    'success'   => true,
3138 efrain 859
                    'data'   => $this->renderFeed($feed->id, $now)
424 geraldo 860
                ];
861
           } else {
862
                return [
863
                    'success'   => false,
864
                    'data'   => $feedMapper->getError()
865
                ];
866
           }
867
        } else {
868
            $messages = [];
869
            $form_messages = (array) $form->getMessages();
870
            foreach($form_messages  as $fieldname => $field_messages)
871
            {
872
                $messages[$fieldname] = array_values($field_messages);
873
            }
874
 
1 www 875
            return [
876
                'success'   => false,
424 geraldo 877
               'data'   => $messages
1 www 878
            ];
879
        }
880
    }
881
 
882
    public function likeAction()
883
    {
884
        $id = $this->params()->fromRoute('id');
885
 
886
        $request = $this->getRequest();
887
        if($request->isPost()) {
888
            $currentUserPlugin = $this->plugin('currentUserPlugin');
889
            $currentUser = $currentUserPlugin->getUser();
3639 efrain 890
 
1 www 891
 
892
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 893
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1 www 894
            if(!$feed) {
895
                $response = [
896
                    'success' => false,
897
                    'data' => 'ERROR_POST_NOT_FOUND'
898
                ];
899
                return new JsonModel($response);
900
            }
901
 
902
            $likeMapper = LikeMapper::getInstance($this->adapter);
903
            $like = $likeMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
904
 
905
            if($like) {
906
                $response = [
907
                    'success' => false,
908
                    'data' => 'ERROR_DUPLICATE_ACTION'
909
                ];
910
                return new JsonModel($response);
911
            }
912
 
913
            $like = new Like();
914
            $like->user_id = $currentUser->id;
915
            $like->feed_id = $feed->id;
4808 efrain 916
            $like->relational = Like::RELATIONAL_FEED;
1 www 917
 
918
            if($likeMapper->insert($like))
919
            {
1042 efrain 920
 
921
                $likes = $likeMapper->fetchCountLikeByFeedId($feed->id);
922
 
923
 
924
 
1 www 925
                if($feed->type == Feed::TYPE_UPDATE) {
926
 
927
 
928
                    $userMapper = UserMapper::getInstance($this->adapter);
929
                    $ownerFeed = $userMapper->fetchOne($feed->user_id);
930
 
931
                    $notification = new Notification();
932
                    $notification->type     = Notification::TYPE_LIKE_MY_FEED;
933
                    $notification->read     = Notification::NO;
1042 efrain 934
                    $notification->user_id  = $feed->user_id;
935
                    $notification->feed_id  = $feed->id;
1 www 936
                    $notification->message  = 'LABEL_LIKE_MY_FEED';
937
                    $notification->url      = $this->url()->fromRoute('dashboard',['feed' => $feed->uuid]);
938
 
939
                    $notificationMapper = NotificationMapper::getInstance($this->adapter);
940
                    $notificationMapper->insert($notification);
941
 
942
                    $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
943
                    $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
944
 
945
                    if($userNotification && $userNotification->like_my_feed)
946
                    {
947
                        $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
3639 efrain 948
                        $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_LIKE_MY_FEED, $currentUser->network_id);
1 www 949
 
950
                        if($emailTemplate) {
951
                            $arrayCont = [
952
                                'firstname'             => $currentUser->first_name,
953
                                'lastname'              => $currentUser->last_name,
954
                                'other_user_firstname'  => $ownerFeed->first_name,
955
                                'other_user_lastname'   => $ownerFeed->last_name,
956
                                'company_name'          => '',
957
                                'group_name'            => '',
958
                                'content'               => '',
959
                                'code'                  => '',
960
                                'link'                  => $this->url()->fromRoute('dashboard',['feed' => $feed->uuid], ['force_canonical' => true])
961
                            ];
962
 
963
                            $email = new QueueEmail($this->adapter);
964
                            $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
965
                        }
966
                    }
967
 
968
                }
969
 
970
 
971
 
972
 
973
 
974
 
975
 
976
 
977
                $response = [
1042 efrain 978
                    'success' => true,
979
                    'data' => [
980
                        'likes' => $likes
981
                    ]
1 www 982
                ];
983
            } else {
984
                $response = [
985
                    'success' => false,
986
                    'data' => $likeMapper->getError()
987
                ];
988
            }
989
            return new JsonModel($response);
990
 
991
        }
992
 
993
        $response = [
994
            'success' => false,
995
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
996
        ];
997
        return new JsonModel($response);
998
    }
999
 
1000
    public function unlikeAction()
1001
    {
1002
        $id = $this->params()->fromRoute('id');
1003
 
1004
        $request = $this->getRequest();
1005
        if($request->isPost()) {
1006
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1007
            $currentUser = $currentUserPlugin->getUser();
3639 efrain 1008
 
1 www 1009
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 1010
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1 www 1011
            if(!$feed) {
1012
                $response = [
1013
                    'success' => false,
1014
                    'data' => 'ERROR_POST_NOT_FOUND'
1015
                ];
1016
                return new JsonModel($response);
1017
            }
1018
 
1019
            $likeMapper = LikeMapper::getInstance($this->adapter);
1020
            $like = $likeMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1021
 
1022
            if(!$like) {
1023
                $response = [
1024
                    'success' => false,
1025
                    'data' => 'ERROR_DUPLICATE_ACTION'
1026
                ];
1027
                return new JsonModel($response);
1028
            }
1029
 
1030
            if($likeMapper->deleteByFeedIdAndUserId($feed->id, $currentUser->id))
1031
            {
1042 efrain 1032
                $likes = $likeMapper->fetchCountLikeByFeedId($feed->id);
1033
 
1034
 
1 www 1035
                $response = [
1042 efrain 1036
                    'success' => true,
1037
                    'data' => [
1038
                        'likes' => $likes
1039
                    ]
1 www 1040
                ];
1041
            } else {
1042
                $response = [
1043
                    'success' => false,
1044
                    'data' => $likeMapper->getError()
1045
                ];
1046
            }
1047
            return new JsonModel($response);
1048
 
1049
        }
1050
 
1051
        $response = [
1052
            'success' => false,
1053
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1054
        ];
1055
        return new JsonModel($response);
1056
    }
1057
 
1058
    public function timelineAction()
1059
    {
3138 efrain 1060
        $utilMapper = UtilMapper::getInstance($this->adapter);
1061
        $now = $utilMapper->getDatebaseNow();
1062
 
1 www 1063
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1064
        $currentUser = $currentUserPlugin->getUser();
3639 efrain 1065
 
1 www 1066
 
1067
        $type   = $this->params()->fromRoute('type');
1068
        if($type == 'user') {
1069
            $id = $currentUser->id;
1070
        } else {
1071
            $id     = $this->params()->fromRoute('id');
1072
        }
1073
 
3146 efrain 1074
        $feedHighlighted = 0;
1075
        $feedUuid = $this->params()->fromRoute('feed');
1 www 1076
 
3146 efrain 1077
 
1078
 
1079
        if($feedUuid) {
1080
            $feedMapper = FeedMapper::getInstance($this->adapter);
3639 efrain 1081
            $feed = $feedMapper->fetchOneByUuidAndNetworkIdAnyStatus($feedUuid, $currentUser->network_id);
3146 efrain 1082
 
1083
            if($feed) {
1084
                $feedHighlighted = $feed->id;
1085
            }
1086
        }
1 www 1087
 
3146 efrain 1088
 
1089
 
1 www 1090
        $request = $this->getRequest();
1091
        if($request->isGet()) {
1092
 
1093
            $page = (int) $this->params()->fromQuery('page');
1094
            if($type == 'user') {
1095
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1096
                $records = $connectionMapper->fetchAllConnectionsByUser($id);
1097
 
1098
                $connectionIds = [0];
1099
                foreach($records as $record)
1100
                {
1101
                    if($currentUser->id == $record->request_from) {
1102
                        array_push($connectionIds, $record->request_to);
1103
                    } else {
1104
                        array_push($connectionIds, $record->request_from);
1105
                    }
1106
                }
1107
                array_push($connectionIds, 1);
1108
 
1109
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
1110
                $records = $companyFollowerMapper->fetchAllByFollowerId($currentUser->id);
1111
 
1112
                $companyIds = [0];
1113
                foreach($records as $record)
1114
                {
1115
                    if(!in_array($record->company_id, $companyIds)) {
1116
                        array_push($companyIds, $record->company_id);
1117
                    }
1118
                }
1119
 
1120
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1121
                $companyUsers = $companyUserMapper->fetchAllByUserId($currentUser->id);
1122
 
1123
                foreach($companyUsers as $companyUser)
1124
                {
1125
                    if($companyUser->status == CompanyUser::STATUS_ACCEPTED) {
1126
                        if(!in_array($companyUser->company_id, $companyIds)) {
1127
                            array_push($companyIds, $companyUser->company_id);
1128
                        }
1129
                    }
1130
                }
1131
 
1132
 
1133
                $queryMapper = QueryMapper::getInstance($this->adapter);
1134
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1135
                $select->columns(['id']);
3639 efrain 1136
                $select->where->equalTo('network_id', $currentUser->network_id);
1 www 1137
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED)
1138
                    ->AND->NEST
1139
                    ->OR->NEST->equalTo('user_id',$id)->and->equalTo('type', Feed::TYPE_UPDATE)->UNNEST
1140
                    ->OR->NEST->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_PUBLIC)->UNNEST
1141
                    ->OR->NEST->in('user_id', $connectionIds)->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_CONNECTIONS)->UNNEST
1142
                    ->OR->NEST->or->in('company_id', $companyIds)->and->equalTo('type', Feed::TYPE_COMPANY)->UNNEST
1143
                    ->UNNEST;
1144
                $select->order('added_on desc');
1145
 
1146
 
1147
            }
1148
            if($type == 'company') {
1149
                $companyMapper = CompanyMapper::getInstance($this->adapter);
3691 efrain 1150
                $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1 www 1151
 
1152
                if(!$company || $company->status != Company::STATUS_ACTIVE) {
1153
                    $id = 0;
1154
                } else {
1155
                    $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
1156
                    $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1157
                    if($companyFollower) {
1158
                        $id = $company->id;
1159
                    } else {
1160
 
1161
                        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1162
                        $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1163
 
1164
                        if(!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {
1165
                            $id = 0;
1166
                        } else {
1167
                            $id = $company->id;
1168
                        }
1169
 
1170
                    }
1171
 
1172
                }
1173
 
1174
 
1175
                $queryMapper = QueryMapper::getInstance($this->adapter);
1176
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1177
                $select->columns(['id']);
3639 efrain 1178
                $select->where->equalTo('network_id', $currentUser->network_id);
1 www 1179
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
1180
                $select->where->equalTo('company_id',$id);
1181
                $select->where->and->equalTo('type', Feed::TYPE_COMPANY);
1182
                $select->order('added_on desc');
1183
            }
1184
            if($type == 'group') {
1185
                $groupMapper = GroupMapper::getInstance($this->adapter);
3691 efrain 1186
                $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
3139 efrain 1187
 
1188
                $id = 0;
1189
 
3648 efrain 1190
                if($group && $group->status == Group::STATUS_ACTIVE) {
1 www 1191
                    $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1192
                    $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
1193
                    if($groupMember) {
3139 efrain 1194
 
1 www 1195
 
3139 efrain 1196
                        if($groupMember->status == GroupMember::STATUS_ACCEPTED ||
1197
                            $groupMember->status == GroupMember::STATUS_AUTO_JOIN ) {
1198
 
1199
                            $id =  $groupMember->group_id;
1200
                        }
1201
 
1 www 1202
                    }
1203
                }
1204
 
1205
                $queryMapper = QueryMapper::getInstance($this->adapter);
1206
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1207
                $select->columns(['id']);
3639 efrain 1208
                $select->where->equalTo('network_id', $currentUser->network_id);
1 www 1209
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
3139 efrain 1210
                $select->where->equalTo('group_id', $id);
1 www 1211
                $select->where->and->equalTo('type', Feed::TYPE_GROUP);
1212
                $select->order('added_on desc');
3691 efrain 1213
 
1214
 
1 www 1215
            }
1216
 
1217
            $dbSelect = new DbSelect($select, $this->adapter);
1218
            $paginator = new Paginator($dbSelect);
1219
            $paginator->setCurrentPageNumber($page ? $page : 1);
1220
            $paginator->setItemCountPerPage(10);
1221
 
1222
            $items = [];
3146 efrain 1223
 
1224
 
1225
            if($feedHighlighted) {
1226
 
1227
 
1228
                $items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted);
1229
            }
1230
 
1 www 1231
            $feeds = $paginator->getCurrentItems();
3146 efrain 1232
            foreach($feeds as $feed)
1 www 1233
            {
3146 efrain 1234
                $items[] = $this->renderFeed($feed->id, $now, $feedHighlighted);
1 www 1235
            }
3146 efrain 1236
 
1 www 1237
            $response = [
1238
                'success' => true,
1239
                'data' => [
1240
                    'total' => [
1241
                        'count' => $paginator->getTotalItemCount(),
1242
                        'pages' => $paginator->getPages()->pageCount,
1243
                    ],
1244
                    'current' => [
1245
                        'items'    => $items,
1246
                        'page'     => $paginator->getCurrentPageNumber(),
1247
                        'count'    => $paginator->getCurrentItemCount(),
1248
                    ]
1249
                ]
1250
            ];
3146 efrain 1251
 
1252
 
1253
 
1254
            /*
1255
            if($feedHighlighted) {
1 www 1256
 
3146 efrain 1257
 
1258
                $items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted);
1259
 
1260
                $response = [
1261
                    'success' => true,
1262
                    'data' => [
1263
                        'total' => [
1264
                            'count' => 1,
1265
                            'pages' => 1,
1266
                        ],
1267
                        'current' => [
1268
                            'items'    => $items,
1269
                            'page'     => 1,
1270
                            'count'    => 1,
1271
                        ]
1272
                    ]
1273
                ];
1274
            } else {
1275
 
1276
 
1277
 
1278
                $feeds = $paginator->getCurrentItems();
1279
                foreach($feeds as $feed)
1280
                {
1281
                    $items[] = $this->renderFeed($feed->id, $now, $feedHighlighted);
1282
                }
1283
 
1284
                $response = [
1285
                    'success' => true,
1286
                    'data' => [
1287
                        'total' => [
1288
                            'count' => $paginator->getTotalItemCount(),
1289
                            'pages' => $paginator->getPages()->pageCount,
1290
                        ],
1291
                        'current' => [
1292
                            'items'    => $items,
1293
                            'page'     => $paginator->getCurrentPageNumber(),
1294
                            'count'    => $paginator->getCurrentItemCount(),
1295
                        ]
1296
                    ]
1297
                ];
1298
            }*/
1299
 
1300
 
1301
 
1 www 1302
            return new JsonModel($response);
1303
        }
1304
 
1305
        $response = [
1306
            'success' => false,
1307
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1308
        ];
1309
 
1310
 
1311
        return new JsonModel($response);
1312
    }
1313
 
1314
    /**
1315
     *
1316
     * @param string $str
1317
     * @return string
1318
     */
1319
    private function normalizeString ($str = '')
1320
    {
1321
        $basename  = substr($str, 0, strrpos($str, '.'));
1322
        $basename  = str_replace('.', '-', $basename);
1323
 
1324
        $extension  = substr($str, strrpos($str, '.'));
1325
 
1326
        $str = $basename . $extension;
1327
 
1328
        $str = strip_tags($str);
1329
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
1330
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
1331
        $str = strtolower($str);
1332
        $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
1333
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
1334
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
1335
        $str = str_replace(' ', '-', $str);
1336
        $str = rawurlencode($str);
1337
        $str = str_replace('%', '-', $str);
1338
        return trim(strtolower($str));
1339
    }
1340
 
1341
 
1342
 
1343
    /**
1344
     *
1345
     * @param int $feed_id
1346
     * @return array
1347
     */
3146 efrain 1348
    private function renderFeed($feed_id, $now, $feedHighlighted = 0)
1 www 1349
    {
1350
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1351
        $currentUser = $currentUserPlugin->getUser();
1352
 
3639 efrain 1353
        //$acl = $this->getEvent()->getViewModel()->getVariable('acl');
1 www 1354
 
1355
        $userMapper = UserMapper::getInstance($this->adapter);
1356
        $feedMapper = FeedMapper::getInstance($this->adapter);
3146 efrain 1357
        $feed = $feedMapper->fetchOneAnyStatus($feed_id);
1 www 1358
 
1359
 
3146 efrain 1360
 
1361
 
1362
 
1 www 1363
        $likeMapper = LikeMapper::getInstance($this->adapter);
1364
        $like = $likeMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1042 efrain 1365
        $likes = $likeMapper->fetchCountLikeByFeedId($feed->id);
1 www 1366
 
1367
        $params = [
1368
            'id' => $feed->uuid
1369
        ];
1370
        if($feed->company_id) {
1371
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1372
            $company = $companyMapper->fetchOne($feed->company_id);
1373
 
1374
            $params['company_id'] = $company->uuid;
1375
        } else {
1376
            $company = null;
1377
        }
1378
        if($feed->group_id) {
1379
            $groupMapper = GroupMapper::getInstance($this->adapter);
1380
            $group = $groupMapper->fetchOne($feed->group_id);
1381
 
1382
            $params['group_id'] = $group->uuid;
1383
        } else {
1384
            $group = null;
1385
        }
1386
 
4778 efrain 1387
 
3364 efrain 1388
        $timestamp = time();
1389
 
1390
        list($usec, $sec) = explode(' ', microtime());
1391
        $seed = intval($sec + ((float) $usec * 100000));
1392
        mt_srand($seed, MT_RAND_MT19937);
1393
        $rand =  mt_rand();
1394
 
1395
 
1396
 
3366 efrain 1397
        $password  = md5('user-' . $currentUser->uuid . '-feed-' . $feed->uuid . '-timestamp-' . $timestamp . '-rand-' . $rand . '-share-key-' . $currentUser->share_key) ;
3364 efrain 1398
 
1399
 
3380 efrain 1400
        $share_params = [
3379 efrain 1401
            'type' => 'feed',
1402
            'code' => $feed->uuid,
1403
            'user' => $currentUser->uuid,
1404
            'timestamp' => $timestamp,
1405
            'rand' => $rand,
1406
            'password' => $password,
3364 efrain 1407
        ];
3379 efrain 1408
 
3364 efrain 1409
 
4778 efrain 1410
        $share_increment_external_counter_url = $this->url()->fromRoute('share/increment-external-counter', $share_params  , ['force_canonical' => true]);
1411
 
3364 efrain 1412
 
3775 efrain 1413
        $share_external_url = $this->url()->fromRoute('shorter/generate', ['code' => $feed->uuid, 'type' => 'feed' ]  , ['force_canonical' => true]);
3364 efrain 1414
 
1 www 1415
        $item = [
1416
            'feed_unique' => uniqid(),
1417
            'feed_uuid' => $feed->uuid,
1418
            'feed_is_liked' => $like ? true : false,
1419
            'feed_like_url' => $this->url()->fromRoute('feed/like',  $params),
1420
            'feed_unlike_url' => $this->url()->fromRoute('feed/unlike',  $params),
1421
            'feed_share_url' => $this->url()->fromRoute('feed/share',  $params),
3364 efrain 1422
            'feed_share_external_url' => $share_external_url,
4778 efrain 1423
            'feed_increment_external_counter_url' => $share_increment_external_counter_url,
1 www 1424
            'feed_delete_url' =>  '',
1425
            'feed_content_type' => $feed->file_type ? $feed->file_type : '',
1042 efrain 1426
            'feed_likes' =>  $likes,
3146 efrain 1427
            'feed_highlighted' => $feed->id == $feedHighlighted ? 1 : 0,
1428
 
1 www 1429
        ];
1430
 
1431
        if($feed->posted_or_shared == Feed::POSTED) {
1432
 
1433
 
1434
            if($feed->type == Feed::TYPE_COMPANY)
1435
            {
1436
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1437
                $company = $companyMapper->fetchOne($feed->company_id);
1438
                $item['owner_url'] = $this->url()->fromRoute('company/view', ['id' => $company->uuid]);
1439
                $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $company->uuid, 'type' => 'company', 'filename' => $company->image]);
1440
                $item['owner_name'] = $company->name;
1441
                /*
1442
 
1443
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1444
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1445
 
1446
 
1447
                if( $companyUser && $acl->isAllowed( $currentUser->usertype_id, 'my-company/feed' ) ) {
1448
                    $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params);
1449
                }
1450
                */
1451
 
1452
 
1453
            } else if($feed->type == Feed::TYPE_GROUP)
1454
            {
1455
                $groupMapper = GroupMapper::getInstance($this->adapter);
1456
                $group = $groupMapper->fetchOne($feed->group_id);
1457
                $item['owner_url'] = '';
1458
                $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $group->uuid, 'type' => 'group', 'filename' => $group->image]);
1459
                $item['owner_name'] = $group->name;
1460
 
1461
                if($group->user_id == $currentUser->id) {
1462
                    $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params);
1463
                }
1464
            } else {
1465
                $userMapper = UserMapper::getInstance($this->adapter);
1466
                $user = $userMapper->fetchOne($feed->user_id);
1467
 
1468
                $item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1469
                $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]);
1470
                $item['owner_name'] = $user->first_name . ' ' . $user->last_name;
1471
 
1472
                if($feed->user_id == $currentUser->id) {
1473
                    $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params);
1474
                }
1475
 
1476
            }
1477
        } else {
1478
            if($feed->user_id == $currentUser->id) {
1479
                $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params);
1480
            }
1481
        }
1482
 
1483
        $userMapper = UserMapper::getInstance($this->adapter);
1484
        $user = $userMapper->fetchOne($feed->user_id);
1485
 
1486
        if($feed->posted_or_shared == Feed::SHARED) {
1487
            $item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1488
            $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]);
1489
            $item['owner_name'] = $user->first_name . ' ' . $user->last_name;
1490
        }
1491
 
1492
        $item['owner_description'] = $feed->description;
1493
 
1494
        $item['owner_shared'] = $feed->total_shared;
4778 efrain 1495
        $item['owner_external_shared'] = $feed->total_external_shared;
1 www 1496
        $item['owner_comments'] = $feed->total_comments;
1497
 
1498
 
3138 efrain 1499
        $item['owner_time_elapse'] = Functions::timeAgo($feed->added_on, $now);
1 www 1500
 
1501
        if($feed->file_type == Feed::FILE_TYPE_IMAGE) {
1502
            $item['owner_file_image'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
1503
 
1504
        }
1505
        if($feed->file_type == Feed::FILE_TYPE_DOCUMENT) {
1506
            $item['owner_file_document'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
1507
        }
1508
        if($feed->file_type == Feed::FILE_TYPE_VIDEO) {
1509
            $item['owner_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_image_preview]);
1510
            $item['owner_file_video'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
1511
        }
1512
 
1513
        if($feed->posted_or_shared == Feed::SHARED) {
1514
 
1515
 
3143 efrain 1516
            $sharedFeed = $feedMapper->fetchOneAnyStatus($feed->shared_feed_id);
1 www 1517
 
3143 efrain 1518
 
1519
 
1520
 
1 www 1521
            $item['shared_description'] = $sharedFeed->description;
3138 efrain 1522
            $item['shared_time_elapse'] = Functions::timeAgo( $sharedFeed->added_on, $now);
1 www 1523
 
1524
            if($sharedFeed->file_type == Feed::FILE_TYPE_IMAGE) {
1525
                $item['shared_file_image'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);
1526
 
1527
            }
1528
            if($sharedFeed->file_type == Feed::FILE_TYPE_DOCUMENT) {
1529
                $item['shared_file_document'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);
1530
            }
1531
            if($sharedFeed->file_type == Feed::FILE_TYPE_VIDEO) {
1532
                $item['shared_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_image_preview]);
1533
                $item['shared_file_video'] = $this->url()->fromRoute('storage', ['code' => $sharedFeed->uuid, 'type' => 'feed', 'filename' => $sharedFeed->file_name]);
1534
            }
1535
 
1536
            $item['shared_content_type'] = $sharedFeed->file_type ? $sharedFeed->file_type : '';
1537
 
1538
            if($feed->company_id)
1539
            {
1540
 
1541
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1542
                $sharedCompany = $companyMapper->fetchOne($feed->company_id);
1543
                $item['shared_url'] = $this->url()->fromRoute('company/view', ['id' => $sharedCompany->uuid]);
1544
                $item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedCompany->uuid, 'type' => 'company', 'filename' => $sharedCompany->image]);
1545
                $item['shared_name'] = $sharedCompany->name;
1546
            } else if($feed->group_id)
1547
            {
1548
                $groupMapper = GroupMapper::getInstance($this->adapter);
1549
                $sharedGroup = $groupMapper->fetchOne($feed->group_id);
1550
                $item['shared_url'] = '';
1551
                $item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedGroup->uuid, 'type' => 'group', 'filename' =>  $sharedGroup->image]);
1552
                $item['shared_name'] = $sharedGroup->name;
1553
            } else {
1554
 
1555
                $sharedUser = $userMapper->fetchOne($sharedFeed->user_id);
1556
                $item['shared_url'] = $this->url()->fromRoute('profile/view', ['id' => $sharedUser->uuid]);
1557
                $item['shared_image'] = $this->url()->fromRoute('storage', ['code' => $sharedUser->uuid, 'type' => 'user', 'filename' => $sharedUser->image]);
1558
                $item['shared_name'] = $sharedUser->first_name . ' ' . $sharedUser->last_name;
1559
            }
1560
 
1561
        }
1562
 
1563
        $commentMapper = CommentMapper::getInstance($this->adapter);
1564
        $records = $commentMapper->fetchAllPublishedByFeedId($feed->id);
1565
 
1566
        $comments = [];
1567
        foreach($records as $record)
1568
        {
1569
            $user = $userMapper->fetchOne($record->user_id);
3138 efrain 1570
 
1 www 1571
            if($record->user_id == $currentUser->id) {
1572
                $link_delete = $this->url()->fromRoute('feed/comment/delete',['id' => $feed->uuid, 'comment' => $record->uuid]);
1573
            } else {
1574
                $link_delete = '';
1575
            }
1576
 
1577
            array_push($comments, [
1578
                'unique' => uniqid(),
1579
                'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
1580
                'user_name' => $user->first_name . ' ' . $user->last_name,
1581
                'user_image' => $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]),
3138 efrain 1582
                'time_elapsed' => Functions::timeAgo($record->added_on, $now),
1 www 1583
                'comment' => $record->comment,
1584
                'link_delete' => $link_delete
1585
            ]);
1586
        }
1587
        $item['comment_add_url'] = $this->url()->fromRoute('feed/comment', ['id' => $feed->uuid]);
1588
        $item['comments'] = $comments;
1589
 
1590
        return $item;
1591
    }
1592
 
1593
    /**
1594
     *
1595
     * @param int $comment_id
1596
     * @return array
1597
     */
3138 efrain 1598
    private function renderComment($comment_id, $now)
1 www 1599
    {
1600
        $item = [];
1601
 
1602
        $commentMapper = CommentMapper::getInstance($this->adapter);
1603
        $record = $commentMapper->fetchOne($comment_id);
1604
 
1605
        $feedMapper = FeedMapper::getInstance($this->adapter);
1606
        $feed = $feedMapper->fetchOne($record->feed_id);
1607
 
1608
        if($record) {
1609
            $userMapper = UserMapper::getInstance($this->adapter);
1610
 
1611
            $user = $userMapper->fetchOne($record->user_id);
1612
 
1613
            $item['unique'] = uniqid();
1614
            $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
1615
            $item['user_url'] = $this->url()->fromRoute('profile', ['id' => $user->uuid]);
1616
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
3138 efrain 1617
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1 www 1618
            $item['comment'] = $record->comment;
1619
            $item['link_delete'] = $this->url()->fromRoute('feed/comment/delete',['id' => $feed->uuid, 'comment' => $record->uuid ]);
1620
        }
1621
        return $item;
1622
    }
1623
 
1624
    /**
1625
     *
1626
     * @param string $path
1627
     * @return boolean
1628
     */
1629
    private function deletePath($path)
1630
    {
1631
        try {
1632
            if (is_dir($path)){
1633
                if ($dh = opendir($path)) {
1634
                    while (($file = readdir($dh)) !== false)
1635
                    {
1636
                        if($file == '.' || $file == '..') {
1637
                            continue;
1638
                        }
1639
                        unlink($path . DIRECTORY_SEPARATOR . $file);
1640
                    }
1641
                    closedir($dh);
1642
                }
1643
 
1644
                rmdir($path);
1645
            }
1646
            return true;
1647
        }
1648
        catch (\Throwable $e)
1649
        {
1650
            error_log($e->getTraceAsString());
1651
            return false;
1652
        }
1653
    }
1654
 
1655
 
1656
    /**
1657
     *
1658
     * @param Feed $feed
1659
     * @return array
1660
     */
1661
    private function deleteFeed($feed)
1662
    {
1663
        $feedMapper = FeedMapper::getInstance($this->adapter);
1664
        $feed->status = Feed::STATUS_DELETED;
1665
        if($feedMapper->update($feed)) {
1666
            $response = [
1667
                'success' => true,
1668
                'data' => 'LABEL_FEED_WAS_DELETED'
1669
            ];
1670
 
1671
        } else {
1672
            $response = [
1673
                'success' => false,
1674
                'data' => $feedMapper->getError()
1675
            ];
1676
        }
1677
 
1678
 
1679
        /*$commentMapper = CommentMapper::getInstance($this->adapter);
1680
        if($commentMapper->deleteAllByFeedId($feed->id)) {
1681
            if($feedMapper->delete($feed->id)) {
1682
                $target_path = $this->config['leaderslinked.fullpath.feed'] . DIRECTORY_SEPARATOR . $feed->id;
1683
                if(file_exists($target_path)) {
1684
                    $this->deletePath($target_path);
1685
                }
1686
 
1687
                $response = [
1688
                    'success' => true,
1689
                    'data' => 'LABEL_FEED_WAS_DELETED'
1690
                ];
1691
 
1692
            } else {
1693
                $response = [
1694
                    'success' => false,
1695
                    'data' => $feedMapper->getError()
1696
                ];
1697
            }
1698
        } else {
1699
            $response = [
1700
                'success' => false,
1701
                'data' => $commentMapper->getError()
1702
            ];
1703
 
1704
        }*/
1705
 
1706
        return $response;
1707
    }
1708
 
1709
 
1710
}