Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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