Proyectos de Subversion LeadersLinked - Services

Rev

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