Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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