Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Mvc\Controller\AbstractActionController;
7
use Laminas\View\Model\JsonModel;
8
use LeadersLinked\Library\Functions;
9
use LeadersLinked\Mapper\CompanyUserMapper;
10
use LeadersLinked\Form\Feed\CreateForm;
11
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
12
use LeadersLinked\Model\Feed;
13
use LeadersLinked\Mapper\FeedMapper;
14
use LeadersLinked\Library\Image;
15
use LeadersLinked\Mapper\GroupMapper;
16
use LeadersLinked\Mapper\UserMapper;
17
use LeadersLinked\Mapper\CommentMapper;
18
use LeadersLinked\Mapper\ConnectionMapper;
19
use LeadersLinked\Mapper\CompanyFollowerMapper;
20
use LeadersLinked\Mapper\QueryMapper;
21
use Laminas\Paginator\Paginator;
22
use Laminas\Paginator\Adapter\DbSelect;
23
use LeadersLinked\Mapper\ContentReactionMapper;
24
use LeadersLinked\Model\ContentReaction;
25
use LeadersLinked\Form\Feed\CommentForm;
26
use LeadersLinked\Model\Comment;
27
use LeadersLinked\Form\Feed\CreateGroupCompanyForm;
28
use LeadersLinked\Model\CompanyUser;
29
use LeadersLinked\Model\FastSurvey;
30
use LeadersLinked\Model\VideoConvert;
31
use LeadersLinked\Mapper\VideoConvertMapper;
32
use LeadersLinked\Mapper\CompanyMapper;
33
use LeadersLinked\Model\Company;
34
use LeadersLinked\Model\Group;
35
use LeadersLinked\Mapper\GroupMemberMapper;
36
use LeadersLinked\Model\GroupMember;
37
use LeadersLinked\Model\Notification;
38
use LeadersLinked\Mapper\NotificationMapper;
39
use LeadersLinked\Mapper\UserNotificationSettingMapper;
40
use LeadersLinked\Mapper\EmailTemplateMapper;
41
use LeadersLinked\Model\EmailTemplate;
42
use LeadersLinked\Library\QueueEmail;
43
use LeadersLinked\Mapper\FastSurveyMapper;
44
use LeadersLinked\Mapper\FastSurveyVoteMapper;
45
use LeadersLinked\Model\FastSurveyVote;
192 efrain 46
use LeadersLinked\Mapper\AbuseReportMapper;
47
use LeadersLinked\Mapper\UserBlockedMapper;
48
use LeadersLinked\Model\AbuseReport;
232 efrain 49
use LeadersLinked\Model\User;
283 www 50
use LeadersLinked\Library\S3Files;
51
use LeadersLinked\Library\Storage;
1 efrain 52
 
53
 
54
class FeedController extends AbstractActionController
55
{
56
    /**
57
     *
58
     * @var \Laminas\Db\Adapter\AdapterInterface
59
     */
60
    private $adapter;
61
 
62
    /**
63
     *
64
     * @var \LeadersLinked\Cache\CacheInterface
65
     */
66
    private $cache;
67
 
68
 
69
    /**
70
     *
71
     * @var \Laminas\Log\LoggerInterface
72
     */
73
    private $logger;
74
 
75
    /**
76
     *
77
     * @var array
78
     */
79
    private $config;
80
 
81
 
82
    /**
83
     *
84
     * @var \Laminas\Mvc\I18n\Translator
85
     */
86
    private $translator;
87
 
88
 
89
    /**
90
     *
91
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
92
     * @param \LeadersLinked\Cache\CacheInterface $cache
93
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
94
     * @param array $config
95
     * @param \Laminas\Mvc\I18n\Translator $translator
96
     */
97
    public function __construct($adapter, $cache, $logger, $config, $translator)
98
    {
99
        $this->adapter      = $adapter;
100
        $this->cache        = $cache;
101
        $this->logger       = $logger;
102
        $this->config       = $config;
103
        $this->translator   = $translator;
104
    }
105
 
106
    /**
107
     *
108
     * Generación del listado de perfiles
109
     * {@inheritDoc}
110
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
111
     */
112
    public function indexAction()
113
    {
114
 
115
        return new JsonModel([
116
            'success' => false,
117
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
118
        ]);
119
    }
120
 
121
    public function commentAction()
122
    {
123
        $id = $this->params()->fromRoute('id');
124
 
125
        $request = $this->getRequest();
126
        if ($request->isPost()) {
127
            $feedMapper = FeedMapper::getInstance($this->adapter);
128
            $now = $feedMapper->getDatebaseNow();
129
 
130
            $feed = $feedMapper->fetchOneByUuid($id);
131
 
132
            if (!$feed) {
133
                $response = [
134
                    'success' => false,
135
                    'data' => 'ERROR_POST_NOT_FOUND'
136
                ];
137
                return new JsonModel($response);
138
            }
139
 
140
            $dataPost = $request->getPost()->toArray();
141
            $form = new CommentForm();
142
            $form->setData($dataPost);
143
 
144
            if ($form->isValid()) {
145
                $currentUserPlugin = $this->plugin('currentUserPlugin');
146
                $currentUser = $currentUserPlugin->getUser();
147
 
148
                $dataPost = (array) $form->getData();
149
 
150
 
151
 
152
                $comment = new Comment();
153
                $comment->network_id = $currentUser->network_id;
154
                $comment->comment = $dataPost['comment'];
155
                $comment->user_id = $currentUser->id;
156
                $comment->feed_id = $feed->id;
157
                $comment->relational = Comment::RELATIONAL_FEED;
158
 
159
                $commentMapper = CommentMapper::getInstance($this->adapter);
160
                if ($commentMapper->insert($comment)) {
161
 
162
 
163
                    if ($feed->type == Feed::TYPE_UPDATE) {
164
                        $userMapper = UserMapper::getInstance($this->adapter);
165
                        $ownerFeed = $userMapper->fetchOne($feed->user_id);
166
 
167
                        $notification = new Notification();
168
                        $notification->type = Notification::TYPE_COMMENT_MY_FEED;
169
                        $notification->feed_id = $feed->id;
170
                        $notification->read     = Notification::NO;
171
                        $notification->user_id  = $ownerFeed->id;
172
                        $notification->message  = 'LABEL_COMMENT_MY_FEED';
173
                        $notification->url      = $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid]);
174
 
175
                        $notificationMapper = NotificationMapper::getInstance($this->adapter);
176
                        $notificationMapper->insert($notification);
177
 
178
                        $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
179
                        $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
180
 
181
                        if ($userNotification && $userNotification->comment_my_feed) {
182
                            $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
183
                            $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_COMMENT_MY_FEED,  $currentUser->network_id);
184
 
185
                            if ($emailTemplate) {
186
                                $arrayCont = [
187
                                    'firstname'             => $currentUser->first_name,
188
                                    'lastname'              => $currentUser->last_name,
189
                                    'other_user_firstname'  => $ownerFeed->first_name,
190
                                    'other_user_lastname'   => $ownerFeed->last_name,
191
                                    'company_name'          => '',
192
                                    'group_name'            => '',
193
                                    'content'               => '',
194
                                    'code'                  => '',
195
                                    'link'                  => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])
196
                                ];
197
 
198
                                $email = new QueueEmail($this->adapter);
199
                                $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
200
                            }
201
                        }
202
                    }
203
 
204
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
205
 
206
                    $feed->total_comments = $total_comments;
207
                    $feedMapper->update($feed);
208
 
209
                    $response = [
210
                        'success'   => true,
211
                        'data'   => $this->renderComment($comment->id, $now),
212
                        'total_comments' => $total_comments
213
                    ];
214
 
215
                    return new JsonModel($response);
216
                } else {
217
 
218
                    $response = [
219
                        'success'   => false,
220
                        'data'   => $commentMapper->getError()
221
                    ];
222
 
223
                    return new JsonModel($response);
224
                }
225
            } else {
226
                $message = '';;
227
                $form_messages = (array) $form->getMessages();
228
                foreach ($form_messages  as $fieldname => $field_messages) {
229
                    foreach ($field_messages as $key => $value) {
230
                        $message = $value;
231
                    }
232
                }
233
 
234
                $response = [
235
                    'success'   => false,
236
                    'data'   => $message
237
                ];
238
 
239
                return new JsonModel($response);
240
            }
241
        } else {
242
            $response = [
243
                'success' => false,
244
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
245
            ];
246
 
247
            return new JsonModel($response);
248
        }
249
    }
232 efrain 250
 
251
    public function reactionsAction()
252
    {
253
        $id = $this->params()->fromRoute('id');
254
 
255
        $request = $this->getRequest();
256
        $request = $this->getRequest();
257
        if ($request->isGet()) {
283 www 258
 
232 efrain 259
            $currentUserPlugin = $this->plugin('currentUserPlugin');
260
            $currentUser = $currentUserPlugin->getUser();
261
 
262
            $feedMapper = FeedMapper::getInstance($this->adapter);
263
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
264
            if (!$feed) {
265
                $response = [
266
                    'success' => false,
267
                    'data' => 'ERROR_POST_NOT_FOUND'
268
                ];
269
                return new JsonModel($response);
270
            }
271
 
272
 
233 efrain 273
            $userMapper = UserMapper::getInstance($this->adapter);
232 efrain 274
 
275
            $items = [];
276
 
277
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
278
            $records = $contentReactionMapper->fetchAllByFeedId($feed->id);
283 www 279
            $storage = Storage::getInstance($this->config);
232 efrain 280
 
281
            foreach($records as $record)
282
            {
283
                $user = $userMapper->fetchOne($record->user_id);
284
                if($user && $user->status == User::STATUS_ACTIVE) {
283 www 285
 
232 efrain 286
 
287
                    array_push($items, [
288
                        'first_name' => $user->first_name,
289
                        'last_name' => $user->last_name,
290
                        'email' => $user->email,
283 www 291
                        'image' => $storage->getUserImage($user),
232 efrain 292
                        'reaction' => $record->reaction,
293
                    ]);
294
                }
295
            }
296
 
233 efrain 297
            $response = [
298
                'success' => true,
299
                'data' => $items
300
            ];
232 efrain 301
 
233 efrain 302
            return new JsonModel($response);
232 efrain 303
 
304
 
305
 
306
 
307
        } else {
308
            $response = [
309
                'success' => false,
310
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
311
            ];
312
 
313
            return new JsonModel($response);
314
        }
315
    }
1 efrain 316
 
317
    public function shareAction()
318
    {
319
        $id = $this->params()->fromRoute('id');
320
 
321
        $request = $this->getRequest();
322
        if ($request->isPost()) {
323
 
324
            $currentUserPlugin = $this->plugin('currentUserPlugin');
325
            $currentUser = $currentUserPlugin->getUser();
326
 
327
 
328
            $feedMapper = FeedMapper::getInstance($this->adapter);
329
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
330
            if (!$feed) {
331
                $response = [
332
                    'success' => false,
333
                    'data' => 'ERROR_POST_NOT_FOUND'
334
                ];
335
                return new JsonModel($response);
336
            }
337
 
338
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
339
            $dataPost['company_id'] = $this->params()->fromRoute('company_id');
340
            $dataPost['group_id'] = $this->params()->fromRoute('group_id');
341
            $dataPost['shared_feed_id'] = $feed->id;
342
 
343
 
344
 
345
 
346
            $response = $this->postOrShareFeed($dataPost);
347
            if ($response['success']) {
348
                $feedMapper->incTotalShared($feed->id);
349
                $total_shared = $feedMapper->fetchTotalShared($feed->id);
350
 
351
                $response['total_shared'] = $total_shared;
352
            }
353
 
354
 
355
            return new JsonModel($response);
356
        } else {
357
            $response = [
358
                'success' => false,
359
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
360
            ];
361
        }
362
 
363
        return new JsonModel($response);
364
    }
365
 
366
    public function commentDeleteAction()
367
    {
368
        $request = $this->getRequest();
369
        if ($request->isPost()) {
370
            $currentUserPlugin = $this->plugin('currentUserPlugin');
371
            $currentUser = $currentUserPlugin->getUser();
372
 
373
            $feed_id = $this->params()->fromRoute('id');
374
            $comment = $this->params()->fromRoute('comment');
375
 
376
            $feedMapper = FeedMapper::getInstance($this->adapter);
377
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);
378
 
379
            if ($feed) {
380
 
381
                $commentMapper = CommentMapper::getInstance($this->adapter);
382
                $comment = $commentMapper->fetchOneByUuid($comment);
383
 
384
                if ($comment && $comment->feed_id == $feed->id && $comment->user_id == $currentUser->id) {
385
 
386
                    $comment->status = Comment::STATUS_DELETED;
387
 
388
                    if ($commentMapper->update($comment)) {
389
 
390
                        $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
391
 
392
 
393
                        $feedMapper = FeedMapper::getInstance($this->adapter);
394
                        $feed = $feedMapper->fetchOne($comment->feed_id);
395
                        $feed->total_comments = $total_comments;
396
                        $feedMapper->update($feed);
397
 
398
 
399
 
400
 
401
 
402
                        $response = [
403
                            'success' => true,
404
                            'data' => 'LABEL_COMMENT_WAS_DELETED',
405
                            'total_comments' => $total_comments
406
                        ];
407
                    } else {
408
                        $response = [
409
                            'success' => false,
410
                            'data' => $commentMapper->getError()
411
                        ];
412
                    }
413
                } else {
414
                    $response = [
415
                        'success' => false,
416
                        'data' => 'ERROR_COMMENT_NOT_FOUND'
417
                    ];
418
                }
419
            } else {
420
                $response = [
421
                    'success' => false,
422
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
423
                ];
424
            }
425
        } else {
426
            $response = [
427
                'success' => false,
428
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
429
            ];
430
        }
431
 
432
        return new JsonModel($response);
433
    }
434
 
435
    public function deleteAction()
436
    {
437
        $request = $this->getRequest();
438
        if ($request->isPost()) {
439
            $currentUserPlugin = $this->plugin('currentUserPlugin');
440
            $currentUser = $currentUserPlugin->getUser();
441
 
442
            $feed_id =  $this->params()->fromRoute('id');
443
 
444
            $feedMapper = FeedMapper::getInstance($this->adapter);
445
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($feed_id, $currentUser->network_id);
446
 
447
            if ($feed) {
448
 
449
                if ($feed->user_id && $feed->user_id == $currentUser->id) {
450
 
451
                    return new JsonModel($this->deleteFeed($feed));
452
                } else if ($feed->group_id) {
453
 
454
                    $groupMapper = GroupMapper::getInstance($this->adapter);
455
                    $group = $groupMapper->fetchOne($feed->group_id);
456
                    if ($group && $group->user_id == $currentUser->id) {
457
                        return new JsonModel($this->deleteFeed($feed));
458
                    }
459
                } else if ($feed->company_id) {
460
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
461
                    $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($feed->company_id, $currentUser->id);
462
                    if ($companyUser) {
463
                        if (in_array($companyUser->type, [CompanyUser::TYPE_OWNER, CompanyUser::TYPE_ADMINISTRATOR, CompanyUser::TYPE_MANAGER])) {
464
                            return new JsonModel($this->deleteFeed($feed));
465
                        }
466
                    }
467
                }
468
 
469
                $response = [
470
                    'success' => false,
471
                    'data' => ' ERROR_UNAUTHORIZED'
472
                ];
473
            } else {
474
                $response = [
475
                    'success' => false,
476
                    'data' => 'ERROR_FEED_NOT_FOUND'
477
                ];
478
            }
479
 
480
            return new JsonModel($response);
481
        } else {
482
            $response = [
483
                'success' => false,
484
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
485
            ];
486
        }
487
 
488
        return new JsonModel($response);
489
    }
490
 
491
    public function addAction()
492
    {
493
        $request = $this->getRequest();
494
        if ($request->isPost()) {
495
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
496
            $dataPost['company_id'] = $this->params()->fromRoute('company_id');
497
            $dataPost['group_id'] = $this->params()->fromRoute('group_id');
498
            $response = $this->postOrShareFeed($dataPost);
499
 
500
 
501
            return new JsonModel($response);
502
        } else {
503
            $response = [
504
                'success' => false,
505
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
506
            ];
507
        }
508
 
509
        return new JsonModel($response);
510
    }
511
 
512
    public function postOrShareFeed($dataPost)
513
    {
514
 
515
 
516
        $currentUserPlugin = $this->plugin('currentUserPlugin');
517
        $currentUser = $currentUserPlugin->getUser();
518
 
519
        $companyId  = empty($dataPost['company_id']) ? '' : $dataPost['company_id'];
520
        $groupId    = empty($dataPost['group_id']) ? '' : $dataPost['group_id'];
521
 
522
 
523
        if ($groupId || $companyId) {
524
            $form = new  CreateGroupCompanyForm($this->adapter);
525
        } else {
526
            $form = new  CreateForm($this->adapter);
527
        }
528
        $form->setData($dataPost);
529
        if ($form->isValid()) {
530
 
531
 
532
 
533
 
534
            $hydrator = new ObjectPropertyHydrator();
535
            $feed = new Feed();
536
            $hydrator->hydrate($dataPost, $feed);
537
 
538
            $company = null;
539
            $group = null;
540
 
541
            if ($companyId) {
542
                $companyMapper = CompanyMapper::getInstance($this->adapter);
543
                $now = $companyMapper->getDatebaseNow();
544
 
545
                $company = $companyMapper->fetchOneByUuidAndNetworkId($companyId, $currentUser->network_id);
546
 
547
 
548
                if (!$company) {
549
                    return [
550
                        'success'   => false,
551
                        'data'   => 'ERROR_COMPANY_NOT_FOUND'
552
                    ];
553
                }
554
 
555
                if ($company->status != Company::STATUS_ACTIVE) {
556
                    return [
557
                        'success'   => false,
558
                        'data'   => 'ERROR_COMPANY_IS_NOT_ACTIVE'
559
                    ];
560
                }
561
 
562
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
563
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
564
 
565
 
566
                if (!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {
567
                    return [
568
                        'success'   => false,
569
                        'data'   => 'ERROR_UNAUTHORIZED'
570
                    ];
571
                }
572
            }
573
 
574
            if ($groupId) {
575
                $groupMapper = GroupMapper::getInstance($this->adapter);
576
                $now = $groupMapper->getDatebaseNow();
577
 
578
                $group = $groupMapper->fetchOneByUuidAndNetworkId($groupId, $currentUser->network_id);
579
 
580
                if (!$group) {
581
                    return [
582
                        'success'   => false,
583
                        'data'   => 'ERROR_GROUP_NOT_FOUND'
584
                    ];
585
                }
586
 
587
                if ($group->status != Group::STATUS_ACTIVE) {
588
                    return [
589
                        'success'   => false,
590
                        'data'   => 'ERROR_GROUP_IS_NOT_ACTIVE'
591
                    ];
592
                }
593
 
594
                $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
595
                $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
596
                if (!$groupMember || !in_array($groupMember->status, [GroupMember::STATUS_ACCEPTED, GroupMember::STATUS_AUTO_JOIN])) {
597
                    return [
598
                        'success'   => false,
599
                        'data'   => 'ERROR_UNAUTHORIZED'
600
                    ];
601
                }
602
            }
603
 
604
            $feed->network_id   = $currentUser->network_id;
605
            $feed->company_id   = $company ? $company->id : null;
606
            $feed->group_id     = $group ? $group->id : null;
607
            $feed->user_id      = $currentUser->id;
608
 
609
            if ($companyId) {
610
                $feed->type = Feed::TYPE_COMPANY;
611
            } else if ($groupId) {
612
                $feed->type = Feed::TYPE_GROUP;
613
            } else {
614
                $feed->type = Feed::TYPE_UPDATE;
615
            }
616
 
617
            $posted_or_shared   = $dataPost['posted_or_shared'];
618
            if ($posted_or_shared != Feed::POSTED && $posted_or_shared != Feed::SHARED) {
619
                return [
620
                    'success'   => false,
621
                    'data'      => 'ERROR_SUPPLY_VALID_SHARING_STATUS'
622
                ];
623
            }
624
            $feed->posted_or_shared = $posted_or_shared;
625
            $feedMapper = FeedMapper::getInstance($this->adapter);
626
            $now = $feedMapper->getDatebaseNow();
627
 
628
            $shared_with = isset($dataPost['shared_with']) ? $dataPost['shared_with'] : Feed::SHARE_WITH_PUBLIC;
629
            if ($shared_with != Feed::SHARE_WITH_PUBLIC && $shared_with != Feed::SHARE_WITH_CONNECTIONS) {
630
                return [
631
                    'status' => false,
632
                    'error' => 'ERROR_SUPPLY_VALID_SHARING_WITH_TYPE',
633
                ];
634
            }
635
 
636
            $feed->shared_with = $shared_with;
637
            if (Feed::SHARED == $feed->posted_or_shared) {
638
                $shared_feed_id     = empty($dataPost['shared_feed_id']) ? 0 : $dataPost['shared_feed_id'];
639
 
640
 
641
                $sharedFeed = $feedMapper->fetchOneByIdAndNetworkId($shared_feed_id, $currentUser->network_id);
642
                if (!$sharedFeed) {
643
                    return [
644
                        'status' => false,
645
                        'error' => 'ERROR_POST_SHARE',
646
                    ];
647
                }
648
 
649
                $feed->shared_feed_id       = $sharedFeed->id;
650
                $feed->shared_company_id    = $sharedFeed->shared_company_id;
651
                $feed->shared_group_id      = $sharedFeed->shared_group_id;
652
                $feed->shared_job_id        = $sharedFeed->shared_job_id;
653
            } else {
654
                $sharedFeed = null;
655
            }
656
 
657
            $feed->status = Feed::STATUS_PUBLISHED;
658
            $feed->total_comments    = 0;
659
            $feed->total_shared     = 0;
660
 
661
 
662
            $files = $this->getRequest()->getFiles()->toArray();
663
            $file_type = '';
664
 
283 www 665
            if (isset($files['file']) && empty($files['file']['error'])) {
666
                $feed_tmp_filename  = $files['file']['tmp_name'];
667
                $feed_filename      = $this->normalizeString($files['file']['name']);
1 efrain 668
 
283 www 669
                $mime_type = mime_content_type($feed_tmp_filename);
1 efrain 670
 
671
 
283 www 672
                if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
673
                    $file_type = Feed::FILE_TYPE_IMAGE;
674
                } else if ($mime_type ==  'video/quicktime' ||  $mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
675
                    $file_type = Feed::FILE_TYPE_VIDEO;
676
                } else if ($mime_type == 'application/pdf') {
677
                    $file_type = Feed::FILE_TYPE_DOCUMENT;
1 efrain 678
                }
679
            }
680
 
681
 
682
            $result = $feedMapper->insert($feed);
683
            if ($result) {
684
 
685
                if ($sharedFeed && $sharedFeed->type == Feed::TYPE_UPDATE) {
686
 
687
 
688
                    $userMapper = UserMapper::getInstance($this->adapter);
689
                    $ownerFeed = $userMapper->fetchOne($sharedFeed->user_id);
690
 
691
                    $notification = new Notification();
692
                    $notification->type     = Notification::TYPE_SHARE_MY_FEED;
693
                    $notification->read     = Notification::NO;
694
                    $notification->user_id  = $ownerFeed->id;
695
                    $notification->feed_id = $feed->id;
696
                    $notification->message  = 'LABEL_SHARE_MY_FEED';
697
                    $notification->url      = $this->url()->fromRoute('dashboard', ['feed' => $sharedFeed->uuid]);
698
 
699
                    $notificationMapper = NotificationMapper::getInstance($this->adapter);
700
                    $notificationMapper->insert($notification);
701
 
702
                    $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
703
                    $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
704
 
705
                    if ($userNotification && $userNotification->share_my_feed) {
706
                        $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
707
                        $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_SHARE_MY_FEED, $currentUser->network_id);
708
 
709
                        if ($emailTemplate) {
710
                            $arrayCont = [
711
                                'firstname'             => $currentUser->first_name,
712
                                'lastname'              => $currentUser->last_name,
713
                                'other_user_firstname'  => $ownerFeed->first_name,
714
                                'other_user_lastname'   => $ownerFeed->last_name,
715
                                'company_name'          => '',
716
                                'group_name'            => '',
717
                                'content'               => '',
718
                                'code'                  => '',
719
                                'link'                  => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])
720
                            ];
721
 
722
                            $email = new QueueEmail($this->adapter);
723
                            $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
724
                        }
725
                    }
726
                }
727
 
728
 
729
                $feed = $feedMapper->fetchOne($feed->id);
730
 
731
                if ($file_type == Feed::FILE_TYPE_DOCUMENT) {
283 www 732
                    $storage = Storage::getInstance($this->config);
733
                    $target_path = $storage->getPathFeed();
734
 
735
                    if ($storage->putFile($target_path, $feed->uuid, $feed_filename)) {
736
                        $feed->file_type = $file_type;
737
                        $feed->file_name = $feed_filename;
738
                        $feedMapper->update($feed);
1 efrain 739
                    }
283 www 740
 
741
                } else if ($file_type == Feed::FILE_TYPE_IMAGE) {
742
                    $image = Image::getInstance($this->config);
743
                    $target_path = $image->getStorage()->getPathFeed();
1 efrain 744
 
283 www 745
                    list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
1 efrain 746
 
283 www 747
 
748
                    $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
749
                    $crop_to_dimensions = false;
750
                    $unlink_source = true;
751
 
752
                    if(!$image->uploadImageChangeSize($feed_tmp_filename, $target_path, $feed->uuid, $feed_filename, $target_width, $target_height, $crop_to_dimensions, $unlink_source)) {
753
                        $feed->file_type = $file_type;
754
                        $feed->file_name = $feed_filename;
755
                        $feedMapper->update($feed);
1 efrain 756
                    }
757
                }
758
                if ($file_type == Feed::FILE_TYPE_VIDEO) {
759
                    try {
283 www 760
 
761
                        $full_filename = sys_get_temp_dir() . DIRECTORY_SEPARATOR . $feed_filename;
762
                        rename($feed_tmp_filename, $full_filename);
1 efrain 763
 
283 www 764
                        //extracción del cover
765
                        $generate_filename = substr($feed_filename, 0, strrpos($feed_filename, '.')).  '.jpg';
766
                        $generate_full_filename =  sys_get_temp_dir()  . DIRECTORY_SEPARATOR . $generate_filename;
767
 
768
 
769
                        $cmd        = "/usr/bin/ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width,duration  $full_filename";
770
                        $response   = trim(shell_exec($cmd));
1 efrain 771
 
283 www 772
                        $source_duration = 0;
773
                        $lines = explode("\n", $response);
774
                        foreach ($lines as $line) {
775
                            $line = trim(strtolower($line));
776
                            if (strpos($line, 'duration') !== false) {
777
                                $values = explode('=', $line);
778
                                $source_duration = intval(str_replace($values[1], '#', ''), 10);
779
                            }
1 efrain 780
                        }
781
 
782
 
283 www 783
                        if ($source_duration == 0) {
784
                            $second_extract = '00:00:02';
785
                        } else {
786
                            if ($source_duration > 10) {
787
                                $second_extract = '00:00:10';
788
                            } else {
1 efrain 789
                                $second_extract = '00:00:02';
790
                            }
283 www 791
                        }
1 efrain 792
 
283 www 793
                        //$imageSize = $this->config['leaderslinked.image_sizes.feed_image_size'];
1 efrain 794
 
283 www 795
                        //$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";
796
                        // $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";
797
                        $cmd = "/usr/bin/ffmpeg -y -i $full_filename  -pix_fmt yuvj422p -an -ss $second_extract -f mjpeg -t 1 -r 1 -y  $generate_full_filename";
798
                        exec($cmd);
799
 
800
                        $storage = Storage::getInstance($this->config);
801
                        $target_path = $storage->getPathFeed();
802
 
803
                        if($storage->putFile($target_path, $feed->uuid, $generate_full_filename) || $storage->putFile($target_path, $feed->uuid, $full_filename)) {
1 efrain 804
 
805
 
283 www 806
                            $feed->file_type            = $file_type;
807
                            $feed->file_name            = $feed_filename;
808
                            $feed->file_image_preview   = $generate_filename;
1 efrain 809
                            $feedMapper->update($feed);
810
 
811
                            $videoConvert = new VideoConvert();
812
                            $videoConvert->filename = $full_filename;
813
                            $videoConvert->type = VideoConvert::TYPE_FEED;
814
 
815
                            $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
816
                            $videoConvertMapper->insert($videoConvert);
817
                        }
283 www 818
 
819
                        @unlink($full_filename);
820
                        @unlink($generate_full_filename);
821
 
822
 
1 efrain 823
                    } catch (\Throwable $e) {
824
                        error_log($e->getTraceAsString());
825
                    }
826
                }
827
 
828
 
829
                return [
830
                    'success'   => true,
831
                    'data'   => $this->renderFeed($feed->id, $now)
832
                ];
833
            } else {
834
                return [
835
                    'success'   => false,
836
                    'data'   => $feedMapper->getError()
837
                ];
838
            }
839
        } else {
840
            $messages = [];
841
            $form_messages = (array) $form->getMessages();
842
            foreach ($form_messages  as $fieldname => $field_messages) {
843
                $messages[$fieldname] = array_values($field_messages);
844
            }
845
 
846
            return [
847
                'success'   => false,
848
                'data'   => $messages
849
            ];
850
        }
851
    }
852
 
853
    public function saveReactionAction()
854
    {
855
        $id = $this->params()->fromRoute('id');
856
       // $reaction  = $this->params()->fromRoute('reaction');
857
        $reaction  = $this->params()->fromPost('reaction');
858
 
859
        $request = $this->getRequest();
860
        if ($request->isPost()) {
861
            $currentUserPlugin = $this->plugin('currentUserPlugin');
862
            $currentUser = $currentUserPlugin->getUser();
863
 
864
 
865
            $feedMapper = FeedMapper::getInstance($this->adapter);
866
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
867
            if (!$feed) {
868
                $response = [
869
                    'success' => false,
870
                    'data' => 'ERROR_POST_NOT_FOUND'
871
                ];
872
                return new JsonModel($response);
873
            }
874
 
875
            $reactions = [
876
                ContentReaction::REACTION_RECOMMENDED,
877
                ContentReaction::REACTION_SUPPORT,
878
                ContentReaction::REACTION_LOVE,
879
                ContentReaction::REACTION_INTEREST,
880
                ContentReaction::REACTION_FUN
881
 
882
            ];
883
            if(!in_array($reaction, $reactions)) {
884
                $response = [
885
                    'success' => false,
886
                    'data' => 'ERROR_REACTION_NOT_FOUND'
887
                ];
888
                return new JsonModel($response);
889
            }
890
 
891
 
892
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
893
            $contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
894
 
895
            if ($contentReaction) {
896
                $contentReaction->reaction = $reaction;
897
                $result = $contentReactionMapper->update($contentReaction);
898
            } else {
899
                $contentReaction = new ContentReaction();
900
                $contentReaction->user_id = $currentUser->id;
901
                $contentReaction->feed_id = $feed->id;
902
                $contentReaction->relational = ContentReaction::RELATIONAL_FEED;
903
                $contentReaction->reaction = $reaction;
904
 
905
                $result = $contentReactionMapper->insert($contentReaction);
906
            }
907
 
908
 
909
 
910
            if ($result) {
911
 
912
                $reactions = $contentReactionMapper->fetchCountByFeedId($feed->id);
913
                $response = [
914
                    'success' => true,
915
                    'data' => [
916
                        'reactions' => $reactions
917
                    ]
918
                ];
919
            } else {
920
                $response = [
921
                    'success' => false,
922
                    'data' => $contentReactionMapper->getError()
923
                ];
924
            }
925
            return new JsonModel($response);
926
        }
927
 
928
        $response = [
929
            'success' => false,
930
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
931
        ];
932
        return new JsonModel($response);
933
    }
934
 
935
    public function deleteReactionAction()
936
    {
937
        $id = $this->params()->fromRoute('id');
938
 
939
        $request = $this->getRequest();
940
        if ($request->isPost()) {
941
            $currentUserPlugin = $this->plugin('currentUserPlugin');
942
            $currentUser = $currentUserPlugin->getUser();
943
 
944
            $feedMapper = FeedMapper::getInstance($this->adapter);
945
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
946
            if (!$feed) {
947
                $response = [
948
                    'success' => false,
949
                    'data' => 'ERROR_POST_NOT_FOUND'
950
                ];
951
                return new JsonModel($response);
952
            }
953
 
954
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
955
            $contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
956
 
957
            if (!$contentReaction) {
958
                $response = [
959
                    'success' => false,
960
                    'data' => 'ERROR_DUPLICATE_ACTION'
961
                ];
962
                return new JsonModel($response);
963
            }
964
 
965
            if ($contentReactionMapper->deleteByFeedIdAndUserId($feed->id, $currentUser->id)) {
966
                $reactions = $contentReactionMapper->fetchCountByFeedId($feed->id);
967
 
968
 
969
                $response = [
970
                    'success' => true,
971
                    'data' => [
972
                        'reactions' => $reactions
973
                    ]
974
                ];
975
            } else {
976
                $response = [
977
                    'success' => false,
978
                    'data' => $contentReactionMapper->getError()
979
                ];
980
            }
981
            return new JsonModel($response);
982
        }
983
 
984
        $response = [
985
            'success' => false,
986
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
987
        ];
988
        return new JsonModel($response);
989
    }
990
 
991
    /*
992
    public function likeAction()
993
    {
994
        $id = $this->params()->fromRoute('id');
995
 
996
        $request = $this->getRequest();
997
        if ($request->isPost()) {
998
            $currentUserPlugin = $this->plugin('currentUserPlugin');
999
            $currentUser = $currentUserPlugin->getUser();
1000
 
1001
 
1002
            $feedMapper = FeedMapper::getInstance($this->adapter);
1003
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1004
            if (!$feed) {
1005
                $response = [
1006
                    'success' => false,
1007
                    'data' => 'ERROR_POST_NOT_FOUND'
1008
                ];
1009
                return new JsonModel($response);
1010
            }
1011
 
1012
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1013
            $contentReaction =  $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1014
 
1015
            if ($contentReaction) {
1016
                $response = [
1017
                    'success' => false,
1018
                    'data' => 'ERROR_DUPLICATE_ACTION'
1019
                ];
1020
                return new JsonModel($response);
1021
            }
1022
 
1023
            $contentReaction = new Like();
1024
            $contentReaction->user_id = $currentUser->id;
1025
            $contentReaction->feed_id = $feed->id;
1026
            $contentReaction->relational = Like::RELATIONAL_FEED;
1027
 
1028
            if ($contentReactionMapper->insert($contentReaction)) {
1029
 
1030
                $contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);
1031
 
1032
 
1033
 
1034
                if ($feed->type == Feed::TYPE_UPDATE) {
1035
 
1036
 
1037
                    $userMapper = UserMapper::getInstance($this->adapter);
1038
                    $ownerFeed = $userMapper->fetchOne($feed->user_id);
1039
 
1040
                    $notification = new Notification();
1041
                    $notification->type     = Notification::TYPE_LIKE_MY_FEED;
1042
                    $notification->read     = Notification::NO;
1043
                    $notification->user_id  = $feed->user_id;
1044
                    $notification->feed_id  = $feed->id;
1045
                    $notification->message  = 'LABEL_LIKE_MY_FEED';
1046
                    $notification->url      = $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid]);
1047
 
1048
                    $notificationMapper = NotificationMapper::getInstance($this->adapter);
1049
                    $notificationMapper->insert($notification);
1050
 
1051
                    $userNotificationMapper = UserNotificationSettingMapper::getInstance($this->adapter);
1052
                    $userNotification = $userNotificationMapper->fetchOne($ownerFeed->id);
1053
 
1054
                    if ($userNotification && $userNotification->like_my_feed) {
1055
                        $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
1056
                        $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_LIKE_MY_FEED, $currentUser->network_id);
1057
 
1058
                        if ($emailTemplate) {
1059
                            $arrayCont = [
1060
                                'firstname'             => $currentUser->first_name,
1061
                                'lastname'              => $currentUser->last_name,
1062
                                'other_user_firstname'  => $ownerFeed->first_name,
1063
                                'other_user_lastname'   => $ownerFeed->last_name,
1064
                                'company_name'          => '',
1065
                                'group_name'            => '',
1066
                                'content'               => '',
1067
                                'code'                  => '',
1068
                                'link'                  => $this->url()->fromRoute('dashboard', ['feed' => $feed->uuid], ['force_canonical' => true])
1069
                            ];
1070
 
1071
                            $email = new QueueEmail($this->adapter);
1072
                            $email->processEmailTemplate($emailTemplate, $arrayCont, $ownerFeed->email, trim($ownerFeed->first_name . ' ' . $ownerFeed->last_name));
1073
                        }
1074
                    }
1075
                }
1076
 
1077
 
1078
 
1079
 
1080
 
1081
 
1082
 
1083
 
1084
                $response = [
1085
                    'success' => true,
1086
                    'data' => [
1087
                        'likes' => $contentReactions
1088
                    ]
1089
                ];
1090
            } else {
1091
                $response = [
1092
                    'success' => false,
1093
                    'data' => $contentReactionMapper->getError()
1094
                ];
1095
            }
1096
            return new JsonModel($response);
1097
        }
1098
 
1099
        $response = [
1100
            'success' => false,
1101
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1102
        ];
1103
        return new JsonModel($response);
1104
    }
1105
 
1106
    public function unlikeAction()
1107
    {
1108
        $id = $this->params()->fromRoute('id');
1109
 
1110
        $request = $this->getRequest();
1111
        if ($request->isPost()) {
1112
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1113
            $currentUser = $currentUserPlugin->getUser();
1114
 
1115
            $feedMapper = FeedMapper::getInstance($this->adapter);
1116
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1117
            if (!$feed) {
1118
                $response = [
1119
                    'success' => false,
1120
                    'data' => 'ERROR_POST_NOT_FOUND'
1121
                ];
1122
                return new JsonModel($response);
1123
            }
1124
 
1125
            $contentReactionMapper = LikeMapper::getInstance($this->adapter);
1126
            $contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1127
 
1128
            if (!$contentReaction) {
1129
                $response = [
1130
                    'success' => false,
1131
                    'data' => 'ERROR_DUPLICATE_ACTION'
1132
                ];
1133
                return new JsonModel($response);
1134
            }
1135
 
1136
            if ($contentReactionMapper->deleteByFeedIdAndUserId($feed->id, $currentUser->id)) {
1137
                $contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);
1138
 
1139
 
1140
                $response = [
1141
                    'success' => true,
1142
                    'data' => [
1143
                        'likes' => $contentReactions
1144
                    ]
1145
                ];
1146
            } else {
1147
                $response = [
1148
                    'success' => false,
1149
                    'data' => $contentReactionMapper->getError()
1150
                ];
1151
            }
1152
            return new JsonModel($response);
1153
        }
1154
 
1155
        $response = [
1156
            'success' => false,
1157
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1158
        ];
1159
        return new JsonModel($response);
1160
    }*/
1161
 
1162
    public function timelineAction()
1163
    {
1164
 
1165
 
192 efrain 1166
 
1167
 
1168
 
1 efrain 1169
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1170
        $currentUser = $currentUserPlugin->getUser();
1171
 
1172
 
1173
        $type   = $this->params()->fromRoute('type');
1174
        if ($type == 'user') {
1175
            $id = $currentUser->id;
1176
        } else {
1177
            $id     = $this->params()->fromRoute('id');
1178
        }
1179
 
1180
        $feedHighlighted = 0;
1181
        $feedUuid = $this->params()->fromRoute('feed');
1182
 
1183
 
1184
 
1185
        if ($feedUuid) {
1186
            $feedMapper = FeedMapper::getInstance($this->adapter);
1187
            $now = $feedMapper->getDatebaseNow();
1188
 
1189
            $feed = $feedMapper->fetchOneByUuidAndNetworkIdAnyStatus($feedUuid, $currentUser->network_id);
1190
 
1191
            if ($feed) {
1192
                $feedHighlighted = $feed->id;
1193
            }
1194
        }
1195
 
1196
 
1197
 
1198
        $request = $this->getRequest();
1199
        if ($request->isGet()) {
1200
 
192 efrain 1201
            $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
1202
            $user_blocked_ids = $userBlockedMapper->fetchAllBlockedReturnIds($currentUser->id);
1203
 
1204
            $abuseReportMapper = AbuseReportMapper::getInstance($this->adapter);
1205
            $abuse_report_feed_ids = $abuseReportMapper->fetchAllDataByUserReportingIdAndTypeReturnIds($currentUser->id, AbuseReport::TYPE_FEED);
1206
 
1207
            $abuse_report_comment_ids = $abuseReportMapper->fetchAllDataByUserReportingIdAndTypeReturnIds($currentUser->id, AbuseReport::TYPE_COMMENT);
1208
 
1209
 
1210
 
1 efrain 1211
            $exclude_feed_ids = [];
1212
 
1213
            $queryMapper = QueryMapper::getInstance($this->adapter);
1214
 
1215
            $selectNotUserCompany = $queryMapper->getSql()->select();
1216
            $selectNotUserCompany->columns(['company_id']);
1217
            $selectNotUserCompany->from(['cu' => CompanyUserMapper::_TABLE]);
1218
 
1219
            $selectNotUserCompany->where->equalTo('user_id', $currentUser->id);
1220
            $selectNotUserCompany->where->in('status', [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD]);
1221
 
1222
 
1223
 
1224
 
1225
 
1226
            $select = $queryMapper->getSql()->select();
1227
            $select->columns(['id']);
1228
            $select->from(['f' => FeedMapper::_TABLE]);
1229
            $select->join(['fs' => FastSurveyMapper::_TABLE], 'fs.id = f.fast_survey_id', []);
1230
            $select->where->equalTo('f.file_type', Feed::FILE_TYPE_FAST_SURVEY);
1231
            $select->where->equalTo('f.network_id', $currentUser->network_id);
1232
            $select->where->equalTo('f.status', Feed::STATUS_PUBLISHED);
1233
            $select->where->equalTo('fs.privacy', FastSurvey::PRIVACY_COMPANY);
1234
            $select->where->notIn('fs.company_id', $selectNotUserCompany);
1235
 
1236
            $records = $queryMapper->fetchAll($select);
1237
            foreach($records as $record)
1238
            {
1239
                array_push($exclude_feed_ids, $record['id']);
1240
            }
1241
 
1242
 
1243
            $page = (int) $this->params()->fromQuery('page');
1244
            if ($type == 'user') {
1245
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1246
                $now = $connectionMapper->getDatebaseNow();
1247
 
1248
                $records = $connectionMapper->fetchAllConnectionsByUser($id);
1249
                $connectionIds = [0];
1250
                foreach ($records as $record) {
1251
                    if ($currentUser->id == $record->request_from) {
1252
                        array_push($connectionIds, $record->request_to);
1253
                    } else {
1254
                        array_push($connectionIds, $record->request_from);
1255
                    }
1256
                }
1257
                array_push($connectionIds, 1);
1258
 
1259
                $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
1260
                $records = $companyFollowerMapper->fetchAllByFollowerId($currentUser->id);
1261
 
1262
                $companyIds = [0];
1263
                foreach ($records as $record) {
1264
                    if (!in_array($record->company_id, $companyIds)) {
1265
                        array_push($companyIds, $record->company_id);
1266
                    }
1267
                }
1268
 
1269
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1270
                $companyUsers = $companyUserMapper->fetchAllByUserId($currentUser->id);
1271
 
1272
                foreach ($companyUsers as $companyUser) {
1273
                    if ($companyUser->status == CompanyUser::STATUS_ACCEPTED) {
1274
                        if (!in_array($companyUser->company_id, $companyIds)) {
1275
                            array_push($companyIds, $companyUser->company_id);
1276
                        }
1277
                    }
1278
                }
1279
 
1280
 
1281
                $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1282
                $groupMembers = $groupMemberMapper->fetchAllByUserId($currentUser->id);
1283
 
1284
                $groupIds = [0];
1285
 
1286
                foreach ($groupMembers as $groupMember) {
1287
                    if ($groupMember->status == GroupMember::STATUS_ACCEPTED) {
1288
                        if (!in_array($groupMember->group_id, $groupIds)) {
1289
                            array_push($groupIds, $groupMember->group_id);
1290
                        }
1291
                    }
1292
                }
1293
 
1294
                $queryMapper = QueryMapper::getInstance($this->adapter);
1295
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1296
                $select->columns(['id']);
1297
                $select->where->equalTo('network_id', $currentUser->network_id);
1298
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED)
1299
                    ->AND->NEST
1300
                    ->OR->NEST->equalTo('user_id', $id)->and->equalTo('type', Feed::TYPE_UPDATE)->UNNEST
1301
                    ->OR->NEST->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_PUBLIC)->UNNEST
1302
                    ->OR->NEST->in('user_id', $connectionIds)->and->equalTo('type', Feed::TYPE_UPDATE)->and->equalTo('shared_with', Feed::SHARE_WITH_CONNECTIONS)->UNNEST
1303
                    ->OR->NEST->or->in('company_id', $companyIds)->and->equalTo('type', Feed::TYPE_COMPANY)->UNNEST
1304
                    ->OR->NEST->or->in('group_id', $groupIds)->and->equalTo('type', Feed::TYPE_GROUP)->UNNEST
1305
                    ->UNNEST;
1306
 
1307
                if($exclude_feed_ids) {
1308
                    $select->where->notIn('id', $exclude_feed_ids);
1309
                }
192 efrain 1310
                if($abuse_report_feed_ids) {
1311
                    $select->where->notIn('id', $abuse_report_feed_ids);
1312
                }
1313
                if($user_blocked_ids) {
1314
                    $select->where->notIn('user_id', $user_blocked_ids);
1315
                }
1 efrain 1316
 
1317
 
1318
                $select->order('added_on desc');
1319
            }
1320
            if ($type == 'company') {
1321
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1322
                $now = $companyMapper->getDatebaseNow();
1323
 
1324
                $company = $companyMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1325
 
1326
                if (!$company || $company->status != Company::STATUS_ACTIVE) {
1327
                    $id = 0;
1328
                } else {
1329
                    $companyFollowerMapper = CompanyFollowerMapper::getInstance($this->adapter);
1330
                    $companyFollower = $companyFollowerMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1331
                    if ($companyFollower) {
1332
                        $id = $company->id;
1333
                    } else {
1334
 
1335
                        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1336
                        $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($company->id, $currentUser->id);
1337
 
1338
                        if (!$companyUser || $companyUser->status != CompanyUser::STATUS_ACCEPTED) {
1339
                            $id = 0;
1340
                        } else {
1341
                            $id = $company->id;
1342
                        }
1343
                    }
1344
                }
1345
 
1346
 
1347
 
1348
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1349
                $select->columns(['id']);
1350
                $select->where->equalTo('network_id', $currentUser->network_id);
1351
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
1352
                $select->where->equalTo('company_id', $id);
1353
                $select->where->and->equalTo('type', Feed::TYPE_COMPANY);
1354
 
1355
                if($exclude_feed_ids) {
1356
                    $select->where->notIn('id', $exclude_feed_ids);
1357
                }
192 efrain 1358
                if($abuse_report_feed_ids) {
1359
                    $select->where->notIn('id', $abuse_report_feed_ids);
1360
                }
1361
                if($user_blocked_ids) {
1362
                    $select->where->notIn('user_id', $user_blocked_ids);
1363
                }
1 efrain 1364
 
1365
                $select->order('added_on desc');
1366
            }
1367
            if ($type == 'group') {
1368
                $groupMapper = GroupMapper::getInstance($this->adapter);
1369
                $now = $groupMapper->getDatebaseNow();
1370
 
1371
                $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
1372
 
1373
                $id = 0;
1374
 
1375
                if ($group && $group->status == Group::STATUS_ACTIVE) {
1376
                    $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
1377
                    $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
1378
                    if ($groupMember) {
1379
 
1380
 
1381
                        if (
1382
                            $groupMember->status == GroupMember::STATUS_ACCEPTED ||
1383
                            $groupMember->status == GroupMember::STATUS_AUTO_JOIN
1384
                        ) {
1385
 
1386
                            $id =  $groupMember->group_id;
1387
                        }
1388
                    }
1389
                }
1390
 
1391
                $queryMapper = QueryMapper::getInstance($this->adapter);
1392
                $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
1393
                $select->columns(['id']);
1394
                $select->where->equalTo('network_id', $currentUser->network_id);
1395
                $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
1396
                $select->where->equalTo('group_id', $id);
1397
                $select->where->nest()->equalTo('type', Feed::TYPE_GROUP)
1398
                ->or->equalTo('type', Feed::TYPE_UPDATE)->unnest();
1399
 
1400
                if($exclude_feed_ids) {
1401
                    $select->where->notIn('id', $exclude_feed_ids);
1402
                }
192 efrain 1403
                if($abuse_report_feed_ids) {
1404
                    $select->where->notIn('id', $abuse_report_feed_ids);
1405
                }
1406
                if($user_blocked_ids) {
1407
                    $select->where->notIn('user_id', $user_blocked_ids);
1408
                }
1 efrain 1409
 
1410
                $select->order('added_on desc');
1411
            }
1412
 
1413
            $dbSelect = new DbSelect($select, $this->adapter);
1414
            $paginator = new Paginator($dbSelect);
1415
            $paginator->setCurrentPageNumber($page ? $page : 1);
1416
            $paginator->setItemCountPerPage(10);
1417
 
1418
            $items = [];
1419
 
1420
 
1421
            if ($feedHighlighted) {
1422
 
1423
 
192 efrain 1424
                $items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted,  $user_blocked_ids , $abuse_report_comment_ids);
1 efrain 1425
            }
1426
 
1427
            $feeds = $paginator->getCurrentItems();
1428
            foreach ($feeds as $feed) {
192 efrain 1429
                $items[] = $this->renderFeed($feed->id, $now, $feedHighlighted,  $user_blocked_ids , $abuse_report_comment_ids);
1 efrain 1430
            }
1431
 
1432
            $response = [
1433
                'success' => true,
1434
                'data' => [
1435
                    'total' => [
1436
                        'count' => $paginator->getTotalItemCount(),
1437
                        'pages' => $paginator->getPages()->pageCount,
1438
                    ],
1439
                    'current' => [
1440
                        'items'    => $items,
1441
                        'page'     => $paginator->getCurrentPageNumber(),
1442
                        'count'    => $paginator->getCurrentItemCount(),
1443
                    ]
1444
                ]
1445
            ];
1446
 
1447
 
1448
 
1449
            /*
1450
            if($feedHighlighted) {
1451
 
1452
 
1453
                $items[] = $this->renderFeed($feedHighlighted, $now, $feedHighlighted);
1454
 
1455
                $response = [
1456
                    'success' => true,
1457
                    'data' => [
1458
                        'total' => [
1459
                            'count' => 1,
1460
                            'pages' => 1,
1461
                        ],
1462
                        'current' => [
1463
                            'items'    => $items,
1464
                            'page'     => 1,
1465
                            'count'    => 1,
1466
                        ]
1467
                    ]
1468
                ];
1469
            } else {
1470
 
1471
 
1472
 
1473
                $feeds = $paginator->getCurrentItems();
1474
                foreach($feeds as $feed)
1475
                {
1476
                    $items[] = $this->renderFeed($feed->id, $now, $feedHighlighted);
1477
                }
1478
 
1479
                $response = [
1480
                    'success' => true,
1481
                    'data' => [
1482
                        'total' => [
1483
                            'count' => $paginator->getTotalItemCount(),
1484
                            'pages' => $paginator->getPages()->pageCount,
1485
                        ],
1486
                        'current' => [
1487
                            'items'    => $items,
1488
                            'page'     => $paginator->getCurrentPageNumber(),
1489
                            'count'    => $paginator->getCurrentItemCount(),
1490
                        ]
1491
                    ]
1492
                ];
1493
            }*/
1494
 
1495
 
1496
 
1497
            return new JsonModel($response);
1498
        }
1499
 
1500
        $response = [
1501
            'success' => false,
1502
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1503
        ];
1504
 
1505
 
1506
        return new JsonModel($response);
1507
    }
1508
 
1509
    /**
1510
     *
1511
     * @param string $str
1512
     * @return string
1513
     */
1514
    private function normalizeString($str = '')
1515
    {
1516
        $basename  = substr($str, 0, strrpos($str, '.'));
1517
        $basename  = str_replace('.', '-', $basename);
1518
 
1519
        $extension  = substr($str, strrpos($str, '.'));
1520
 
1521
        $str = $basename . $extension;
1522
 
1523
        $str = strip_tags($str);
1524
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
1525
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
1526
        $str = strtolower($str);
1527
        $str = html_entity_decode($str, ENT_QUOTES, "utf-8");
1528
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
1529
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
1530
        $str = str_replace(' ', '-', $str);
1531
        $str = rawurlencode($str);
1532
        $str = str_replace('%', '-', $str);
1533
        return trim(strtolower($str));
1534
    }
1535
 
1536
 
1537
 
1538
    /**
1539
     *
1540
     * @param int $feed_id
192 efrain 1541
     * @param int[] $user_blocked_ids
1542
     * @param int[] $abuse_report_comment_ids
1 efrain 1543
     * @return array
1544
     */
192 efrain 1545
    private function renderFeed($feed_id, $now, $feedHighlighted = 0,  $user_blocked_ids  = [], $abuse_report_comment_ids = [])
1 efrain 1546
    {
283 www 1547
 
1 efrain 1548
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1549
        $currentUser = $currentUserPlugin->getUser();
1550
 
1551
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1552
        $network = $currentNetworkPlugin->getNetwork();
1553
 
1554
        //$currentCompany = $currentUserPlugin->getCompany();
1555
 
1556
        //$acl = $this->getEvent()->getViewModel()->getVariable('acl');
1557
 
1558
        $userMapper = UserMapper::getInstance($this->adapter);
1559
        $feedMapper = FeedMapper::getInstance($this->adapter);
1560
        $feed = $feedMapper->fetchOneAnyStatus($feed_id);
1561
 
1562
 
1563
 
1564
 
1565
        /*
1566
        $contentReactionMapper = LikeMapper::getInstance($this->adapter);
1567
        $contentReaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1568
        $contentReactions = $contentReactionMapper->fetchCountLikeByFeedId($feed->id);
1569
        */
1570
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1571
        $reactions = $contentReactionMapper->fetchCountByFeedId($feed->id);
1572
        $reaction = $contentReactionMapper->fetchOneByFeedIdAndUserId($feed->id, $currentUser->id);
1573
 
1574
 
1575
        $params = [
1576
            'id' => $feed->uuid
1577
        ];
1578
        if ($feed->company_id) {
1579
            $companyMapper = CompanyMapper::getInstance($this->adapter);
1580
            $company = $companyMapper->fetchOne($feed->company_id);
1581
 
1582
            $params['company_id'] = $company->uuid;
1583
        } else {
1584
            $company = null;
1585
        }
1586
        if ($feed->group_id) {
1587
            $groupMapper = GroupMapper::getInstance($this->adapter);
1588
            $group = $groupMapper->fetchOne($feed->group_id);
1589
 
1590
            $params['group_id'] = $group->uuid;
1591
        } else {
1592
            $group = null;
1593
        }
1594
 
1595
 
1596
        $timestamp = time();
1597
 
1598
        list($usec, $sec) = explode(' ', microtime());
1599
        $seed = intval($sec + ((float) $usec * 100000));
1600
        mt_srand($seed, MT_RAND_MT19937);
1601
        $rand =  mt_rand();
1602
 
1603
 
1604
 
1605
        $password  = md5('user-' . $currentUser->uuid . '-feed-' . $feed->uuid . '-timestamp-' . $timestamp . '-rand-' . $rand . '-share-key-' . $currentUser->share_key);
1606
 
1607
 
1608
        $share_params = [
1609
            'type' => 'feed',
1610
            'code' => $feed->uuid,
1611
            'user' => $currentUser->uuid,
1612
            'timestamp' => $timestamp,
1613
            'rand' => $rand,
1614
            'password' => $password,
1615
        ];
1616
 
1617
 
1618
        $share_increment_external_counter_url = $this->url()->fromRoute('share/increment-external-counter', $share_params, ['force_canonical' => true]);
1619
 
1620
 
1621
        $share_external_url = $this->url()->fromRoute('shorter/generate', ['code' => $feed->uuid, 'type' => 'feed'], ['force_canonical' => true]);
1622
 
1623
        $item = [
1624
            'feed_unique' => uniqid(),
1625
            'feed_uuid' => $feed->uuid,
1626
            'feed_my_reaction' => $reaction ? $reaction->reaction : '',
1627
            'feed_delete_url' =>  '',
1628
            'feed_content_type' => $feed->file_type ? $feed->file_type : '',
1629
            'feed_reactions' => $reactions,
232 efrain 1630
            'feed_reactions_url' =>  $this->url()->fromRoute('feed/reactions', ['id' => $feed->uuid], ['force_canonical' => true]),
192 efrain 1631
            'feed_save_reaction_url' =>  $this->url()->fromRoute('feed/save-reaction', ['id' => $feed->uuid], ['force_canonical' => true]),
1 efrain 1632
            'feed_highlighted' => $feed->id == $feedHighlighted ? 1 : 0,
192 efrain 1633
            'feed_abuse_report_url' => $feed->user_id == $currentUser->id ? '' : $this->url()->fromRoute('helpers/abuse-report', ['type' => 'feed', 'id' => $feed->uuid], ['force_canonical' => true]),
1 efrain 1634
            //'is_liked' => $contentReaction ? 1 : 0,
1635
            //'like_url' => $this->url()->fromRoute('post/like', ['id' => $post->uuid]),
1636
            //'unlike_url' => $this->url()->fromRoute('post/unlike', ['id' => $post->uuid]),
1637
 
1638
        ];
1639
 
1640
        $fastSurveyVote =  '';
1641
        if($feed->file_type == Feed::FILE_TYPE_FAST_SURVEY) {
1642
 
1643
            $fastSurveyVoteMapper = FastSurveyVoteMapper::getInstance($this->adapter);
1644
            $fastSurveyVote =  $fastSurveyVoteMapper->fetchOneByFastSurveyIdAndUserId($feed->fast_survey_id, $currentUser->id);
1645
 
1646
 
1647
 
1648
            $item['feed_save_reaction_url'] = '';
1649
            $item['feed_delete_reaction_url'] =  '';
1650
            $item['feed_share_url'] = '';
1651
            $item['feed_share_external_url'] = '';
1652
            $item['feed_increment_external_counter_url'] = '';
1653
 
1654
            $item['feed_vote_url'] = $fastSurveyVote ? '' : $this->url()->fromRoute('feed/vote',  ['id' => $feed->uuid]);
1655
 
1656
        } else {
247 efrain 1657
            $item['feed_save_reaction_url'] =  $this->url()->fromRoute('feed/save-reaction',  $params,  ['force_canonical' => true]);
1658
            $item['feed_delete_reaction_url'] =  $this->url()->fromRoute('feed/delete-reaction',  $params,  ['force_canonical' => true]);
1659
            $item['feed_share_url'] = $this->url()->fromRoute('feed/share',  $params,  ['force_canonical' => true]);
1 efrain 1660
            $item['feed_share_external_url'] = $share_external_url;
1661
            $item['feed_increment_external_counter_url'] = $share_increment_external_counter_url;
1662
            $item['feed_vote_url'] = '';
1663
        }
1664
 
1665
 
1666
        if ($feed->posted_or_shared == Feed::POSTED) {
1667
 
283 www 1668
            $storage = Storage::getInstance($this->config);
1 efrain 1669
            if ($feed->type == Feed::TYPE_COMPANY) {
283 www 1670
 
1671
 
1 efrain 1672
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1673
                $company = $companyMapper->fetchOne($feed->company_id);
283 www 1674
 
247 efrain 1675
                $item['owner_url'] = $this->url()->fromRoute('company/view', ['id' => $company->uuid],  ['force_canonical' => true]);
283 www 1676
                $item['owner_image'] = $storage->getCompanyImage($company);
1 efrain 1677
                $item['owner_name'] = $company->name;
283 www 1678
 
1 efrain 1679
            } else if ($feed->type == Feed::TYPE_GROUP) {
1680
                $groupMapper = GroupMapper::getInstance($this->adapter);
1681
                $group = $groupMapper->fetchOne($feed->group_id);
283 www 1682
 
1683
 
1 efrain 1684
                $item['owner_url'] = '';
283 www 1685
                $item['owner_image'] = $storage->getGroupImage($group);
1 efrain 1686
                $item['owner_name'] = $group->name;
1687
 
1688
                if ($group->user_id == $currentUser->id) {
247 efrain 1689
                    $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params,  ['force_canonical' => true]);
1 efrain 1690
                }
1691
            } else {
1692
                $userMapper = UserMapper::getInstance($this->adapter);
1693
                $user = $userMapper->fetchOne($feed->user_id);
283 www 1694
 
1695
 
1 efrain 1696
                $item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
283 www 1697
                $item['owner_image'] = $storage->getUserImage($user);
1 efrain 1698
                $item['owner_name'] = $user->first_name . ' ' . $user->last_name;
1699
 
1700
                if ($feed->user_id == $currentUser->id) {
247 efrain 1701
                    $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params,  ['force_canonical' => true]);
1 efrain 1702
                }
1703
            }
1704
        } else {
1705
            if ($feed->user_id == $currentUser->id) {
247 efrain 1706
                $item['feed_delete_url'] = $this->url()->fromRoute('feed/delete',  $params,  ['force_canonical' => true]);
1 efrain 1707
            }
1708
        }
1709
 
1710
        $userMapper = UserMapper::getInstance($this->adapter);
1711
        $user = $userMapper->fetchOne($feed->user_id);
192 efrain 1712
 
1713
 
1 efrain 1714
 
1715
        if ($feed->posted_or_shared == Feed::SHARED) {
283 www 1716
 
192 efrain 1717
            $item['owner_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid],['force_canonical' => true]);
283 www 1718
            $item['owner_image'] = $storage->getUserImage($user);
1 efrain 1719
            $item['owner_name'] = $user->first_name . ' ' . $user->last_name;
1720
        }
1721
 
1722
        if($feed->file_type == Feed::FILE_TYPE_FAST_SURVEY) {
1723
            $fastSurveyMapper = FastSurveyMapper:: getInstance($this->adapter);
1724
            $fastSurvey = $fastSurveyMapper->fetchOne($feed->fast_survey_id);
1725
 
1726
            $owner_description = [
1727
                'question' => $fastSurvey->question,
1728
                'number_of_answers' => $fastSurvey->number_of_answers,
1729
                'answer1' => $fastSurvey->answer1,
1730
                'answer2' => $fastSurvey->answer2,
1731
                'answer3' => $fastSurvey->answer3,
1732
                'answer4' => $fastSurvey->answer4,
1733
                'answer5' => $fastSurvey->answer5,
1734
                'result_type' => $fastSurvey->result_type,
1735
 
1736
            ];
1737
 
1738
            if($fastSurvey->expire_on > $now) {
1739
                $owner_description['active'] = $fastSurveyVote ? 0 : 1;
1740
                $owner_description['time_remaining'] =  Functions::getDateDiff($now, $fastSurvey->expire_on);
1741
 
1742
            } else {
1743
 
1744
 
1745
                $owner_description['active'] = 0;
1746
                $owner_description['time_remaining'] = 0;
1747
            }
1748
 
1749
            if($fastSurvey->result_type == FastSurvey::RESULT_TYPE_PUBLIC && $fastSurveyVote) {
1750
                $owner_description['votes1'] = $fastSurvey->votes1;
1751
                $owner_description['votes2'] = $fastSurvey->votes2;
1752
                $owner_description['votes3'] = $fastSurvey->votes3;
1753
                $owner_description['votes4'] = $fastSurvey->votes4;
1754
                $owner_description['votes5'] = $fastSurvey->votes5;
1755
            }
1756
 
1757
 
1758
 
1759
            $item['owner_description'] =  $owner_description;
1760
        } else {
1761
            $item['owner_description'] = $feed->description;
1762
        }
1763
        $item['owner_feed_type'] = $feed->type;
1764
 
1765
        $item['owner_shared'] = $feed->total_shared;
1766
        $item['owner_external_shared'] = $feed->total_external_shared;
1767
        $item['owner_comments'] = $feed->total_comments;
1768
 
1769
 
1770
        $item['owner_time_elapse'] = Functions::timeAgo($feed->added_on, $now);
1771
 
1772
        if ($feed->file_type == Feed::FILE_TYPE_IMAGE) {
283 www 1773
 
1774
            $path = $storage->getPathFeed();
1775
            $item['owner_file_image'] = $storage->getGenericImage($path,  $feed->uuid, $feed->file_name);
1 efrain 1776
        }
1777
        if ($feed->file_type == Feed::FILE_TYPE_DOCUMENT) {
283 www 1778
 
1779
            $path = $storage->getPathFeed();
1780
            $item['owner_file_document'] = $storage->getGenericFile($path,  $feed->uuid, $feed->file_name);
1 efrain 1781
        }
1782
        if ($feed->file_type == Feed::FILE_TYPE_VIDEO) {
283 www 1783
            $path = $storage->getPathFeed();
1784
            $item['owner_file_image_preview'] = $item['owner_file_image'] = $storage->getGenericImage($path,  $feed->uuid, $feed->file_image_preview);
1785
            $item['owner_file_video']  = $storage->getGenericFile($path,  $feed->uuid, $feed->file_name);
1 efrain 1786
        }
1787
 
1788
        if ($feed->posted_or_shared == Feed::SHARED) {
1789
            $sharedFeed = $feedMapper->fetchOneAnyStatus($feed->shared_feed_id);
1790
 
1791
            $item['shared_description'] = $sharedFeed->description;
1792
            $item['shared_time_elapse'] = Functions::timeAgo($sharedFeed->added_on, $now);
1793
 
1794
            if ($sharedFeed->file_type == Feed::FILE_TYPE_IMAGE) {
283 www 1795
                $path = $storage->getPathFeed();
1796
                $item['shared_file_image'] = $storage->getGenericImage($path, $sharedFeed->uuid, $sharedFeed->file_name);
1 efrain 1797
            }
1798
            if ($sharedFeed->file_type == Feed::FILE_TYPE_DOCUMENT) {
283 www 1799
                $path = $storage->getPathFeed();
1800
                $item['shared_file_document'] = $storage->getGenericFile($path, $sharedFeed->uuid, $sharedFeed->file_name);
1 efrain 1801
            }
1802
            if ($sharedFeed->file_type == Feed::FILE_TYPE_VIDEO) {
283 www 1803
                $path = $storage->getPathFeed();
1804
                $item['shared_file_image_preview'] = $storage->getGenericImage($path, $sharedFeed->uuid, $sharedFeed->file_image_preview);
1805
                $item['shared_file_video'] = $storage->getGenericFile($path, $sharedFeed->uuid, $sharedFeed->file_name);
1806
 
1 efrain 1807
            }
1808
 
1809
            $item['shared_content_type'] = $sharedFeed->file_type ? $sharedFeed->file_type : '';
1810
 
1811
            if ($feed->company_id) {
1812
 
1813
                $companyMapper = CompanyMapper::getInstance($this->adapter);
1814
                $sharedCompany = $companyMapper->fetchOne($feed->company_id);
283 www 1815
 
1816
 
1 efrain 1817
                $item['shared_url'] = $this->url()->fromRoute('company/view', ['id' => $sharedCompany->uuid]);
283 www 1818
                $item['shared_image'] = $storage->getCompanyImage($sharedCompany);
1 efrain 1819
                $item['shared_name'] = $sharedCompany->name;
1820
            } else if ($feed->group_id) {
1821
                $groupMapper = GroupMapper::getInstance($this->adapter);
1822
                $sharedGroup = $groupMapper->fetchOne($feed->group_id);
283 www 1823
 
1824
 
1 efrain 1825
                $item['shared_url'] = '';
283 www 1826
                $item['shared_image'] = $storage->getGroupImage($sharedGroup);
1 efrain 1827
                $item['shared_name'] = $sharedGroup->name;
1828
            } else {
1829
                $sharedUser = $userMapper->fetchOne($sharedFeed->user_id);
283 www 1830
 
1 efrain 1831
                $item['shared_url'] = $this->url()->fromRoute('profile/view', ['id' => $sharedUser->uuid]);
283 www 1832
                $item['shared_image'] = $storage->getUserImage($sharedUser);
1 efrain 1833
                $item['shared_name'] = $sharedUser->first_name . ' ' . $sharedUser->last_name;
1834
            }
1835
        }
1836
 
1837
 
1838
 
1839
        if($feed->file_type == Feed::FILE_TYPE_FAST_SURVEY) {
1840
            $item['comment_add_url'] = '';
1841
            $item['comments'] = [];
1842
        } else {
1843
 
283 www 1844
            $item['comment_add_url'] = $this->url()->fromRoute('feed/comment', ['id' => $feed->uuid],['force_canonical' => true]);
1 efrain 1845
            $item['comments'] = [];
1846
 
1847
            $commentMapper = CommentMapper::getInstance($this->adapter);
192 efrain 1848
            $records = $commentMapper->fetchAllPublishedByFeedId($feed->id , $user_blocked_ids, $abuse_report_comment_ids);
1 efrain 1849
 
1850
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
1851
            $owner = $companyUserMapper->fetchOwnerByCompanyId($feed->company_id);
1852
 
1853
            $comments = [];
1854
            foreach ($records as $record) {
1855
                $user = $userMapper->fetchOne($record->user_id);
1856
 
1857
 
1858
                if ($user->id == $currentUser->id) {
283 www 1859
                    $link_delete = $this->url()->fromRoute('feed/comment/delete', ['id' => $feed->uuid, 'comment' => $record->uuid],['force_canonical' => true]);
1 efrain 1860
                } else {
1861
                    $link_delete = '';
1862
                }
283 www 1863
 
1 efrain 1864
                array_push($comments , [
1865
                    'unique' => uniqid(),
283 www 1866
                    'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid],['force_canonical' => true]),
1 efrain 1867
                    'user_name' => $user->first_name . ' ' . $user->last_name,
1868
                    'company' => $owner,
283 www 1869
                    'user_image' => $storage->getUserImage($user),
1 efrain 1870
                    'time_elapsed' => Functions::timeAgo($record->added_on, $now),
1871
                    'comment' => $record->comment,
194 efrain 1872
                    'link_abuse_report' => $user->id == $currentUser->id ? '' : $this->url()->fromRoute('helpers/abuse-report', ['type' => 'comment', 'id' => $record->uuid], ['force_canonical' => true]),
1 efrain 1873
                    'link_delete' => $link_delete
1874
                ]);
1875
            }
1876
 
1877
            $item['comments'] = $comments;
1878
        }
1879
 
1880
 
1881
        return $item;
1882
    }
1883
 
1884
    /**
1885
     *
1886
     * @param int $comment_id
1887
     * @return array
1888
     */
1889
    private function renderComment($comment_id, $now)
1890
    {
192 efrain 1891
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1892
        $currentUser = $currentUserPlugin->getUser();
1893
 
1 efrain 1894
        $item = [];
1895
 
1896
        $commentMapper = CommentMapper::getInstance($this->adapter);
1897
        $record = $commentMapper->fetchOne($comment_id);
1898
 
1899
        $feedMapper = FeedMapper::getInstance($this->adapter);
1900
        $feed = $feedMapper->fetchOne($record->feed_id);
1901
 
1902
        if ($record) {
283 www 1903
            $storage = Storage::getInstance($this->config);
1904
 
1 efrain 1905
            $userMapper = UserMapper::getInstance($this->adapter);
1906
 
1907
            $user = $userMapper->fetchOne($record->user_id);
1908
 
1909
            $item['unique'] = uniqid();
283 www 1910
            $item['user_image'] = $storage->getUserImage($user);
1 efrain 1911
            $item['user_url'] = $this->url()->fromRoute('profile', ['id' => $user->uuid]);
1912
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1913
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1914
            $item['comment'] = $record->comment;
192 efrain 1915
            $item['link_abuse_report'] = $user->id == $currentUser ? '' : $this->url()->fromRoute('helpers/abuse-report', ['type' => 'comment', 'id' => $record->uuid], ['force_canonical' => true]);
1 efrain 1916
            $item['link_delete'] = $this->url()->fromRoute('feed/comment/delete', ['id' => $feed->uuid, 'comment' => $record->uuid]);
1917
        }
1918
        return $item;
1919
    }
1920
 
1921
    /**
1922
     *
1923
     * @param string $path
1924
     * @return boolean
1925
     */
1926
    private function deletePath($path)
1927
    {
1928
        try {
1929
            if (is_dir($path)) {
1930
                if ($dh = opendir($path)) {
1931
                    while (($file = readdir($dh)) !== false) {
1932
                        if ($file == '.' || $file == '..') {
1933
                            continue;
1934
                        }
1935
                        unlink($path . DIRECTORY_SEPARATOR . $file);
1936
                    }
1937
                    closedir($dh);
1938
                }
1939
 
1940
                rmdir($path);
1941
            }
1942
            return true;
1943
        } catch (\Throwable $e) {
1944
            error_log($e->getTraceAsString());
1945
            return false;
1946
        }
1947
    }
1948
 
1949
 
1950
    /**
1951
     *
1952
     * @param Feed $feed
1953
     * @return array
1954
     */
1955
    private function deleteFeed($feed)
1956
    {
1957
        $feedMapper = FeedMapper::getInstance($this->adapter);
1958
        $feed->status = Feed::STATUS_DELETED;
1959
        if ($feedMapper->update($feed)) {
1960
            $response = [
1961
                'success' => true,
1962
                'data' => 'LABEL_FEED_WAS_DELETED'
1963
            ];
1964
        } else {
1965
            $response = [
1966
                'success' => false,
1967
                'data' => $feedMapper->getError()
1968
            ];
1969
        }
1970
 
1971
 
1972
        /*$commentMapper = CommentMapper::getInstance($this->adapter);
1973
        if($commentMapper->deleteAllByFeedId($feed->id)) {
1974
            if($feedMapper->delete($feed->id)) {
1975
                $target_path = $this->config['leaderslinked.fullpath.feed'] . DIRECTORY_SEPARATOR . $feed->id;
1976
                if(file_exists($target_path)) {
1977
                    $this->deletePath($target_path);
1978
                }
1979
 
1980
                $response = [
1981
                    'success' => true,
1982
                    'data' => 'LABEL_FEED_WAS_DELETED'
1983
                ];
1984
 
1985
            } else {
1986
                $response = [
1987
                    'success' => false,
1988
                    'data' => $feedMapper->getError()
1989
                ];
1990
            }
1991
        } else {
1992
            $response = [
1993
                'success' => false,
1994
                'data' => $commentMapper->getError()
1995
            ];
1996
 
1997
        }*/
1998
 
1999
        return $response;
2000
    }
2001
 
2002
 
2003
    public function voteAction()
2004
    {
2005
        $id = $this->params()->fromRoute('id');
2006
 
2007
 
2008
        $request = $this->getRequest();
2009
        if ($request->isPost()) {
2010
 
2011
 
2012
 
2013
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2014
            $currentUser = $currentUserPlugin->getUser();
2015
 
2016
 
2017
            $feedMapper = FeedMapper::getInstance($this->adapter);
2018
            $feed = $feedMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
2019
            if (!$feed) {
2020
                $response = [
2021
                    'success' => false,
2022
                    'data' => 'ERROR_POST_NOT_FOUND'
2023
                ];
2024
                return new JsonModel($response);
2025
            }
2026
 
2027
 
2028
            if($feed->file_type != Feed::FILE_TYPE_FAST_SURVEY) {
2029
                $response = [
2030
                    'success' => false,
2031
                    'data' => 'ERROR_FAST_SURVEY_FEED_IS_NOT_FAST_SURVEY'
2032
                ];
2033
                return new JsonModel($response);
2034
            }
2035
 
2036
            $fastSurveyMapper = FastSurveyMapper::getInstance($this->adapter);
2037
            $fastSurvey = $fastSurveyMapper->fetchOne($feed->fast_survey_id);
2038
            if(!$fastSurvey) {
2039
                $response = [
2040
                    'success' => false,
2041
                    'data' => 'ERROR_FAST_SURVEY_NOT_FOUND'
2042
                ];
2043
                return new JsonModel($response);
2044
            }
2045
 
2046
            $now = $fastSurveyMapper->getDatebaseNow();
2047
            if($fastSurvey->expire_on <= $now) {
2048
                $response = [
2049
                    'success' => false,
2050
                    'data' => 'ERROR_FAST_SURVEY_IS_EXPIRED'
2051
                ];
2052
                return new JsonModel($response);
2053
            }
2054
 
2055
 
2056
            if($fastSurvey->privacy == FastSurvey::PRIVACY_COMPANY) {
2057
 
2058
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
2059
                $companyUser = $companyUserMapper->fetchOneByCompanyIdAndUserId($fastSurvey->company_id, $currentUser->id);
2060
                if(!$companyUser || !in_array($companyUser->status, [CompanyUser::STATUS_ACCEPTED, CompanyUser::STATUS_ADMIN_WILL_ADD])) {
2061
                    $response = [
2062
                        'success' => false,
2063
                        'data' => 'ERROR_FAST_SURVEY_UNAUTHORIZED'
2064
                    ];
2065
                    return new JsonModel($response);
2066
                }
2067
 
2068
            }
2069
 
2070
 
2071
 
2072
            $vote = intval($this->params()->fromPost('vote', 0), 10);
2073
            if($vote < 1 || $vote > 5 || $vote > $fastSurvey->number_of_answers) {
2074
                $response = [
2075
                    'success' => false,
2076
                    'data' => 'ERROR_FAST_SURVEY_VOTE_IS_INVALID'
2077
                ];
2078
                return new JsonModel($response);
2079
            }
2080
 
2081
            $fastSurveyVoteMapper = FastSurveyVoteMapper::getInstance($this->adapter);
2082
            $fastSurveyVote = $fastSurveyVoteMapper->fetchOneByFastSurveyIdAndUserId($fastSurvey->id, $currentUser->id);
2083
            if($fastSurveyVote) {
2084
                $response = [
2085
                    'success' => false,
2086
                    'data' => 'ERROR_FAST_SURVEY_VOTE_IS_ALREADY_FOUND'
2087
                ];
2088
                return new JsonModel($response);
2089
            }
2090
 
2091
            $fastSurveyVote = new FastSurveyVote();
2092
            $fastSurveyVote->fast_survey_id = $fastSurvey->id;
2093
            $fastSurveyVote->user_id = $currentUser->id;
2094
            $fastSurveyVote->vote = $vote;
2095
 
2096
 
2097
            if ($fastSurveyVoteMapper->insert($fastSurveyVote)) {
2098
 
2099
                $response = [
2100
                    'success'   => true,
2101
                    'data'   => $this->renderFeed($feed->id, $now)
2102
                ];
2103
            } else {
2104
                $response = [
2105
                    'success' => false,
2106
                    'data' => $fastSurveyVoteMapper->getError()
2107
                ];
2108
            }
2109
            return new JsonModel($response);
2110
        }
2111
 
2112
        $response = [
2113
            'success' => false,
2114
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
2115
        ];
2116
        return new JsonModel($response);
2117
    }
2118
}