Proyectos de Subversion LeadersLinked - Services

Rev

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