Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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