Proyectos de Subversion LeadersLinked - Services

Rev

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