Proyectos de Subversion LeadersLinked - Services

Rev

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