Proyectos de Subversion LeadersLinked - Services

Rev

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