Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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