Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
/**
4
 *
5
 * Controlador: Mis Perfiles
6
 *
7
 */
8
 
9
declare(strict_types=1);
10
 
11
namespace LeadersLinked\Controller;
12
 
13
use Laminas\Db\Adapter\AdapterInterface;
14
 
15
use Laminas\Mvc\Controller\AbstractActionController;
16
use Laminas\Log\LoggerInterface;
17
use Laminas\View\Model\ViewModel;
18
 
19
use LeadersLinked\Mapper\GroupMapper;
20
use LeadersLinked\Mapper\GroupMemberMapper;
21
use LeadersLinked\Mapper\GroupTypeMapper;
22
use LeadersLinked\Model\Group;
23
use LeadersLinked\Model\GroupMember;
24
use LeadersLinked\Mapper\IndustryMapper;
25
use LeadersLinked\Form\Feed\CreateGroupCompanyForm;
26
use LeadersLinked\Form\Feed\ShareGroupCompanyForm;
27
use LeadersLinked\Mapper\UserBlockedMapper;
28
use LeadersLinked\Mapper\QueryMapper;
29
use LeadersLinked\Mapper\UserMapper;
30
use LeadersLinked\Mapper\UserProfileMapper;
31
use LeadersLinked\Model\User;
32
use Laminas\View\Model\JsonModel;
33
use LeadersLinked\Mapper\EmailTemplateMapper;
34
use LeadersLinked\Model\EmailTemplate;
35
use LeadersLinked\Mapper\UserNotificationSettingMapper;
36
use LeadersLinked\Library\QueueEmail;
37
use Laminas\Db\Sql\Expression;
38
use LeadersLinked\Model\Notification;
39
use LeadersLinked\Mapper\NotificationMapper;
40
use LeadersLinked\Library\Functions;
41
 
42
 
43
class GroupController extends AbstractActionController
44
{
45
    /**
46
     *
47
     * @var \Laminas\Db\Adapter\AdapterInterface
48
     */
49
    private $adapter;
50
 
51
    /**
52
     *
53
     * @var \LeadersLinked\Cache\CacheInterface
54
     */
55
    private $cache;
56
 
57
 
58
    /**
59
     *
60
     * @var \Laminas\Log\LoggerInterface
61
     */
62
    private $logger;
63
 
64
    /**
65
     *
66
     * @var array
67
     */
68
    private $config;
69
 
70
 
71
    /**
72
     *
73
     * @var \Laminas\Mvc\I18n\Translator
74
     */
75
    private $translator;
76
 
77
 
78
    /**
79
     *
80
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
81
     * @param \LeadersLinked\Cache\CacheInterface $cache
82
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
83
     * @param array $config
84
     * @param \Laminas\Mvc\I18n\Translator $translator
85
     */
86
    public function __construct($adapter, $cache, $logger, $config, $translator)
87
    {
88
        $this->adapter      = $adapter;
89
        $this->cache        = $cache;
90
        $this->logger       = $logger;
91
        $this->config       = $config;
92
        $this->translator   = $translator;
93
    }
94
 
95
    /**
96
     *
97
     * Generación del listado de perfiles
98
     * {@inheritDoc}
99
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
100
     */
101
    public function indexAction()
102
    {
103
 
104
        return new JsonModel([
105
            'success' => false,
106
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
107
        ]);
108
    }
109
 
110
 
111
    /**
112
     * Presenta el perfil con las opciónes de edición de cada sección
113
     * @return \Laminas\Http\Response|\Laminas\View\Model\ViewModel|\Laminas\View\Model\JsonModel
114
     */
115
    public function viewAction()
116
    {
117
 
118
 
119
 
120
        $currentUserPlugin = $this->plugin('currentUserPlugin');
121
        $currentUser = $currentUserPlugin->getUser();
122
 
123
        $flashMessenger = $this->plugin('FlashMessenger');
124
        $id = $this->params()->fromRoute('id');
125
 
126
 
127
        $request = $this->getRequest();
128
        if ($request->isGet()) {
129
 
130
            $flashMessenger = $this->plugin('FlashMessenger');
131
 
132
            if (!$id) {
133
                return new JsonModel([
134
                    'success' => false,
135
                    'data' => 'ERROR_INVALID_PARAMETER'
136
                ]);
137
            }
138
 
139
            $groupMapper = GroupMapper::getInstance($this->adapter);
140
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
141
 
142
            if (!$group) {
143
                return new JsonModel([
144
                    'success' => false,
145
                    'data' => 'ERROR_GROUP_NOT_FOUND'
146
                ]);
147
            }
148
 
149
            if ($group->status != Group::STATUS_ACTIVE) {
150
                return new JsonModel([
151
                    'success' => false,
152
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
153
                ]);
154
            }
155
 
156
            $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
157
            $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($group->user_id, $currentUser->id);
158
 
159
            if ($userBlocked) {
160
                $flashMessenger->addErrorMessage('ERROR_UNAUTHORIZED');
161
                return $this->redirect()->toRoute('dashboard');
162
            }
163
 
164
            $userMapper = UserMapper::getInstance($this->adapter);
165
            $ownerGroup = $userMapper->fetchOne($group->user_id);
166
 
167
            $values = [
168
                Group::ACCESSIBILITY_AUTO_JOIN => 'LABEL_AUTO_JOIN',
169
                Group::ACCESSIBILITY_REQUEST_TO_JOIN => 'LABEL_REQUEST_TO_JOIN',
170
                Group::ACCESSIBILITY_ADMIN_WILL_ADD => 'LABEL_ADMIN_WILL_ADD',
171
            ];
172
 
173
            $accessibility = $values[$group->accessibility];
174
 
175
            $values = [
176
                Group::PRIVACY_IS_PRIVATE => 'LABEL_PRIVATE',
177
                Group::PRIVACY_IS_PUBLIC => 'LABEL_PUBLIC'
178
            ];
179
 
180
            $privacy = $values[$group->privacy];
181
 
182
            $industryMapper = IndustryMapper::getInstance($this->adapter);
183
            $record = $industryMapper->fetchOne($group->industry_id);
184
 
185
            $industry = $record->name;
186
 
187
            $groupTypeMapper = GroupTypeMapper::getInstance($this->adapter);
188
            $record = $groupTypeMapper->fetchOne($group->type_id);
189
 
190
            $group_type = $record->name;
191
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
192
 
193
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $group->user_id);
194
            if ($groupMember) {
195
 
196
                if ($groupMember->status != GroupMember::STATUS_ACCEPTED) {
197
                    $groupMember->status = $groupMember::STATUS_ACCEPTED;
198
                    $groupMemberMapper->update($groupMember);
199
                }
200
            } else {
201
                $groupMember = new GroupMember();
202
                $groupMember->user_id = $group->user_id;
203
                $groupMember->group_id = $group->id;
204
                $groupMember->status = GroupMember::STATUS_ACCEPTED;
205
 
206
                $groupMemberMapper->insert($groupMember);
207
            }
208
 
209
 
210
            $total_members = $groupMemberMapper->fetchTotalByGroupId($group->id);
211
 
212
 
213
            $member = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
214
            $show_feeds = false;
215
            if ($member) {
216
                if ($member->status == GroupMember::STATUS_ACCEPTED || $member->status == GroupMember::STATUS_AUTO_JOIN) {
217
                    $show_feeds = true;
218
                }
219
            }
220
 
221
            $queryMapper = QueryMapper::getInstance($this->adapter);
222
            $select = $queryMapper->getSql()->select();
223
            $select->columns(['user_id' => 'id',  'user_uuid' => 'uuid', 'first_name', 'last_name', 'image']);
224
            $select->from(['u' => UserMapper::_TABLE]);
225
            $select->join(['tgm' => GroupMemberMapper::_TABLE], 'tgm.user_id = u.id', []);
226
            $select->join(['up' => UserProfileMapper::_TABLE], 'up.user_id = u.id', ['user_profile_id' => 'id', 'user_profile_uuid' => 'uuid']);
227
            $select->where->equalTo('u.status', User::STATUS_ACTIVE);
228
            $select->where->equalTo('tgm.status', GroupMember::STATUS_ACCEPTED);
229
 
230
            // echo $select->getSqlString($this->adapter->platform); exit;
231
 
232
            $members = [];
233
 
234
            $records = $queryMapper->fetchAll($select);
235
            foreach ($records as $record) {
236
                $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($record['user_id'], $currentUser->id);
237
 
238
                array_push($members, [
239
                    'name' => trim($record['first_name'] . ' ' . $record['last_name']),
60 efrain 240
                    'image' => $this->url()->fromRoute('storage', ['code' => $record['user_uuid'], 'type' => 'user', 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 241
                    'link_profile' => $userBlocked ? '' : $this->url()->fromRoute('profile/view', ['id' => $record['user_profile_uuid']])
242
 
243
                ]);
244
            }
245
 
246
 
247
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
248
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
249
 
250
            $data = [
251
                'total_members'         => $total_members,
252
                'accessibility'         => $accessibility,
253
                'privacy'               => $privacy,
254
                'industry'              => $industry,
255
                'group_id'              => $group->id,
256
                'group_type'            => $group_type,
257
                'group_uuid'            => $group->uuid,
258
                'name'                  => trim($group->name),
259
                'image'                 => $group->image,
260
                'cover'                 => $group->cover,
261
                'overview'              => $group->description,
262
                'website'               => $group->website,
263
                'members'               => $members,
264
                'link_inmail'           => $ownerGroup->id != $currentUser->id ?  $this->url()->fromRoute('inmail', ['id' => $ownerGroup->uuid]) : '',
265
                'link_request' => '',
266
                'link_accept' => '',
267
                'link_cancel' => '',
268
                'link_leave' => '',
269
                'link_timeline' => '',
270
            ];
271
 
272
 
273
 
274
            if ($groupMember) {
275
                if ($ownerGroup->id != $groupMember->user_id && $groupMember->status == GroupMember::STATUS_ACCEPTED || $groupMember->status == GroupMember::STATUS_AUTO_JOIN) {
276
                    $data['link_leave'] = $this->url()->fromRoute('group/leave', ['id' => $group->uuid]);
277
                    $data['link_timeline'] = $this->url()->fromRoute('feed/timeline', ['id' => $group->uuid, 'type' => 'group']);
278
                }
279
                if ($groupMember->status == GroupMember::STATUS_ADDED_BY_ADMIN) {
280
                    $data['link_accept'] = $this->url()->fromRoute('group/accept', ['id' => $group->uuid]);
281
                    $data['link_cancel'] = $this->url()->fromRoute('group/cancel', ['id' => $group->uuid]);
282
                }
283
                if ($groupMember->status == GroupMember::STATUS_JOINING_REQUESTED) {
284
                    $data['link_cancel'] = $this->url()->fromRoute('group/cancel', ['id' => $group->uuid]);
285
                }
286
                if (in_array($group->accessibility, [Group::ACCESSIBILITY_AUTO_JOIN, Group::ACCESSIBILITY_REQUEST_TO_JOIN]) && $groupMember->status == GroupMember::STATUS_CANCELLED) {
287
 
288
                    $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
289
                    $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($group->id, $currentUser->id);
290
 
291
                    if (!$userBlocked) {
292
                        $data['link_request'] = $this->url()->fromRoute('group/request', ['id' => $group->uuid]);;
293
                    }
294
                }
295
            } else {
296
 
297
                if (in_array($group->accessibility, [Group::ACCESSIBILITY_AUTO_JOIN, Group::ACCESSIBILITY_REQUEST_TO_JOIN])) {
298
 
299
                    $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
300
                    $userBlocked = $userBlockedMapper->fetchOneByUserIdAndBlockedId($group->id, $currentUser->id);
301
 
302
                    if (!$userBlocked) {
303
                        $data['link_request'] = $this->url()->fromRoute('group/request', ['id' => $group->uuid]);;
304
                    }
305
                }
306
            }
307
 
308
 
309
            return new JsonModel([
310
                'success'   => true,
311
                'data'      => $data
312
            ]);
313
 
314
 
315
            //$notificationMapper = NotificationMapper::getInstance($this->adapter);
316
            //$notificationMapper->markAllNotificationsAsReadByUserIdAndGroupId($currentUser->id, $group->id);
317
 
318
 
319
 
320
        } else {
321
            return new JsonModel([
322
                'success' => false,
323
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
324
            ]);
325
        }
326
    }
327
 
328
    public function leaveAction()
329
    {
330
        $flashMessenger = $this->plugin('FlashMessenger');
331
        $currentUserPlugin = $this->plugin('currentUserPlugin');
332
        $currentUser = $currentUserPlugin->getUser();
333
 
334
        $request = $this->getRequest();
335
        if ($request->isPost()) {
336
            $id = $this->params()->fromRoute('id');
337
            $flash =  Functions::sanitizeFilterString($this->params()->fromPost('flash', 'false'));
338
            $flash = $flash === 'true' ? true : false;
339
 
340
            if (!$id) {
341
                return new JsonModel([
342
                    'success' => false,
343
                    'data' => 'ERROR_INVALID_PARAMETER'
344
                ]);
345
            }
346
 
347
            $groupMapper = GroupMapper::getInstance($this->adapter);
348
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
349
 
350
            if (!$group) {
351
                return new JsonModel([
352
                    'success' => false,
353
                    'data' => 'ERROR_GROUP_NOT_FOUND'
354
                ]);
355
            }
356
 
357
            if ($group->status != Group::STATUS_ACTIVE) {
358
                return new JsonModel([
359
                    'success' => false,
360
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
361
                ]);
362
            }
363
 
364
            if ($group->user_id == $currentUser->id) {
365
                return new JsonModel([
366
                    'success' => false,
367
                    'data' => 'ERROR_GROUP_YOU_ARE_THE_OWNER_OF_THIS_GROUP'
368
                ]);
369
            }
370
 
371
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
372
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
373
            if ($groupMember) {
374
 
375
                if ($groupMember->status == GroupMember::STATUS_ACCEPTED || $groupMember->status == GroupMember::STATUS_AUTO_JOIN) {
376
 
377
                    $groupMember->status = GroupMember::STATUS_CANCELLED;
378
                    if ($groupMemberMapper->update($groupMember)) {
379
                        if ($flash) {
380
 
381
                            $flashMessenger->addSuccessMessage('LABEL_GROUP_YOU_HAVE_LEFT_THE_GROUP');
382
 
383
                            return new JsonModel([
384
                                'success' => true,
385
                                'data' =>  [
386
                                    'message' => 'LABEL_GROUP_YOU_HAVE_LEFT_THE_GROUP',
387
                                    'reload' => true
388
                                ]
389
                            ]);
390
                        } else {
391
                            return new JsonModel([
392
                                'success' => true,
393
                                'data' =>  'LABEL_GROUP_YOU_HAVE_LEFT_THE_GROUP',
394
                            ]);
395
                        }
396
                    } else {
397
                        return new JsonModel([
398
                            'success' => false,
399
                            'data' => $groupMemberMapper->getError()
400
                        ]);
401
                    }
402
                } else {
403
                    return new JsonModel([
404
                        'success' => false,
405
                        'data' => 'ERROR_GROUP_THERE_IS_NO_PENDING_REQUEST_TO_CANCEL'
406
                    ]);
407
                }
408
            } else {
409
                return new JsonModel([
410
                    'success' => false,
411
                    'data' => 'ERROR_GROUP_YOU_NOT_MEMBER'
412
                ]);
413
            }
414
        } else {
415
 
416
            return new JsonModel([
417
                'success' => false,
418
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
419
            ]);
420
        }
421
    }
422
 
423
    public function cancelAction()
424
    {
425
        $flashMessenger = $this->plugin('FlashMessenger');
426
        $currentUserPlugin = $this->plugin('currentUserPlugin');
427
        $currentUser = $currentUserPlugin->getUser();
428
 
429
        $request = $this->getRequest();
430
        if ($request->isPost()) {
431
            $id = $this->params()->fromRoute('id');
432
            $flash =  Functions::sanitizeFilterString($this->params()->fromPost('flash', 'false'));
433
            $flash = $flash === 'true' ? true : false;
434
 
435
            if (!$id) {
436
                return new JsonModel([
437
                    'success' => false,
438
                    'data' => 'ERROR_INVALID_PARAMETER'
439
                ]);
440
            }
441
 
442
            $groupMapper = GroupMapper::getInstance($this->adapter);
443
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
444
 
445
            if (!$group) {
446
                return new JsonModel([
447
                    'success' => false,
448
                    'data' => 'ERROR_GROUP_NOT_FOUND'
449
                ]);
450
            }
451
 
452
            if ($group->status != Group::STATUS_ACTIVE) {
453
                return new JsonModel([
454
                    'success' => false,
455
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
456
                ]);
457
            }
458
 
459
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
460
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
461
            if ($groupMember) {
462
 
463
                if ($groupMember->status == GroupMember::STATUS_JOINING_REQUESTED || $groupMember->status == GroupMember::STATUS_ADDED_BY_ADMIN) {
464
 
465
                    $groupMember->status = GroupMember::STATUS_CANCELLED;
466
                    if ($groupMemberMapper->update($groupMember)) {
467
                        if ($flash) {
468
                            $flashMessenger->addSuccessMessage('LABEL_GROUP_REQUEST_CANCELLED');
469
 
470
                            return new JsonModel([
471
                                'success' => true,
472
                                'data' =>  [
473
                                    'message' => 'LABEL_GROUP_REQUEST_CANCELLED',
474
                                    'reload' => true
475
                                ]
476
                            ]);
477
                        } else {
478
                            return new JsonModel([
479
                                'success' => true,
480
                                'data' =>  'LABEL_GROUP_REQUEST_CANCELLED'
481
                            ]);
482
                        }
483
                    } else {
484
                        return new JsonModel([
485
                            'success' => false,
486
                            'data' => $groupMemberMapper->getError()
487
                        ]);
488
                    }
489
                } else {
490
                    return new JsonModel([
491
                        'success' => false,
492
                        'data' => 'ERROR_GROUP_THERE_IS_NO_PENDING_REQUEST_TO_CANCEL'
493
                    ]);
494
                }
495
            } else {
496
                return new JsonModel([
497
                    'success' => false,
498
                    'data' => 'ERROR_GROUP_YOU_NOT_MEMBER'
499
                ]);
500
            }
501
        } else {
502
 
503
            return new JsonModel([
504
                'success' => false,
505
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
506
            ]);
507
        }
508
    }
509
 
510
 
511
    public function rejectAction()
512
    {
513
        $flashMessenger = $this->plugin('FlashMessenger');
514
        $currentUserPlugin = $this->plugin('currentUserPlugin');
515
        $currentUser = $currentUserPlugin->getUser();
516
 
517
        $request = $this->getRequest();
518
        if ($request->isPost()) {
519
            $id = $this->params()->fromRoute('id');
520
            $flash =  Functions::sanitizeFilterString($this->params()->fromPost('flash', 'false'));
521
            $flash = $flash === 'true' ? true : false;
522
 
523
            if (!$id) {
524
                return new JsonModel([
525
                    'success' => false,
526
                    'data' => 'ERROR_INVALID_PARAMETER'
527
                ]);
528
            }
529
 
530
            $groupMapper = GroupMapper::getInstance($this->adapter);
531
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
532
 
533
            if (!$group) {
534
                return new JsonModel([
535
                    'success' => false,
536
                    'data' => 'ERROR_GROUP_NOT_FOUND'
537
                ]);
538
            }
539
 
540
            if ($group->status != Group::STATUS_ACTIVE) {
541
                return new JsonModel([
542
                    'success' => false,
543
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
544
                ]);
545
            }
546
 
547
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
548
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
549
            if ($groupMember) {
550
 
551
                if ($groupMember->status == GroupMember::STATUS_ADDED_BY_ADMIN) {
552
 
553
                    $groupMember->status = GroupMember::STATUS_REJECTED;
554
                    if ($groupMemberMapper->update($groupMember)) {
555
                        if ($flash) {
556
                            $flashMessenger->addSuccessMessage('LABEL_GROUP_REQUEST_REJECTED');
557
 
558
                            return new JsonModel([
559
                                'success' => true,
560
                                'data' =>  [
561
                                    'message' => 'LABEL_GROUP_REQUEST_REJECTED',
562
                                    'reload' => true
563
                                ]
564
                            ]);
565
                        } else {
566
                            return new JsonModel([
567
                                'success' => true,
568
                                'data' =>  'LABEL_GROUP_REQUEST_REJECTED'
569
                            ]);
570
                        }
571
                    } else {
572
                        return new JsonModel([
573
                            'success' => false,
574
                            'data' => $groupMemberMapper->getError()
575
                        ]);
576
                    }
577
                } else {
578
                    return new JsonModel([
579
                        'success' => false,
580
                        'data' => 'ERROR_GROUP_THERE_IS_NO_PENDING_REQUEST_TO_CANCEL'
581
                    ]);
582
                }
583
            } else {
584
                return new JsonModel([
585
                    'success' => false,
586
                    'data' => 'ERROR_GROUP_YOU_NOT_MEMBER'
587
                ]);
588
            }
589
        } else {
590
 
591
            return new JsonModel([
592
                'success' => false,
593
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
594
            ]);
595
        }
596
    }
597
 
598
    public function acceptAction()
599
    {
600
        $flashMessenger = $this->plugin('FlashMessenger');
601
        $currentUserPlugin = $this->plugin('currentUserPlugin');
602
        $currentUser = $currentUserPlugin->getUser();
603
 
604
        $request = $this->getRequest();
605
        if ($request->isPost()) {
606
            $id = $this->params()->fromRoute('id');
607
            $flash =  Functions::sanitizeFilterString($this->params()->fromPost('flash', 'false'));
608
            $flash = $flash === 'true' ? true : false;
609
 
610
            if (!$id) {
611
                return new JsonModel([
612
                    'success' => false,
613
                    'data' => 'ERROR_INVALID_PARAMETER'
614
                ]);
615
            }
616
 
617
            $groupMapper = GroupMapper::getInstance($this->adapter);
618
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
619
 
620
            if (!$group) {
621
                return new JsonModel([
622
                    'success' => false,
623
                    'data' => 'ERROR_GROUP_NOT_FOUND'
624
                ]);
625
            }
626
 
627
            if ($group->status != Group::STATUS_ACTIVE) {
628
                return new JsonModel([
629
                    'success' => false,
630
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
631
                ]);
632
            }
633
 
634
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
635
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
636
            if ($groupMember) {
637
 
638
                if ($groupMember->status == GroupMember::STATUS_ADDED_BY_ADMIN) {
639
 
640
                    $groupMember->status = GroupMember::STATUS_ACCEPTED;
641
                    if ($groupMemberMapper->update($groupMember)) {
642
                        if ($flash) {
643
                            $flashMessenger->addSuccessMessage('LABEL_GROUP_AUTO_JOIN_SUCCESS');
644
 
645
                            return new JsonModel([
646
                                'success' => true,
647
                                'data' => [
648
                                    'message' => 'LABEL_GROUP_AUTO_JOIN_SUCCESS',
649
                                    'reload' => true
650
                                ]
651
                            ]);
652
                        } else {
653
                            return new JsonModel([
654
                                'success' => true,
655
                                'data' => 'LABEL_GROUP_AUTO_JOIN_SUCCESS'
656
                            ]);
657
                        }
658
                    } else {
659
                        return new JsonModel([
660
                            'success' => false,
661
                            'data' => $groupMemberMapper->getError()
662
                        ]);
663
                    }
664
                } else {
665
                    return new JsonModel([
666
                        'success' => false,
667
                        'data' => 'ERROR_GROUP_YOU_HAVE_NOT_INVITED_THIS_GROUP'
668
                    ]);
669
                }
670
            } else {
671
                return new JsonModel([
672
                    'success' => false,
673
                    'data' => 'ERROR_GROUP_YOU_NOT_MEMBER'
674
                ]);
675
            }
676
        } else {
677
 
678
            return new JsonModel([
679
                'success' => false,
680
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
681
            ]);
682
        }
683
    }
684
 
685
 
686
    public function requestAction()
687
    {
688
        $flashMessenger = $this->plugin('FlashMessenger');
689
        $currentUserPlugin = $this->plugin('currentUserPlugin');
690
        $currentUser = $currentUserPlugin->getUser();
691
 
692
        $request = $this->getRequest();
693
        if ($request->isPost()) {
694
            $id = $this->params()->fromRoute('id');
695
            $flash =  Functions::sanitizeFilterString($this->params()->fromPost('flash', 'false'));
696
            $flash = $flash === 'true' ? true : false;
697
 
698
            if (!$id) {
699
                return new JsonModel([
700
                    'success' => false,
701
                    'data' => 'ERROR_INVALID_PARAMETER'
702
                ]);
703
            }
704
 
705
            $groupMapper = GroupMapper::getInstance($this->adapter);
706
            $group = $groupMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
707
 
708
            if (!$group) {
709
                return new JsonModel([
710
                    'success' => false,
711
                    'data' => 'ERROR_GROUP_NOT_FOUND'
712
                ]);
713
            }
714
 
715
            if ($group->status != Group::STATUS_ACTIVE) {
716
                return new JsonModel([
717
                    'success' => false,
718
                    'data' => 'ERROR_GROUP_IS_NOT_ACTIVE'
719
                ]);
720
            }
721
 
722
            $groupMemberMapper = GroupMemberMapper::getInstance($this->adapter);
723
            $groupMember = $groupMemberMapper->fetchOneByGroupIdAndUserId($group->id, $currentUser->id);
724
            if ($groupMember) {
725
                if ($groupMember->status == GroupMember::STATUS_ACCEPTED || $groupMember->status == GroupMember::STATUS_AUTO_JOIN) {
726
                    return new JsonModel([
727
                        'success' => false,
728
                        'data' => 'ERROR_GROUP_YOU_ARE_MEMBER'
729
                    ]);
730
                }
731
                if ($groupMember->status == GroupMember::STATUS_REJECTED) {
732
                    return new JsonModel([
733
                        'success' => false,
734
                        'data' => 'ERROR_GROUP_YOUR_REQUEST_WAS_PREVIOUSLY_REJECTED'
735
                    ]);
736
                }
737
            }
738
 
739
            if ($group->privacy == Group::PRIVACY_IS_PRIVATE || $group->accessibility == Group::ACCESSIBILITY_ADMIN_WILL_ADD) {
740
                return new JsonModel([
741
                    'success' => false,
742
                    'data' => 'ERROR_GROUP_ACCESS_ONLY_BY_ADMIN_INVITATION'
743
                ]);
744
            }
745
 
746
 
747
            if ($groupMember) {
748
                if ($group->accessibility == Group::ACCESSIBILITY_AUTO_JOIN) {
749
                    $groupMember->status    = GroupMember::STATUS_AUTO_JOIN;
750
                    $groupMember->joined_on = new Expression('NOW()');
751
                }
752
 
753
                if ($group->accessibility == Group::ACCESSIBILITY_REQUEST_TO_JOIN) {
754
                    $groupMember->status                = GroupMember::STATUS_JOINING_REQUESTED;
755
                    $groupMember->joining_request_on    = new Expression('NOW()');
756
                }
757
 
758
                $result = $groupMemberMapper->update($groupMember);
759
            } else {
760
                $groupMember = new GroupMember();
761
                $groupMember->group_id  = $group->id;
762
                $groupMember->user_id   = $currentUser->id;
763
                if ($group->accessibility == Group::ACCESSIBILITY_AUTO_JOIN) {
764
                    $groupMember->status    = GroupMember::STATUS_AUTO_JOIN;
765
                }
766
 
767
                if ($group->accessibility == Group::ACCESSIBILITY_REQUEST_TO_JOIN) {
768
                    $groupMember->status    = GroupMember::STATUS_JOINING_REQUESTED;
769
                }
770
 
771
                $result = $groupMemberMapper->insert($groupMember);
772
            }
773
 
774
            if ($result) {
775
 
776
                $userMapper = UserMapper::getInstance($this->adapter);
777
                $userOwnerGroup = $userMapper->fetchOne($group->user_id);
778
 
779
                $notification = new Notification();
780
                $notification->type     = Notification::TYPE_RECEIVE_REQUEST_JOIN_MY_GROUP;
781
                $notification->read     = Notification::NO;
782
                $notification->user_id  = $userOwnerGroup->id;
783
                $notification->group_id = $group->id;
784
                $notification->message  = 'LABEL_NOTIFICATION_RECEIVE_REQUEST_JOIN_MY_GROUP';
785
                $notification->url      = $this->url()->fromRoute('group/view', ['id' => $group->uuid]);
786
 
787
                $notificationMapper = NotificationMapper::getInstance($this->adapter);
788
                $notificationMapper->insert($notification);
789
 
790
 
791
 
792
                $userNotificationSettingMapper = UserNotificationSettingMapper::getInstance($this->adapter);
793
                $userNotificationSetting = $userNotificationSettingMapper->fetchOne($group->user_id);
794
 
795
 
796
                if ($userNotificationSetting->receive_request_join_my_group) {
797
                    $emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
798
                    $emailTemplate = $emailTemplateMapper->fetchOneByCodeAndNetworkId(EmailTemplate::CODE_RECEIVE_REQUEST_JOIN_MY_GROUP, $currentUser->network_id);
799
                    if ($emailTemplate) {
800
                        $arrayCont = [
801
                            'firstname'             => $currentUser->first_name,
802
                            'lastname'              => $currentUser->last_name,
803
                            'other_user_firstname'  => $userOwnerGroup->first_name,
804
                            'other_user_lastname'   => $userOwnerGroup->last_name,
805
                            'company_name'          => '',
806
                            'group_name'            => $group->name,
807
                            'content'               => '',
808
                            'code'                  => '',
809
                            'link'                  => $this->url()->fromRoute('group/view', ['id' => $group->uuid], ['force_canonical' => true])
810
                        ];
811
 
812
                        $email = new QueueEmail($this->adapter);
813
                        $email->processEmailTemplate($emailTemplate, $arrayCont, $userOwnerGroup->email, trim($userOwnerGroup->first_name . ' ' . $userOwnerGroup->last_name));
814
                    }
815
                }
816
 
817
                if ($group->accessibility == Group::ACCESSIBILITY_AUTO_JOIN) {
818
                    if ($flash) {
819
                        $flashMessenger->addSuccessMessage('LABEL_GROUP_AUTO_JOIN_SUCCESS');
820
 
821
                        return new JsonModel([
822
                            'success' => true,
823
                            'data' => [
824
                                'message' => 'LABEL_GROUP_AUTO_JOIN_SUCCESS',
825
                                'reload' => true
826
                            ]
827
                        ]);
828
                    } else {
829
                        return new JsonModel([
830
                            'success' => true,
831
                            'data' => 'LABEL_GROUP_AUTO_JOIN_SUCCESS'
832
                        ]);
833
                    }
834
                }
835
                if ($group->accessibility == Group::ACCESSIBILITY_REQUEST_TO_JOIN) {
836
                    if ($flash) {
837
                        $flashMessenger->addSuccessMessage('LABEL_GROUP_REQUEST_SUCCESS');
838
 
839
                        return new JsonModel([
840
                            'success' => true,
841
                            'data' => [
842
                                'message' => 'LABEL_GROUP_REQUEST_SUCCESS',
843
                                'reload' => true
844
                            ]
845
                        ]);
846
                    } else {
847
                        return new JsonModel([
848
                            'success' => true,
849
                            'data' => 'LABEL_GROUP_REQUEST_SUCCESS'
850
                        ]);
851
                    }
852
                }
853
            } else {
854
                return new JsonModel([
855
                    'success' => false,
856
                    'data' => $groupMapper->getError()
857
                ]);
858
            }
859
        } else {
860
 
861
            return new JsonModel([
862
                'success' => false,
863
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
864
            ]);
865
        }
866
    }
867
 
868
    /**
869
     *
870
     * Generación del listado de perfiles
871
     * {@inheritDoc}
872
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
873
     */
874
    public function joinedGroupsAction()
875
    {
876
        $currentUserPlugin = $this->plugin('currentUserPlugin');
877
        $currentUser = $currentUserPlugin->getUser();
878
 
879
        $request = $this->getRequest();
880
        if ($request->isGet()) {
881
 
882
                $values = [
883
                    Group::PRIVACY_IS_PRIVATE => 'LABEL_PRIVATE',
884
                    Group::PRIVACY_IS_PUBLIC => 'LABEL_PUBLIC'
885
                ];
886
 
887
                $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
888
 
889
 
890
                $queryMapper = QueryMapper::getInstance($this->adapter);
891
 
892
                $select = $queryMapper->getSql()->select();
893
                $select->columns(['id', 'uuid', 'name', 'privacy',  'image']);
894
                $select->from(['g' => GroupMapper::_TABLE]);
895
                $select->join(['gm' => GroupMemberMapper::_TABLE], 'gm.group_id = g.id', []);
896
                $select->where->equalTo('g.status', Group::STATUS_ACTIVE);
897
                $select->where->in('gm.status', [GroupMember::STATUS_ACCEPTED, GroupMember::STATUS_AUTO_JOIN]);
898
                $select->where->equalTo('gm.user_id', $currentUser->id);
899
                $select->where->notEqualTo('g.user_id', $currentUser->id);
900
                $select->where->equalTo('g.network_id', $currentUser->network_id);
901
 
902
                if ($search) {
903
                    $select->where->like('name', '%' . $search . '%');
904
                }
905
                $select->order('name ASC');
906
 
907
                $records = $queryMapper->fetchAll($select);
908
 
909
                $items = [];
910
                foreach ($records as $record) {
911
 
912
                    $item = [
913
                        'name' => $record['name'],
914
                        'privacy' => $values[$record['privacy']],
60 efrain 915
                        'image' => $this->url()->fromRoute('storage', ['type' => 'group', 'code' => $record['uuid'], 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 916
                        'link_view' => $this->url()->fromRoute('group/view', ['id' => $record['uuid']]),
917
                        'link_leave' => $this->url()->fromRoute('group/leave', ['id' => $record['uuid']]),
918
                    ];
919
 
920
                    array_push($items, $item);
921
                }
922
 
923
 
924
 
925
                $response = [
926
                    'success' => true,
927
                    'data' => $items
928
                ];
929
 
930
                return new JsonModel($response);
931
 
932
        } else {
933
            return new JsonModel([
934
                'success' => false,
935
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
936
            ]);
937
        }
938
    }
939
 
940
    public function invitationsReceivedAction()
941
    {
942
        $currentUserPlugin = $this->plugin('currentUserPlugin');
943
        $currentUser = $currentUserPlugin->getUser();
944
 
945
        $request = $this->getRequest();
946
        if ($request->isGet()) {
947
 
948
 
949
                $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
950
 
951
                $queryMapper = QueryMapper::getInstance($this->adapter);
952
 
953
                $select = $queryMapper->getSql()->select();
954
                $select->columns(['uuid', 'name', 'image']);
955
                $select->from(['g' => GroupMapper::_TABLE]);
956
                $select->join(['gm' => GroupMemberMapper::_TABLE], 'gm.group_id  = g.id', []);
957
                $select->where->equalTo('gm.user_id', $currentUser->id);
958
                $select->where->equalTo('gm.status', GroupMember::STATUS_ADDED_BY_ADMIN);
959
                $select->where->equalTo('g.status', Group::STATUS_ACTIVE);
960
                $select->where->equalTo('g.network_id', $currentUser->network_id);
961
 
962
                if ($search) {
963
                    $select->where->like('g.name', '%' . $search . '%');
964
                }
965
                $select->order('name ASC');
966
 
967
                //echo $select2->getSqlString($this->adapter->platform); exit;
968
 
969
                $records = $queryMapper->fetchAll($select);
970
 
971
                $items = [];
972
                foreach ($records as $record) {
973
                    $item = [
974
                        'name' => $record['name'],
60 efrain 975
                        'image' => $this->url()->fromRoute('storage', ['type' => 'group', 'code' => $record['uuid'], 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 976
                        'link_view' => $this->url()->fromRoute('group/view', ['id' => $record['uuid']]),
977
                        'link_accept' => $this->url()->fromRoute('group/accept', ['id' => $record['uuid']]),
978
                        'link_reject' => $this->url()->fromRoute('group/reject', ['id' => $record['uuid']]),
979
                    ];
980
 
981
 
982
                    array_push($items, $item);
983
                }
984
 
985
                $response = [
986
                    'success' => true,
987
                    'data' => $items
988
                ];
989
 
990
                return new JsonModel($response);
991
 
992
        } else {
993
            return new JsonModel([
994
                'success' => false,
995
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
996
            ]);
997
        }
998
    }
999
 
1000
    public function requestsSentAction()
1001
    {
1002
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1003
        $currentUser = $currentUserPlugin->getUser();
1004
 
1005
        $request = $this->getRequest();
1006
        if ($request->isGet()) {
1007
 
1008
 
1009
                $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
1010
 
1011
 
1012
 
1013
                $queryMapper = QueryMapper::getInstance($this->adapter);
1014
 
1015
                $select = $queryMapper->getSql()->select();
1016
                $select->columns(['uuid', 'name', 'image']);
1017
                $select->from(['g' => GroupMapper::_TABLE]);
1018
                $select->join(['gm' => GroupMemberMapper::_TABLE], 'gm.group_id  = g.id', []);
1019
                $select->where->equalTo('gm.user_id', $currentUser->id);
1020
                $select->where->equalTo('gm.status', GroupMember::STATUS_JOINING_REQUESTED);
1021
                $select->where->equalTo('g.status', Group::STATUS_ACTIVE);
1022
                $select->where->equalTo('g.network_id', $currentUser->network_id);
1023
 
1024
 
1025
                if ($search) {
1026
                    $select->where->like('g.name', '%' . $search . '%');
1027
                }
1028
                $select->order('name ASC');
1029
 
1030
                //echo $select2->getSqlString($this->adapter->platform); exit;
1031
 
1032
                $records = $queryMapper->fetchAll($select);
1033
 
1034
                $items = [];
1035
                foreach ($records as $record) {
1036
                    $item = [
1037
                        'name' => $record['name'],
60 efrain 1038
                        'image' => $this->url()->fromRoute('storage', ['type' => 'group', 'code' => $record['uuid'], 'filename' => $record['image']],['force_canonical' => true]),
1 efrain 1039
                        'link_view' => $this->url()->fromRoute('group/view', ['id' => $record['uuid']]),
1040
                        'link_cancel' => $this->url()->fromRoute('group/cancel', ['id' => $record['uuid']]),
1041
                    ];
1042
 
1043
 
1044
                    array_push($items, $item);
1045
                }
1046
 
1047
                $response = [
1048
                    'success' => true,
1049
                    'data' => $items
1050
                ];
1051
 
1052
                return new JsonModel($response);
1053
 
1054
        } else {
1055
            return new JsonModel([
1056
                'success' => false,
1057
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1058
            ]);
1059
        }
1060
    }
1061
}