Proyectos de Subversion LeadersLinked - Services

Rev

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

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