Proyectos de Subversion LeadersLinked - Services

Rev

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