Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 1893 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types = 1);
3
namespace LeadersLinked\Controller;
4
 
5
use Laminas\Db\Adapter\AdapterInterface;
6
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
7
use Laminas\Mvc\Controller\AbstractActionController;
8
use Laminas\Log\LoggerInterface;
9
use Laminas\View\Model\JsonModel;
10
use Laminas\View\Model\ViewModel;
11
use LeadersLinked\Library\Functions;
12
use LeadersLinked\Mapper\UserMapper;
13
use LeadersLinked\Mapper\ConnectionMapper;
14
use LeadersLinked\Mapper\ChatMessageMapper;
15
use LeadersLinked\Mapper\ChatGroupMapper;
16
use LeadersLinked\Mapper\ChatGroupMessageMapper;
17
use LeadersLinked\Mapper\ChatGroupUserMessageMapper;
18
use LeadersLinked\Mapper\ChatUserMapper;
19
use LeadersLinked\Model\ChatMessage;
20
use LeadersLinked\Model\ChatGroupMessage;
21
use LeadersLinked\Model\ChatGroupUserMessage;
22
use LeadersLinked\Model\Connection;
23
use LeadersLinked\Model\ChatGroup;
24
use LeadersLinked\Model\ChatUser;
25
use LeadersLinked\Form\Chat\CreateGroupForm;
26
use LeadersLinked\Mapper\ChatGroupUserMapper;
27
use LeadersLinked\Model\ChatGroupUser;
28
 
29
 
30
class ChatController extends AbstractActionController
31
{
32
    const SESSION_CHAT_OPEN_BOXES = 'chat_open_boxes';
33
 
34
 
35
    /**
36
     *
37
     * @var AdapterInterface
38
     */
39
    private $adapter;
40
 
41
    /**
42
     *
43
     * @var AbstractAdapter
44
     */
45
    private $cache;
46
 
47
    /**
48
     *
49
     * @var LoggerInterface
50
     */
51
    private $logger;
52
 
53
    /**
54
     *
55
     * @var array
56
     */
57
    private $config;
58
 
59
    /**
60
     *
61
     * @param AdapterInterface $adapter
62
     * @param AbstractAdapter $cache
63
     * @param LoggerInterface $logger
64
     * @param array $config
65
     */
66
    public function __construct($adapter, $cache, $logger, $config)
67
    {
68
        $this->adapter  = $adapter;
69
        $this->cache    = $cache;
70
        $this->logger   = $logger;
71
        $this->config   = $config;
72
 
73
 
74
        if(!isset($_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
75
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = [];
76
        }
77
 
78
    }
79
 
80
    /**
81
     *
82
     * Ruta usada para mostrar el chat en pantalla completa usada en los moviles
83
     *
84
     */
85
    public function indexAction()
86
    {
87
        $currentUserPlugin = $this->plugin('currentUserPlugin');
88
        $currentUser = $currentUserPlugin->getUser();
89
 
90
        $connectionMapper = ConnectionMapper:: getInstance($this->adapter);
91
        $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds( $currentUser->id );
92
 
93
        $contacts = [];
94
        if($connectionIds) {
95
            $userMapper = UserMapper::getInstance($this->adapter);
96
            $users = $userMapper->fetchAllByIds($connectionIds);
97
 
98
            foreach($users as $user)
99
            {
100
                $username = trim($user->first_name . ' ' . $user->last_name);
101
 
102
 
103
                if($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
104
                    $userMapper->updateChatOfflineStatus($user->id);
105
                    $status = 'Offline';
106
                } else {
107
                    $status = "Online";
108
                }
109
 
110
                $user_image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]);
111
 
112
                array_push($contacts, ['id' => $user->uuid, 'status'=> $status,'name'=> $username, 'image' => $user_image]);
113
 
114
            }
115
        }
116
 
117
        $groups = [];
118
        $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
119
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
120
 
121
        $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
122
        if(is_array($results)) {
123
            foreach ($results as $r)
124
            {
125
 
126
                $chatOwner = $chatGroupUserMapper->fetchOwnerByGroupId($r->group_id);
127
                $userOwner = $userMapper->fetchOne( $chatOwner->user_id );
128
                $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
129
 
130
                array_push($groups, ['id' => $chatGroup->uuid, 'name' => $chatGroup->name, 'owner_id' => $userOwner->uuid ]);
131
 
132
 
133
 
134
            }
135
        }
136
 
137
        $this->layout()->setTemplate('layout/layout-chat.phtml');
138
        $this->layout()->setVariables([
139
            'is_chat' => true
140
        ]);
141
        $viewModel = new ViewModel();
142
        $viewModel->setTemplate('leaders-linked/chat/chat.phtml');
143
        $viewModel->setVariables([
144
            'contacts' => $contacts,
145
            'groups' => $groups,
146
            'user_id' => $currentUser->id,
147
            'is_chat' => true
148
        ]);
149
        return $viewModel ;
150
 
151
 
152
    }
153
 
154
    /**
155
     * Recuperamos los contactos y grupos
156
     * tiene que enviarse un petición GET a la siguiente url: /chat/heart-beat
157
     * retorna un json en caso de ser  positivo
158
     * [
159
     *  'success' : true,
160
     *  'data' : [
161
     *     [
162
     *       'url_leave'                                => 'url para abandonar el grupo en caso de no ser el propietario',
163
     *       'url_delete'                               => 'url para borrar el grupo si es el propietario',
164
     *       'url_add_user_to_group'                    => 'url para agregar un usuario al grupo si es el propietario',
165
     *       'url_get_contacts_availables_for_group'    => 'url para obtener los usuarios disponibles para agregarlos al grupo',
166
     *       'url_get_contact_group_list'               => 'url para obtener los usuarios del grupo si es el propietario',
167
     *       'url_clear'                                => 'url para limpiar los mensajes del grupo',
168
     *       'url_close'                                => 'url para cerrar el chat',
169
     *       'url_send'                                 => 'url para enviar un mensaje',
170
     *       'url_upload'                               => 'url para subir un archivo, imagen o video',
171
     *       'url_get_all_messages'                     => 'url para para obtener los mensajes',
172
     *       'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
173
     *       'url_mark_received'                        => 'url para marcar los mensajes como recibios'
174
     *       'id'                                       => 'id del grupo encriptado',
175
     *       'name'                                     => 'nombre del grupo',
176
     *       'type'                                     => 'group', //fixed
177
     *       'is_open'                                  => 'true/false',
178
     *       'unsee_messages'                           => 'true/false',
179
     *       'unread_messages'                          => 'true/false'
180
     *      ],
181
     *      [
182
     *        'url_clear'               => 'url para limpiar los mensajes del grupo',
183
     *        'url_close'               => 'url para cerrar el chat',
184
     *        'url_send'                => 'url para enviar un mensaje',
185
     *        'url_upload'              => 'url para subir un archivo, imagen o video',
186
     *        'url_get_all_messages'    => 'url para para obtener los mensajes',
187
     *        'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
188
     *        'url_mark_received'                        => 'url para marcar los mensajes como recibios'
189
     *        'id'                      => 'id del usuario encriptado',
190
     *        'name'                    => 'nombre del usuario',
191
     *        'image'                   => 'imagen del usuario',
192
     *        'type'                    => 'user' //fixed,
193
     *        'profile'                 => 'url del profile',
194
     *        'online'                  => 'true/false',
195
     *        'is_open'                 => 'true/false',
196
     *        'unsee_messages'          => 'true/false'
197
     *        'unread_messages'         => 'true/false'
198
     *     ]
199
     * ]
200
     * En caso de ser negativo puede haber 2 formatos
201
     * [
202
     *  'success' : false,
203
     *  'data' : mensaje de error
204
     * ]
205
     * o
206
     * [
207
     *  'success' : false,
208
     *  'data' : [
209
     *      'fieldname' : [
210
     *          'mensaje de error'
211
     *      ]
212
     *  ]
213
     * ]
214
     * @return \Laminas\View\Model\JsonModel
215
     */
216
    public function heartBeatAction()
217
    {
218
        $request    = $this->getRequest();
219
        if($request->isGet()) {
220
 
221
 
222
            $currentUserPlugin = $this->plugin('currentUserPlugin');
223
            $currentUser = $currentUserPlugin->getUser();
224
 
225
            $userMapper = UserMapper::getInstance($this->adapter);
226
            $userMapper->updateChatOnlineStatus($currentUser->id);
227
 
228
            $chats      = [];
229
 
230
            $chatGroupMapper            = ChatGroupMapper::getInstance($this->adapter);
231
            $chatGroupUserMapper        = ChatGroupUserMapper::getInstance($this->adapter);
232
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
233
 
234
 
235
            $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
236
 
237
            if (is_array($results)) {
238
                foreach ($results as $r)
239
                {
240
 
241
                    $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
242
                    $chatUserOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
243
 
244
 
245
                    $is_open = in_array($chatGroup->uuid, $_SESSION[self::SESSION_CHAT_OPEN_BOXES]);
246
                    $not_seen_messages     = $chatGroupUserMessageMapper->existNotSeenMessages($chatGroup->id, $currentUser->id);
247
                    $not_received_messages = $chatGroupUserMessageMapper->existNotReceivedMessages($chatGroup->id, $currentUser->id);
248
 
249
                    if($chatUserOwner->user_id == $currentUser->id ) {
250
 
251
                        $chat = [
252
                            'url_leave'                             => '',
253
                            'url_delete'                            => $this->url()->fromRoute('chat/delete-group', ['group_id' => $chatGroup->uuid]),
254
                            'url_add_user_to_group'                 => $this->url()->fromRoute('chat/add-user-to-group', ['group_id' => $chatGroup->uuid]),
255
                            'url_get_contact_group_list'            => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
256
                            'url_get_contacts_availables_for_group' => $this->url()->fromRoute('chat/get-contacts-availables-for-group', ['group_id' => $chatGroup->uuid]),
257
                            'url_clear'                             => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
258
                            'url_close'                             => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
259
                            'url_send'                              => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
260
                            'url_upload'                            => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
261
                            'url_get_all_messages'                  => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
262
                            'url_mark_seen'                         => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
263
                            'url_mark_received'                     => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
264
                            'id'                                    => $chatGroup->uuid,
265
                            'name'                                  => $chatGroup->name,
266
                            'type'                                  => 'group',
267
                            'is_open'                               => $is_open ? 1 : 0,
268
                            'not_seen_messages'                     => $not_seen_messages,
269
                            'not_received_messages'                 => $not_received_messages,
270
 
271
                        ];
272
                    } else {
273
 
274
                        $chat = [
275
                            'url_delete'                    => '',
276
                            'url_add_user_to_group'         => '',
277
                            'url_get_contact_group_list'    => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
278
                            'url_leave'                     => $this->url()->fromRoute('chat/leave-group', ['group_id' => $chatGroup->uuid]),
279
                            'url_clear'                     => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
280
                            'url_close'                     => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
281
                            'url_send'                      => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
282
                            'url_upload'                    => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
283
                            'url_get_all_messages'          => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
284
                            'url_mark_seen'                 => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
285
                            'url_mark_received'             => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
286
                            'id'                            => $chatGroup->uuid,
287
                            'name'                          => $chatGroup->name,
288
                            'type'                          => 'group',
289
                            'is_open'                       => $is_open ? 1 : 0,
290
                            'not_seen_messages'             => $not_seen_messages,
291
                            'not_received_messages'         => $not_received_messages,
292
                        ];
293
                    }
294
 
295
                   array_push($chats, $chat);
296
                }
297
            }
298
 
299
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
300
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
301
 
302
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
303
            $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
304
 
305
 
306
 
307
            if ($connectionIds) {
308
 
309
                $userMapper = UserMapper::getInstance($this->adapter);
310
                $users = $userMapper->fetchAllByIds($connectionIds);
311
 
312
                foreach ($users as $user)
313
                {
314
 
315
 
316
                    if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
317
                        $userMapper->updateChatOfflineStatus($user->id);
318
                        $online = false;
319
                    } else {
320
                        $online = true;
321
                    }
322
 
323
 
324
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
325
 
326
 
327
                    if($chatUser) {
328
                        $is_open = in_array($chatUser->uuid, $_SESSION[self::SESSION_CHAT_OPEN_BOXES]);
329
                        $not_received_messages = $chatMessageMapper->existNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
330
                        $not_seen_messages = $chatMessageMapper->existNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
331
                    } else {
332
                        $is_open = false;
333
                        $not_seen_messages = false;
334
                        $not_received_messages = false;
335
                    }
336
 
337
 
338
                    $chat = [
339
                        'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
340
                        'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
341
                        'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
342
                        'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
343
                        'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
344
                        'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
345
                        'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
346
                        'id'                        => $user->uuid,
347
                        'name'                      => trim($user->first_name . ' ' . $user->last_name),
348
                        'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
349
                        'profile'                   => $this->url()->fromRoute('profile/view', ['id' =>$user->uuid]),
350
                        'type'                      => 'user',
351
                        'online'                    => $online ? 1 : 0,
352
                        'is_open'                   => $is_open ? 1 : 0,
353
                        'not_seen_messages'         => $not_seen_messages,
354
                        'not_received_messages'     => $not_received_messages,
355
                    ];
356
 
357
                    array_push($chats, $chat);
358
                }
359
            }
360
 
361
            $userMapper->updateLastHeartBeat($currentUser->id);
362
 
363
            $response = [
364
                'success' => true,
365
                'data' => $chats
366
            ];
367
 
368
        } else {
369
            $response = [
370
                'success' => false,
371
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
372
            ];
373
        }
374
 
375
        return new JsonModel($response);
376
    }
377
 
378
 
379
 
380
    /**
381
     * Esta función crea un grupo y asigna al usuario actual como el owner del mismo,
382
     * tiene que enviarse un petición POST a la siguiente url: /chat/create-group
383
     * con el siguiente parámetro
384
     * name = un string con un máximo de 50 carácteres
385
     * retorna un json en caso de ser  positivo
386
     * [
387
     *  'success' : true,
388
     *  'data' : ID del grupo encriptado
389
     * ]
390
     * En caso de ser negativo puede haber 2 formatos
391
     * [
392
     *  'success' : false,
393
     *  'data' : mensaje de error
394
     * ]
395
     * o
396
     * [
397
     *  'success' : false,
398
     *  'data' : [
399
     *      'fieldname' : [
400
     *          'mensaje de error'
401
     *      ]
402
     *  ]
403
     * ]
404
     * @return \Laminas\View\Model\JsonModel
405
     */
406
    public function createGroupAction()
407
    {
408
        $request    = $this->getRequest();
409
        if($request->isPost()) {
410
            $form = new  CreateGroupForm();
411
            $form->setData($request->getPost()->toArray());
412
 
413
            if($form->isValid()) {
414
                $dataPost = (array) $form->getData();
415
                $name = $dataPost['name'];
416
 
417
 
418
                $currentUserPlugin = $this->plugin('currentUserPlugin');
419
                $currentUser = $currentUserPlugin->getUser();
420
 
421
                $chatGroup = new ChatGroup();
422
                $chatGroup->name = $name;
423
 
424
 
425
                $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
426
                $result = $chatGroupMapper->insert($chatGroup);
427
                if ($result) {
428
                    $chatGroup = $chatGroupMapper->fetchOne($chatGroup->id);
429
 
430
 
431
 
432
                    $chatGroupUser = new ChatGroupUser();
433
                    $chatGroupUser->group_id = $chatGroup->id;
434
                    $chatGroupUser->user_id = $currentUser->id;
435
                    $chatGroupUser->owner = ChatGroupUser::OWNER_YES;
436
 
437
                    $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
438
                    $result = $chatGroupUserMapper->insert($chatGroupUser);
439
 
440
                    if($result)  {
441
                        $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
442
                        $dirpath = $fullpath_chat . $chatGroup->uuid;
443
                        if (! file_exists($dirpath)) {
444
                            mkdir($dirpath, 0777, true);
445
                            chmod($dirpath, 0777);
446
                        }
447
 
448
                        $response = [
449
                            'success' => true,
450
                            'data' => $chatGroup->uuid,
451
                        ];
452
                    } else {
453
                        $response = [
454
                            'success' => false,
455
                            'data' => $chatGroupUserMapper->getError(),
456
                        ];
457
                    }
458
 
459
                } else {
460
                    $response = [
461
                        'success' => false,
462
                        'data' => $chatGroupMapper->getError(),
463
                    ];
464
                }
465
            } else {
466
                $messages = [];
467
                $form_messages = (array) $form->getMessages();
468
                foreach($form_messages  as $fieldname => $field_messages)
469
                {
470
 
471
                    $messages[$fieldname] = array_values($field_messages);
472
                }
473
 
474
                return new JsonModel([
475
                    'success'   => false,
476
                    'data'   => $messages
477
                ]);
478
            }
479
        } else {
480
            $response = [
481
                'success' => false,
482
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
483
            ];
484
        }
485
 
486
        return new JsonModel($response);
487
    }
488
 
489
    /**
490
     * Esta función crea un grupo y asigna al usuario al mismo, solo el owner puede hacerlo
491
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/add-user-to-group/:group_id)
492
     * Parámetros del route
493
     * :group_id = id del grupo encriptado
494
     * Parámetro post
495
     * uid = id encriptado del usuario
496
     * retorna un json en caso de ser  positivo
497
     * [
498
     *  'success' : true,
499
     *  'data' : [
500
     *     [
501
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
502
     *       'id'                    => 'id del usuario encriptado',
503
     *       'name'                  => 'nombre del usuario',
504
     *       'image'                 => 'imagen del usuario',
505
     *       'type'                  => 'user' //fixed,
506
     *       'online'                => $online,
507
     *     ]
508
     * ]
509
     * En caso de ser negativo puede haber 2 formatos
510
     * [
511
     *  'success' : false,
512
     *  'data' : mensaje de error
513
     * ]
514
     * o
515
     * [
516
     *  'success' : false,
517
     *  'data' : [
518
     *      'fieldname' : [
519
     *          'mensaje de error'
520
     *      ]
521
     *  ]
522
     * ]
523
     * @return \Laminas\View\Model\JsonModel
524
     */
525
    public function addUserToGroupAction()
526
    {
527
        $request    = $this->getRequest();
528
        if($request->isPost()) {
529
            $currentUserPlugin = $this->plugin('currentUserPlugin');
530
            $currentUser = $currentUserPlugin->getUser();
531
 
532
            $group_id   = $this->params()->fromRoute('group_id');
533
            $user_id    = $this->params()->fromPost('uid');
534
 
535
            if(empty($group_id) || empty($user_id)) {
536
                return new JsonModel([
537
                    'success' => false,
538
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
539
                ]);
540
            }
541
 
542
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
543
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
544
            if(!$chatGroup) {
545
                return new JsonModel([
546
                    'success' => false,
547
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
548
                ]);
549
            }
550
 
551
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
552
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
553
 
554
            if($chatGroupOwner->user_id != $currentUser->id) {
555
                return new JsonModel([
556
                    'success' => false,
557
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
558
                ]);
559
            }
560
 
561
            $userMapper = UserMapper::getInstance($this->adapter);
562
            $user = $userMapper->fetchOneByUuid($user_id);
563
 
564
            if(!$user) {
565
                return new JsonModel([
566
                    'success' => false,
567
                    'data' => 'ERROR_USER_NOT_FOUND'
568
                ]);
569
            }
570
 
571
            if($chatGroupOwner->user_id == $user->id) {
572
                return new JsonModel([
573
                    'success' => false,
574
                    'data' => 'ERROR_CHAT_I_CAN_NOT_ADD_HIMSELF'
575
                ]);
576
            }
577
 
578
 
579
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
580
            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
581
            if(!$connection) {
582
                return new JsonModel([
583
                    'success' => false,
584
                    'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
585
                ]);
586
            }
587
 
588
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
589
            if($chatGroupUser) {
590
                return new JsonModel([
591
                    'success' => false,
592
                    'data' => 'ERROR_THIS_USER_ALREADY_EXISTS_IN_THIS_GROUP'
593
                ]);
594
            }
595
 
596
 
597
            $chatGroupUser = new ChatGroupUser();
598
            $chatGroupUser->group_id    = $chatGroup->id;
599
            $chatGroupUser->user_id     = $user->id;
600
            $chatGroupUser->owner       = ChatGroupUser::OWNER_NO;
601
 
602
            $result = $chatGroupUserMapper->insert($chatGroupUser);
603
            if(!$result) {
604
                return new JsonModel([
605
                    'success' => false,
606
                    'data' => $chatGroupUserMapper->getError()
607
                ]);
608
            }
609
 
610
            if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
611
                $userMapper->updateChatOfflineStatus($user->id);
612
                $online = false;
613
            } else {
614
                $online = true;
615
            }
616
 
617
 
618
            return new JsonModel([
619
                'success' => true,
620
                'data' => [
621
                    'url_remove_from_group' => $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]),
622
                    'id'        => $user->uuid,
623
                    'name'      => trim($user->first_name . ' ' . $user->last_name),
624
                    'image'     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
625
                    'type'      => 'user',
626
                    'online'    => $online,
627
                ]
628
            ]);
629
 
630
 
631
        } else {
632
            return new JsonModel([
633
                'success' => false,
634
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
635
            ]);
636
        }
637
 
638
    }
639
 
640
    /**
641
     * Esta función remueve el usuario del grupo
642
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/remove-user-from-group/:group_id/:user_id)
643
     * y la cuál se recibe en la función heartBeat.
644
     * Parámetros del route
645
     * group_id= id encriptado del grupo
646
     * user_id = id encriptado del usuario
647
     * retorna un json en caso de ser  positivo
648
     * [
649
     *  'success' : true,
650
     * ]
651
     * En caso de ser negativo puede haber 2 formatos
652
     * [
653
     *  'success' : false,
654
     *  'data' : mensaje de error
655
     * ]
656
     * @return \Laminas\View\Model\JsonModel
657
     */
658
    public function removeUserFromGroupAction()
659
    {
660
        $request    = $this->getRequest();
661
        if($request->isPost()) {
662
 
663
            $currentUserPlugin = $this->plugin('currentUserPlugin');
664
            $currentUser = $currentUserPlugin->getUser();
665
 
666
            $user_id = $this->params()->fromRoute('user_id');
667
            $group_id = $this->params()->fromRoute('group_id');
668
 
669
            if(empty($group_id) || empty($user_id)) {
670
                return new JsonModel([
671
                    'success' => false,
672
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
673
                ]);
674
            }
675
 
676
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
677
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
678
            if(!$chatGroup) {
679
                return new JsonModel([
680
                    'success' => false,
681
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
682
                ]);
683
            }
684
 
685
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
686
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
687
 
688
            if($chatGroupOwner->user_id != $currentUser->id) {
689
                return new JsonModel([
690
                    'success' => false,
691
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
692
                ]);
693
            }
694
 
695
            $userMapper = UserMapper::getInstance($this->adapter);
696
            $user = $userMapper->fetchOneByUuid($user_id);
697
 
698
            if(!$user) {
699
                return new JsonModel([
700
                    'success' => false,
701
                    'data' => 'ERROR_USER_NOT_FOUND'
702
                ]);
703
            }
704
 
705
            if($chatGroupOwner->user_id == $user->id) {
706
                return new JsonModel([
707
                    'success' => false,
708
                    'data' => 'ERROR_CHAT_I_CAN_NOT_REMOVE_MYSELF'
709
                ]);
710
            }
711
 
712
 
713
 
714
 
715
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
716
            if(!$chatGroupUser) {
717
                return new JsonModel([
718
                    'success' => false,
719
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
720
                ]);
721
            }
722
 
723
 
724
            $response = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroup->id, $user->id);
725
            if($response) {
726
                return new JsonModel([
727
                    'success' => true
728
                ]);
729
            } else {
730
                return new JsonModel([
731
                    'success' => false,
732
                    'data' => $chatGroupMapper->getError()
733
                ]);
734
            }
735
 
736
        } else {
737
            return new JsonModel([
738
                'success' => false,
739
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
740
            ]);
741
        }
742
    }
743
 
744
 
745
    /**
746
     * Abandonar un grupo
747
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/leave-group/:group_id) y la cuál se recibe en la función heartBeat.
748
     * Parámetros del route
749
     * :group_id = id del grupo encriptado
750
     * En caso de una respuesta positiva
751
     * [
752
     *      'success' => true,
753
     * ]
754
     * En caso de un respuesta negativa
755
     * [
756
     *      'success' => false,
757
     *      'data' => (string) 'mensaje_de_error'
758
     * ]
759
     * @return \Laminas\View\Model\JsonModel
760
     */
761
    public function leaveGroupAction()
762
    {
763
        $request    = $this->getRequest();
764
        if($request->isPost()) {
765
            $currentUserPlugin = $this->plugin('currentUserPlugin');
766
            $currentUser = $currentUserPlugin->getUser();
767
 
768
            $result = false;
769
            $group_id = $this->params()->fromRoute('group_id');
770
 
771
 
772
            if(empty($group_id)) {
773
                return new JsonModel([
774
                    'success' => false,
775
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
776
                ]);
777
            }
778
 
779
 
780
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
781
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
782
            if(!$chatGroup) {
783
                return new JsonModel([
784
                    'success' => false,
785
                    'data' => 'ERROR_GROUP_NOT_FOUND'
786
                ]);
787
            }
788
 
789
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
790
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
791
            if(!$chatGroupUser) {
792
                return new JsonModel([
793
                    'success' => false,
794
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
795
                ]);
796
            }
797
 
798
            if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
799
                return new JsonModel([
800
                    'success' => false,
801
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_OWNER'
802
                ]);
803
            }
804
 
805
 
806
            $result = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroupUser->group_id, $chatGroupUser->user_id);
807
            if($result) {
808
                return new JsonModel([
809
                    'success' => true
810
                ]);
811
            } else {
812
                return new JsonModel([
813
                    'success' => false,
814
                    'data' => $chatGroupMapper->getError()
815
                ]);
816
            }
817
 
818
 
819
 
820
        } else {
821
            return new JsonModel([
822
                'success' => false,
823
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
824
            ]);
825
        }
826
 
827
    }
828
 
829
    /**
830
     *
831
     * @param ChatGroup $chatGroup
832
     * @param int $page
833
     * @return array
834
     */
835
    private function getAllMessagesForChatGroup($chatGroup, $page = 0)
836
    {
837
        $currentUserPlugin = $this->plugin('currentUserPlugin');
838
        $currentUser = $currentUserPlugin->getUser();
839
 
840
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
841
        $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
842
 
843
        if(!$chatGroupUser) {
844
            return [
845
                'success' => false,
846
                'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
847
            ];
848
        }
849
 
850
        if(!in_array(trim($chatGroup->uuid), $_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
851
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES][] = $chatGroup->uuid;
852
        }
853
 
854
        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
855
        $paginator = $chatGroupMessageMapper->getPaginatorByGroupId($chatGroup->id, $page);
856
 
857
        $pages = $paginator->count();
858
        $page  = $paginator->getCurrentPageNumber();
859
 
860
        $items = [];
861
        $users = [];
862
        $userMapper = UserMapper::getInstance($this->adapter);
863
 
864
        foreach ($paginator as $m)
865
        {
866
 
867
            if (isset($users[$m->sender_id])) {
868
                $userdata_from = $users[$m->sender_id];
869
            } else {
870
                $userdata_from = $userMapper->fetchOne($m->sender_id);
871
                $users[ $m->sender_id ] = $userdata_from;
872
            }
873
 
874
            $pic_from = $this->url()->fromRoute('storage', [
875
                'code' => $userdata_from->uuid,
876
                'type' => 'user',
877
                'filename' => $userdata_from->image
878
            ]);
879
            $u =  $userdata_from->id == $currentUser->id ? 1 : 2;
880
            if($m->type == ChatGroupMessage::TYPE_TEXT) {
881
                $content = $this->sanitize($m->content);
882
            } else {
883
                $content = $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $m->content]);
884
            }
885
 
886
            $msgtime = $this->timeAgo($m->added_on);
887
            array_push($items, [
888
                'user_name' => trim($userdata_from->first_name . ' ' .$userdata_from->last_name) ,
889
                'user_id' => $userdata_from->uuid,
890
                'user_image' => $pic_from,
891
                'u' => $u,
892
                'mtype' => $m->type,
893
                'm' => $content,
894
                'time' => $msgtime,
895
                'id' => $m->uuid
896
            ]);
897
        }
898
 
899
        return [
900
            'success' => true,
901
            'data' => [
902
                'page' => $page,
903
                'pages' => $pages,
904
                'items' => $items
905
            ]
906
        ];
907
 
908
 
909
    }
910
 
911
    /**
912
     *
913
     * @param ChatUser $chatUser
914
     * @param int $page
915
     * @return array
916
     */
917
    private function getAllMessagesForChatUser($chatUser, $page = 0)
918
    {
919
        $currentUserPlugin = $this->plugin('currentUserPlugin');
920
        $currentUser = $currentUserPlugin->getUser();
921
 
922
        if(!in_array(trim($chatUser->uuid), $_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
923
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES][] = $chatUser->uuid;
924
        }
925
 
926
        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
927
        $paginator = $chatMessageMapper->getAllMessagesPaginatorByChatId($chatUser->id, $page);
928
        $pages = $paginator->count();
929
        $page = $paginator->getCurrentPageNumber();
930
 
931
        $items = [];
932
        $users = [];
933
        $userMapper = UserMapper::getInstance($this->adapter);
934
 
935
        $messages = $paginator->getCurrentItems();
936
        foreach ($messages as $m) {
937
            $from_id = (int) $m->from_id;
938
            $to_id = (int) $m->to_id;
939
 
940
            if (isset($users[$from_id])) {
941
                $userdata_from = $users[$from_id];
942
            } else {
943
                $userdata_from = $userMapper->fetchOne($from_id);
944
                $users[$from_id] = $userdata_from;
945
            }
946
 
947
            $pic_from = $this->url()->fromRoute('storage', [
948
                'code' => $userdata_from->uuid,
949
                'type' => 'user',
950
                'filename' => $userdata_from->image
951
            ]);
952
 
953
            if (isset($users[$to_id])) {
954
                $userdata_to = $users[$to_id];
955
            } else {
956
                $userdata_to = $userMapper->fetchOne($to_id);
957
                $users[ $to_id ] = $userdata_to;
958
            }
959
 
960
            $u = $m->from_id == $currentUser->id ? 1 : 2;
961
 
962
 
963
            if($m->type == ChatMessage::TYPE_TEXT) {
964
                $content = $this->sanitize($m->content);
965
            } else {
966
                $content = $this->url()->fromRoute('storage', ['code' => $chatUser->uuid, 'type' => 'chat', 'filename' => $m->content]);
967
            }
968
 
969
            $msgtime = $this->timeAgo($m->added_on);
970
            array_push($items, [
971
                'user_name' => ($userdata_from->first_name . ' ' . $userdata_from->last_name),
972
                'user_id' => $userdata_from->uuid,
973
                'user_image' => $pic_from,
974
                'u' => $u,
975
                'mtype' => $m->type,
976
                'm' => $content,
977
                'time' => $msgtime,
978
                'id' => $m->uuid,
979
            ]);
980
        }
981
 
982
 
983
        if ($this->isInactiveConnection($currentUser->last_heart_beat_at ? $currentUser->last_heart_beat_at : '')) {
984
            $userMapper->updateChatOfflineStatus($currentUser->id);
985
            $online = false;
986
        } else {
987
            $online = true;
988
        }
989
 
990
 
991
        return [
992
            'success' => true,
993
            'data' => [
994
                'page' => $page,
995
                'pages' => $pages,
996
                'items' => $items,
997
                'online' => $online
998
            ]
999
        ];
1000
    }
1001
 
1002
    /**
1003
     * Recupera los mensajes de un chat individual o grupal
1004
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-all-messages/:id) y la cuál se recibe en la función heartBeat.
1005
     * En caso de una respuesta positiva
1006
     * [
1007
     *      'success' => true,
1008
     *      'data' => [
1009
     *          'page' => 'entero número de página actúal',
1010
     *          'pages' => 'entero número total de páginaS',
1011
     *              'items' => [
1012
     *              'user_name' => 'nombre del usuario que envia',
1013
     *              'user_id_encript' => 'id encriptado del usuario que envia',
1014
     *              'user_image' => 'ruta de la imagén del usuario que envia',
1015
     *              'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1016
     *              'mtype' => 'text | file',
1017
     *              'm' => 'texto del mensaje o url del archivo',
1018
     *              'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1019
     *          ],
1020
     *          'online' => 'true/false'
1021
     *      ]
1022
     * ]
1023
     * En caso de un respuesta negativa
1024
     * [
1025
     *      'success' => false,
1026
     *      'data' => (string) 'mensaje_de_error'
1027
     * ]
1028
     * @return \Laminas\View\Model\JsonModel
1029
     */
1030
    public function getAllMessagesAction()
1031
    {
1032
 
1033
        $request    = $this->getRequest();
1034
        if($request->isGet()) {
1035
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1036
            $currentUser = $currentUserPlugin->getUser();
1037
 
1038
 
1039
            $id     = $this->params()->fromRoute('id');
1040
            $page   = filter_var($this->params()->fromQuery('page', 0), FILTER_SANITIZE_NUMBER_INT);
1041
 
1042
            if(!$id) {
1043
                return new JsonModel([
1044
                    'success' => false,
1045
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1046
                ]);
1047
            }
1048
 
1049
            /**** Mensajes de un chat grupal ****/
1050
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1051
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1052
            if ($chatGroup) {
1053
                $response = $this->getAllMessagesForChatGroup($chatGroup, $page);
1054
                return new JsonModel($response);
1055
            } else {
1056
 
1057
                $userMapper = UserMapper::getInstance($this->adapter);
1058
                $user = $userMapper->fetchOneByUuid($id);
1059
                if(!$user) {
1060
                    return new JsonModel([
1061
                        'success' => false,
1062
                        'data' => 'ERROR_USER_NOT_FOUND'
1063
                    ]);
1064
                }
1065
 
1066
 
1067
 
1068
 
1069
 
1070
 
1071
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1072
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1073
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1074
 
1075
                    return new JsonModel([
1076
                        'success' => false,
1077
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1078
                    ]);
1079
 
1080
                }
1081
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1082
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1083
                if(!$chatUser) {
1084
                    $chatUser = new ChatUser();
1085
                    $chatUser->user_id1 = $currentUser->id;
1086
                    $chatUser->user_id2 = $user->id;
1087
 
1088
                    $response = $chatUserMapper->insert($chatUser);
1089
 
1090
 
1091
                    if(!$response) {
1092
                        return new JsonModel([
1093
                            'success' => false,
1094
                            'data' => $chatUserMapper->getError()
1095
                        ]);
1096
                    }
1097
 
1098
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1099
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1100
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1101
                    if (! file_exists($dirpath)) {
1102
                        mkdir($dirpath, 0777, true);
1103
                        chmod($dirpath, 0777);
1104
                    }
1105
 
1106
                }
1107
 
1108
 
1109
 
1110
                $response = $this->getAllMessagesForChatUser($chatUser, $page);
1111
                return new JsonModel($response);
1112
 
1113
            }
1114
 
1115
        } else {
1116
            return new JsonModel([
1117
                'success' => false,
1118
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1119
            ]);
1120
        }
1121
 
1122
    }
1123
 
1124
    /**
1125
     * Envia un mensaje a un chat individual o grupal
1126
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/send/:id) y la cuál se recibe en la función heartBeat.
1127
     * Parámetros del route
1128
     * :id = id del chat encriptado
1129
     * Como parámentro solo se espera un campo
1130
     * message: string
1131
     * En caso de una respuesta positiva
1132
     * [
1133
     *      'success' => true,
1134
     *      'user_name' => 'nombre del usuario que envia',
1135
     *      'user_id_encripted' => 'id encriptado del usuario que envia',
1136
     *      'user_image' => 'ruta de la imagén del usuario que envia',
1137
     *      'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1138
     *      'mtype' => 'text | file',
1139
     *      'm' => 'texto del mensaje o url del archivo',
1140
     *      'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1141
      * ]
1142
     * En caso de un respuesta negativa
1143
     * [
1144
     *      'success' => false,
1145
     *      'data' => (string) 'mensaje_de_error'
1146
     * ]
1147
     * @return \Laminas\View\Model\JsonModel
1148
     */
1149
    public function sendAction()
1150
    {
1151
 
1152
        $request    = $this->getRequest();
1153
        if($request->isPost()) {
1154
            $id         = $this->params()->fromRoute('id');
1155
            $message    = trim(filter_var($this->params()->fromPost('message', ''), FILTER_SANITIZE_STRING));
1156
 
1157
            if(!$id || empty($message)) {
1158
                return new JsonModel([
1159
                    'success' => false,
1160
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1161
                ]);
1162
            }
1163
 
1164
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1165
            $currentUser = $currentUserPlugin->getUser();
1166
 
1167
            $userMapper = UserMapper::getInstance($this->adapter);
1168
            $sender_result = $userMapper->fetchOne($currentUser->id);
1169
            $sender_name = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1170
            $sender_pic = $this->url()->fromRoute('storage', [
1171
                'code' => $sender_result->uuid,
1172
                'type' => 'user',
1173
                'filename' => $sender_result->image
1174
            ]);
1175
 
1176
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1177
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1178
            if($chatGroup) {
1179
 
1180
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1181
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1182
 
1183
                if(!$chatGroupUser) {
1184
                    return new JsonModel([
1185
                        'success' => false,
1186
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1187
                    ]);
1188
                }
1189
 
1190
                $chatGroupMessage = new ChatGroupMessage();
1191
                $chatGroupMessage->sender_id = $currentUser->id;
1192
                $chatGroupMessage->group_id = $chatGroup->id;
1193
                $chatGroupMessage->content = $message;
1194
                $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
1195
 
1196
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1197
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
1198
                if(!$result) {
1199
                    return new JsonModel([
1200
                        'success' => false,
1201
                        'data' => $chatGroupMessageMapper->getError()
1202
                    ]);
1203
                }
1204
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1205
 
1206
 
1207
                $chatGroupUserMessage = new ChatGroupUserMessage();
1208
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1209
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1210
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1211
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1212
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
1213
 
1214
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1215
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1216
                if(!$result) {
1217
                    return new JsonModel([
1218
                        'success' => false,
1219
                        'data' => $chatGroupUserMessageMapper->getError()
1220
                    ]);
1221
                }
1222
 
1223
 
1224
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1225
                foreach ($results as $r)
1226
                {
1227
                    if ($r->user_id != $currentUser->id) {
1228
                        $chatGroupUserMessage               = new ChatGroupUserMessage();
1229
                        $chatGroupUserMessage->group_id     = $chatGroupMessage->group_id;
1230
                        $chatGroupUserMessage->message_id   = $chatGroupMessage->id;
1231
                        $chatGroupUserMessage->receiver_id  = $r->user_id;
1232
                        $chatGroupUserMessage->recd         = ChatGroupUserMessage::RECD_NO;
1233
                        $chatGroupUserMessage->seen         = ChatGroupUserMessage::SEEN_NO;
1234
 
1235
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1236
                        if(!$result) {
1237
                            return new JsonModel([
1238
                                'success' => false,
1239
                                'data' => $chatGroupUserMessageMapper->getError()
1240
                            ]);
1241
                        }
1242
                    }
1243
                }
1244
 
1245
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
1246
                return new JsonModel([
1247
                    'success' => true,
1248
                    'data' => [
1249
                        'user_name'         => $sender_name,
1250
                        'user_id_encripted' => $sender_result->uuid,
1251
                        'user_image'        => $sender_pic,
1252
                        'u'                 => 1,
1253
                        'mtype'             => 'text',
1254
                        'm'                 => $message,
1255
                        'time'              => $msgtime,
1256
                        'id'                => $chatGroupMessage->uuid,
1257
                    ]
1258
                ]);
1259
 
1260
 
1261
 
1262
            } else {
1263
                $userMapper = UserMapper::getInstance($this->adapter);
1264
                $user = $userMapper->fetchOneByUuid($id);
1265
                if(!$user) {
1266
                    return new JsonModel([
1267
                        'success' => false,
1268
                        'data' => 'ERROR_USER_NOT_FOUND'
1269
                    ]);
1270
                }
1271
 
1272
 
1273
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1274
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1275
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1276
 
1277
                    return new JsonModel([
1278
                        'success' => false,
1279
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1280
                    ]);
1281
 
1282
                }
1283
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1284
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1285
                if(!$chatUser) {
1286
                    $chatUser = new ChatUser();
1287
                    $chatUser->user_id1 = $currentUser->id;
1288
                    $chatUser->user_id2 = $user->id;
1289
 
1290
                    $response = $chatUserMapper->insert($chatUser);
1291
                    if(!$response) {
1292
                        return new JsonModel([
1293
                            'success' => false,
1294
                            'data' => $chatUserMapper->getError()
1295
                        ]);
1296
                    }
1297
 
1298
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1299
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1300
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1301
                    if (! file_exists($dirpath)) {
1302
                        mkdir($dirpath, 0777, true);
1303
                        chmod($dirpath, 0777);
1304
                    }
1305
 
1306
                }
1307
 
1308
 
1309
 
1310
                $chatMessage = new ChatMessage();
1311
                $chatMessage->chat_id   = $chatUser->id;
1312
                $chatMessage->from_id   = $currentUser->id;
1313
                $chatMessage->to_id     = $user->id;
1314
                $chatMessage->content   = $message;
1315
                $chatMessage->type      = ChatMessage::TYPE_TEXT;
1316
                $chatMessage->recd      = ChatMessage::RECD_NO;
1317
                $chatMessage->seen      = ChatMessage::SEEN_NO;
1318
 
1319
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
1320
                $result = $chatMessageMapper->insert($chatMessage);
1321
                if(!$result) {
1322
                    return new JsonModel([
1323
                        'success' => false,
1324
                        'data' => $chatMessageMapper->getError()
1325
                    ]);
1326
                }
1327
 
1328
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
1329
 
1330
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
1331
                return new JsonModel([
1332
                    'success' => true,
1333
                    'data' => [
1334
                        'user_name'     => $sender_name,
1335
                        'user_id'       => $sender_result->uuid,
1336
                        'user_image'    => $sender_pic,
1337
                        'u'             => 1,
1338
                        'mtype'         => ChatMessage::TYPE_TEXT,
1339
                        'm'             => $message,
1340
                        'time'          => $msgtime,
1341
                        'id'            => $chatMessage->uuid,
1342
                    ]
1343
                 ]);
1344
 
1345
 
1346
            }
1347
            return new JsonModel($response);
1348
 
1349
        } else {
1350
            return new JsonModel([
1351
                'success' => false,
1352
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1353
            ]);
1354
        }
1355
 
1356
    }
1357
 
1358
    /**
1359
     * Esta función recuperar los contactos disponibles para agregarlos a un grupo
1360
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-contacts-availables-for-group/:group_id) y la cuál se recibe en la función heartBeat.
1361
     * con el siguiente parámetro
1362
     * uid = id encriptado del usuario
1363
     * retorna un json en caso de ser  positivo
1364
     * [
1365
     *  'success' : true,
1366
     *  'data' : [
1367
     *     [
1368
     *       'id'                    => 'id del usuario encriptado',
1369
     *       'name'                  => 'nombre del usuario',
1370
     *       'image'                 => 'imagen del usuario',
1371
     *       'type'                  => 'user' //fixed,
1372
     *       'online'                => $online,
1373
     *     ]
1374
     * ]
1375
     * En caso de ser negativo puede haber 2 formatos
1376
     * [
1377
     *  'success' : false,
1378
     *  'data' : mensaje de error
1379
     * ]
1380
     * @return \Laminas\View\Model\JsonModel
1381
     */
1382
    public function contactAvailableGroupListAction()
1383
    {
1384
        $request    = $this->getRequest();
1385
        if($request->isGet()) {
1386
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1387
            $currentUser = $currentUserPlugin->getUser();
1388
 
1389
            $id = $this->params()->fromRoute('group_id');
1390
            if(!$id) {
1391
                return new JsonModel([
1392
                    'success' => false,
1393
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1394
                ]);
1395
            }
1396
 
1397
            $userMapper = UserMapper::getInstance($this->adapter);
1398
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1399
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1400
 
1401
            if(!$chatGroup) {
1402
                return new JsonModel([
1403
                    'success' => false,
1404
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1405
                ]);
1406
            }
1407
 
1408
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1409
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1410
 
1411
            if($chatGroupOwner->user_id != $currentUser->id) {
1412
                return new JsonModel([
1413
                    'success' => false,
1414
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1415
                ]);
1416
            }
1417
 
1418
 
1419
 
1420
            $contact_ids = [];
1421
            $contacts = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1422
            foreach($contacts as $contact)
1423
            {
1424
                array_push($contact_ids, $contact->user_id);
1425
            }
1426
 
1427
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1428
            $connection_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1429
            $connection_ids = array_filter($connection_ids, function($var) use ( $contact_ids) {
1430
                return !in_array($var, $contact_ids);
1431
            });
1432
 
1433
 
1434
            $items = [];
1435
            foreach ($connection_ids as $connection_id)
1436
            {
1437
                $user = $userMapper->fetchOne($connection_id);
1438
                if (! $user) {
1439
                    continue;
1440
                }
1441
 
1442
                $name   = trim($user->first_name . ' ' . $user->last_name);
1443
                $image  = $this->url()->fromRoute('storage', [
1444
                    'code' => $user->uuid,
1445
                    'type' => 'user',
1446
                    'filename' => $user->image
1447
                ]);
1448
 
1449
 
1450
                if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
1451
                    $userMapper->updateChatOfflineStatus($user->id);
1452
                    $online = false;
1453
                } else {
1454
                    $online = true;
1455
                }
1456
 
1457
 
1458
                array_push($items, [
1459
                    'id'        => $user->uuid,
1460
                    'name'      => $name,
1461
                    'image'     => $image,
1462
                    'online'    => $online,
1463
                ]);
1464
            }
1465
 
1466
 
1467
            return new JsonModel([
1468
                'success' => true,
1469
                'data' => $items,
1470
            ]);
1471
 
1472
        } else {
1473
            return new JsonModel([
1474
                'success' => false,
1475
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1476
            ]);
1477
        }
1478
 
1479
    }
1480
 
1481
    /**
1482
     * Esta función recuperar los contactos de un grupo
1483
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-contact-group-list/:group_id) y la cuál se recibe en la función heartBeat.
1484
     * con el siguiente parámetro
1485
     * uid = id encriptado del usuario
1486
     * retorna un json en caso de ser  positivo
1487
     * [
1488
     *  'success' : true,
1489
     *  'data' : [
1490
     *     [
1491
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
1492
     *       'id'                    => 'id del usuario encriptado',
1493
     *       'name'                  => 'nombre del usuario',
1494
     *       'image'                 => 'imagen del usuario',
1495
     *       'type'                  => 'user' //fixed,
1496
     *       'online'                => $online,
1497
     *     ]
1498
     * ]
1499
     * En caso de ser negativo puede haber 2 formatos
1500
     * [
1501
     *  'success' : false,
1502
     *  'data' : mensaje de error
1503
     * ]
1504
     * o
1505
     * [
1506
     *  'success' : false,
1507
     *  'data' : [
1508
     *      'fieldname' : [
1509
     *          'mensaje de error'
1510
     *      ]
1511
     *  ]
1512
     * ]
1513
     * @return \Laminas\View\Model\JsonModel
1514
     */
1515
 
1516
    public function contactGroupListAction()
1517
    {
1518
 
1519
        $request    = $this->getRequest();
1520
        if($request->isGet()) {
1521
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1522
            $currentUser = $currentUserPlugin->getUser();
1523
 
1524
            $id = $this->params()->fromRoute('group_id');
1525
            if(!$id) {
1526
                return new JsonModel([
1527
                    'success' => false,
1528
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1529
                ]);
1530
            }
1531
 
1532
            $userMapper = UserMapper::getInstance($this->adapter);
1533
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1534
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1535
 
1536
            if(!$chatGroup) {
1537
                return new JsonModel([
1538
                    'success' => false,
1539
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1540
                ]);
1541
            }
1542
 
1543
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1544
 
1545
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1546
 
1547
            if(!$chatGroupUser) {
1548
                return new JsonModel([
1549
                    'success' => false,
1550
                    'data' => 'ERROR_CHAT_GROUP_USER_NOT_FOUND'
1551
                ]);
1552
            }
1553
 
1554
            $items = [];
1555
            $chatGroupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1556
            foreach ($chatGroupUsers as $chatGroupUser)
1557
            {
1558
                $user = $userMapper->fetchOne((int) $chatGroupUser->user_id);
1559
                if (! $user) {
1560
                    continue;
1561
                }
1562
 
1563
                $name   = trim($user->first_name . ' ' . $user->last_name);
1564
                $image  = $this->url()->fromRoute('storage', [
1565
                    'code' => $user->uuid,
1566
                    'type' => 'user',
1567
                    'filename' => $user->image
1568
                ]);
1569
 
1570
 
1571
                if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1572
                    $url_remove_from_group = '';
1573
 
1574
                } else {
1575
                    $url_remove_from_group = $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid ]);
1576
                }
1577
 
1578
 
1579
                if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
1580
                    $userMapper->updateChatOfflineStatus($user->id);
1581
                    $online = false;
1582
                } else {
1583
                    $online = true;
1584
                }
1585
 
1586
                array_push($items, [
1587
                    'url_remove_from_group' => $url_remove_from_group,
1588
                    'id'                    => $user->uuid,
1589
                    'name'                  => $name,
1590
                    'image'                 => $image,
1591
                    'online'                => $online,
1592
                ]);
1593
 
1594
            }
1595
 
1596
            return new JsonModel([
1597
                'success' => true,
1598
                'data' => $items,
1599
            ]);
1600
 
1601
        } else {
1602
            return new JsonModel([
1603
                'success' => false,
1604
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1605
            ]);
1606
        }
1607
    }
1608
 
1609
    /**
1610
     * Elimina un grupo de chat, solo el owner puede realizarla
1611
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/delete-group/:group_id) y la cuál se recibe en la función heartBeat.
1612
     * Parámetros del route
1613
     * :group_id = id del grupo encriptado
1614
     * En caso de una respuesta positiva
1615
     * [
1616
     *      'success' => true,
1617
     *      'data'=> (int) registros_borrados
1618
     * ]
1619
     * En caso de un respuesta negativa
1620
     * [
1621
     *      'success' => false,
1622
     *      'data' => (string) 'mensaje_de_error'
1623
     * ]
1624
     * @return \Laminas\View\Model\JsonModel
1625
     */
1626
    public function deleteGroupAction()
1627
    {
1628
 
1629
        $request    = $this->getRequest();
1630
        if($request->isPost()) {
1631
 
1632
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1633
            $currentUser = $currentUserPlugin->getUser();
1634
 
1635
            $id = trim(filter_var($this->params()->fromRoute('group_id'), FILTER_SANITIZE_STRING));
1636
            if(!$id) {
1637
                return new JsonModel([
1638
                    'success' => false,
1639
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1640
                ]);
1641
            }
1642
 
1643
 
1644
 
1645
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1646
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1647
 
1648
            if(!$chatGroup) {
1649
                return new JsonModel([
1650
                    'success' => false,
1651
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1652
                ]);
1653
            }
1654
 
1655
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1656
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1657
 
1658
            if($chatGroupOwner->user_id != $currentUser->id) {
1659
                return new JsonModel([
1660
                    'success' => false,
1661
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1662
                ]);
1663
            }
1664
 
1665
 
1666
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1667
            $result = $chatGroupUserMessageMapper->deleteAllByGroupId($chatGroup->id);
1668
            if(!$result) {
1669
                return new JsonModel([
1670
                    'success' => false,
1671
                    'data' => $chatGroupUserMessageMapper->getError()
1672
                ]);
1673
            }
1674
 
1675
            $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1676
            $result = $chatGroupMessageMapper->deleteAllByGroupId($chatGroup->id);
1677
            if(!$result) {
1678
                return new JsonModel([
1679
                    'success' => false,
1680
                    'data' => $chatGroupMessageMapper->getError()
1681
                ]);
1682
            }
1683
 
1684
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1685
            $result = $chatGroupUserMapper->deleteAllByGroupId($chatGroup->id);
1686
            if(!$result) {
1687
                return new JsonModel([
1688
                    'success' => false,
1689
                    'data' => $chatGroupUserMapper->getError()
1690
                ]);
1691
            }
1692
 
1693
            $chatGroupMapper->deleteByGroupId($chatGroup->id);
1694
            if(!$result) {
1695
                return new JsonModel([
1696
                    'success' => false,
1697
                    'data' => $chatGroupMapper->getError()
1698
                ]);
1699
            }
1700
 
1701
 
1702
            $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1703
            $dirpath = $fullpath_chat . $chatGroup->uuid;
1704
 
1705
            Functions::rmDirRecursive($dirpath);
1706
 
1707
            return new JsonModel([
1708
                'success' => true
1709
            ]);
1710
 
1711
 
1712
        } else {
1713
            return new JsonModel([
1714
                'success' => false,
1715
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1716
            ]);
1717
 
1718
        }
1719
    }
1720
 
1721
    /**
1722
     * Cerrar el chat, consiste en borrar de la variable de sessión para que el mismo no se presente la siguiente vez abierto ,
1723
     * al menos que tenga mensajes sin leer
1724
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/close/:id)  y la cuál se recibe en la función heartBeat.
1725
     * Parámetros del route
1726
     * :id = id del chat encriptado
1727
     * En caso de una respuesta positiva
1728
     * [
1729
     *  'success' => true
1730
     * ]
1731
     * En caso de un respuesta negativa
1732
     * [
1733
     *  'success' => false,
1734
     *  'data'  => mensaje_de_error
1735
     * ]
1736
     * @return \Laminas\View\Model\JsonModel
1737
     */
1738
    public function closeAction()
1739
    {
1740
        $request    = $this->getRequest();
1741
        if($request->isPost()) {
1742
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1743
            $currentUser = $currentUserPlugin->getUser();
1744
 
1745
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1746
 
1747
            if (!$id) {
1748
                return new JsonModel([
1749
                    'success' => false,
1750
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1751
                ]);
1752
            }
1753
 
1754
            $uuid = '';
1755
 
1756
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1757
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1758
            if ($chatGroup) {
1759
                $uuid = $chatGroup->uuid;
1760
            } else {
1761
 
1762
                $userMapper = UserMapper::getInstance($this->adapter);
1763
                $user = $userMapper->fetchOneByUuid($id);
1764
                if(!$user) {
1765
                    return new JsonModel([
1766
                        'success' => false,
1767
                        'data' => 'ERROR_USER_NOT_FOUND'
1768
                    ]);
1769
                }
1770
 
1771
 
1772
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1773
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1774
                if($chatUser) {
1775
                    $uuid = $chatUser->uuid;
1776
                }
1777
            }
1778
 
1779
            if($uuid) {
1780
                $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = array_filter($_SESSION[self::SESSION_CHAT_OPEN_BOXES], function($var) use($uuid)  {
1781
                    return $uuid != $var;
1782
                });
1783
            }
1784
 
1785
            return new JsonModel([
1786
                'success' => true
1787
            ]);
1788
        } else {
1789
            return new JsonModel([
1790
                'success' => false,
1791
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1792
            ]);
1793
        }
1794
    }
1795
 
1796
    /**
1797
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1798
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/clear/:id) y la cuál se recibe en la función heartBeat.
1799
     * Parámetros del route
1800
     * :id = id del usuario encriptado
1801
     * En caso de una respuesta positiva
1802
     * [
1803
     *      'success' => true,
1804
     *      'data'=> (int) registros_borrados
1805
     * ]
1806
     * En caso de un respuesta negativa
1807
     * [
1808
     *      'success' => false,
1809
     *      'data' => (string) 'mensaje_de_error'
1810
     * ]
1811
     * @return \Laminas\View\Model\JsonModel
1812
     */
1813
    public function clearAction()
1814
    {
1815
        $request    = $this->getRequest();
1816
        if($request->isPost()) {
1817
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1818
            $currentUser = $currentUserPlugin->getUser();
1819
 
1820
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1821
 
1822
            if (!$id) {
1823
                return new JsonModel([
1824
                    'success' => false,
1825
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1826
                ]);
1827
            }
1828
 
1829
            $uuid = '';
1830
 
1831
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1832
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1833
            if ($chatGroup) {
1834
                $uuid = $chatGroup->uuid;
1835
            } else {
1836
 
1837
                $userMapper = UserMapper::getInstance($this->adapter);
1838
                $user = $userMapper->fetchOneByUuid($id);
1839
                if(!$user) {
1840
                    return new JsonModel([
1841
                        'success' => false,
1842
                        'data' => 'ERROR_USER_NOT_FOUND'
1843
                    ]);
1844
                }
1845
 
1846
 
1847
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1848
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1849
                if($chatUser) {
1850
                    $uuid = $chatUser->uuid;
1851
                }
1852
            }
1853
 
1854
            if($uuid) {
1855
                $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = array_filter($_SESSION[self::SESSION_CHAT_OPEN_BOXES], function($var) use($uuid)  {
1856
                    return $uuid != $var;
1857
                });
1858
            }
1859
 
1860
            return new JsonModel([
1861
                'success' => true
1862
            ]);
1863
        } else {
1864
            return new JsonModel([
1865
                'success' => false,
1866
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1867
            ]);
1868
        }
1869
    }
1870
 
1871
    public function uploadAction()
1872
    {
1873
        $request    = $this->getRequest();
1874
        if($request->isPost()) {
1875
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1876
            $currentUser = $currentUserPlugin->getUser();
1877
 
1878
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1879
            if (!$id) {
1880
                return new JsonModel([
1881
                    'success' => false,
1882
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1883
                ]);
1884
            }
1885
 
1886
            $files = $this->getRequest()->getFiles()->toArray();
1887
            if(!isset($files['file']) || !empty($files['file']['error'])) {
1888
                return new JsonModel([
1889
                    'success' => false,
1890
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
1891
                ]);
1892
            }
1893
 
1894
            $tmp_filename   = $files['file']['tmp_name'];
1895
            if(!$this->validMimeType($tmp_filename)) {
1896
                return new JsonModel([
1897
                    'success' => false,
1898
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
1899
                ]);
1900
            }
1901
 
1902
 
1903
            $extensions     = explode('.', $files['file']['name']);
1904
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
1905
            $filename       = uniqid() . '.' . $extension;
1906
 
1907
 
1908
            $mime_type = mime_content_type($tmp_filename);
1909
            if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
1910
                $file_type = 'image';
1911
            } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
1912
                $file_type = 'video';
1913
            } else if($mime_type == 'application/pdf') {
1914
                $file_type = 'document';
1915
            }
1916
 
1917
 
1918
            $userMapper = UserMapper::getInstance($this->adapter);
1919
            $sender_result = $userMapper->fetchOne($currentUser->id);
1920
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1921
            $sender_pic = $this->url()->fromRoute('storage', [
1922
                'code' => $sender_result->uuid,
1923
                'type' => 'user',
1924
                'filename' => $sender_result->image
1925
            ]);
1926
 
1927
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1928
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1929
            if($chatGroup) {
1930
 
1931
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1932
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1933
 
1934
                if(!$chatGroupUser) {
1935
                    return new JsonModel([
1936
                        'success' => false,
1937
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1938
                    ]);
1939
                }
1940
 
1941
 
1942
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1943
                $dirpath = $fullpath_chat . $chatGroup->uuid;
1944
                if (! file_exists($dirpath)) {
1945
                    mkdir($dirpath, 0777, true);
1946
                    chmod($dirpath, 0777);
1947
                }
1948
 
1949
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
1950
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
1951
                    return new JsonModel([
1952
                        'success' => false,
1953
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
1954
                    ]);
1955
                }
1956
 
1957
                $chatGroupMessage = new ChatGroupMessage();
1958
                $chatGroupMessage->sender_id    = $currentUser->id;
1959
                $chatGroupMessage->group_id     = $chatGroup->id;
1960
                $chatGroupMessage->content      = $filename;
1961
                $chatGroupMessage->type         = $file_type;
1962
 
1963
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1964
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
1965
                if(!$result) {
1966
                    return new JsonModel([
1967
                        'success' => false,
1968
                        'data' => $chatGroupMessageMapper->getError()
1969
                    ]);
1970
                }
1971
 
1972
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1973
 
1974
 
1975
                $chatGroupUserMessage = new ChatGroupUserMessage();
1976
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1977
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1978
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1979
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1980
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
1981
 
1982
 
1983
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1984
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1985
                if(!$result) {
1986
                    return new JsonModel([
1987
                        'success' => false,
1988
                        'data' => $chatGroupUserMessageMapper->getError()
1989
                    ]);
1990
                }
1991
 
1992
 
1993
 
1994
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1995
 
1996
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1997
                foreach ($results as $r)
1998
                {
1999
                    if ($r->user_id != $currentUser->id) {
2000
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2001
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2002
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2003
                        $chatGroupUserMessage->receiver_id= $r->user_id;
2004
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2005
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2006
 
2007
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2008
                        if(!$result) {
2009
                            return new JsonModel([
2010
                                'success' => false,
2011
                                'data' => $chatGroupUserMessageMapper->getError()
2012
                            ]);
2013
                        }
2014
 
2015
 
2016
                    }
2017
                }
2018
 
2019
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
2020
                return new JsonModel([
2021
                    'success' => true,
2022
                    'data' => [
2023
                        'user_name'     => $sender_from,
2024
                        'user_id'       => $currentUser->uuid,
2025
                        'user_image'    => $sender_pic,
2026
                        'u'             => 1,
2027
                        'mtype'         => $file_type,
2028
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename]),
2029
                        'time'          => $msgtime,
2030
                        'id'            => $chatGroupMessage->uuid
2031
                    ]
2032
                ]);
2033
 
2034
 
2035
            } else {
2036
 
2037
                $user = $userMapper->fetchOneByUuid($id);
2038
                if(!$user) {
2039
                    return new JsonModel([
2040
                        'success' => false,
2041
                        'data' => 'ERROR_USER_NOT_FOUND'
2042
                    ]);
2043
                }
2044
 
2045
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2046
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2047
                if(!$chatUser) {
2048
                    return new JsonModel([
2049
                        'success' => false,
2050
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2051
                    ]);
2052
                }
2053
 
2054
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2055
                $dirpath = $fullpath_chat . $chatUser->uuid;
2056
 
2057
                if (! file_exists($dirpath)) {
2058
                    mkdir($dirpath, 0777, true);
2059
                    chmod($dirpath, 0777);
2060
                }
2061
 
2062
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2063
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2064
                    return new JsonModel([
2065
                        'success' => false,
2066
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2067
                    ]);
2068
                }
2069
 
2070
                $chatMessage = new ChatMessage();
2071
                $chatMessage->chat_id = $chatUser->id;
2072
                $chatMessage->from_id = $currentUser->id;
2073
                $chatMessage->to_id = $user->id;
2074
                $chatMessage->content = $filename;
2075
                $chatMessage->type = $file_type;
2076
                $chatMessage->recd = ChatMessage::RECD_NO;
2077
                $chatMessage->seen = ChatMessage::SEEN_NO;
2078
 
2079
 
2080
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2081
                $result = $chatMessageMapper->insert($chatMessage);
2082
                if(!$result) {
2083
                    return new JsonModel([
2084
                        'success' => false,
2085
                        'data' =>  $chatMessageMapper->getError()
2086
                    ]);
2087
                }
2088
 
2089
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
2090
 
2091
 
2092
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
2093
                return new JsonModel([
2094
                    'success' => true,
2095
                    'data' => [
2096
                        'user_name' => $sender_from,
2097
                        'user_id' => $currentUser->uuid,
2098
                        'user_image' => $sender_pic,
2099
                        'u' => 1,
2100
                        'mtype' => $file_type,
2101
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename]),
2102
                        'time' => $msgtime,
2103
                        'id' => $chatMessage->uuid
2104
                    ]
2105
                ]);
2106
 
2107
            }
2108
        } else {
2109
            return new JsonModel([
2110
                'success' => false,
2111
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2112
            ]);
2113
        }
2114
    }
2115
 
2116
    public function markSeenAction()
2117
    {
2118
        $request = $this->getRequest();
2119
        if($request->isPost()) {
2120
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2121
            $currentUser = $currentUserPlugin->getUser();
2122
 
2123
            $id = $this->params()->fromRoute('id');
2124
            if (!$id) {
2125
                return new JsonModel([
2126
                    'success' => false,
2127
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2128
                ]);
2129
            }
2130
 
2131
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2132
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2133
 
2134
            if($chatGroup) {
2135
 
2136
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2137
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2138
 
2139
                if(!$chatGroupUser) {
2140
                    return new JsonModel([
2141
                        'success' => false,
2142
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2143
                    ]);
2144
                }
2145
 
2146
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2147
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2148
                if($result) {
2149
                    return new JsonModel([
2150
                        'success' => true,
2151
                    ]);
2152
                } else {
2153
                    return new JsonModel([
2154
                        'success' => false,
2155
                        'data' =>  $charGroupUserMessage->getError()
2156
                    ]);
2157
                }
2158
 
2159
 
2160
            } else {
2161
                $userMapper = UserMapper::getInstance($this->adapter);
2162
                $user = $userMapper->fetchOneByUuid($id);
2163
 
2164
                if(!$user) {
2165
                    return new JsonModel([
2166
                        'success' => false,
2167
                        'data' => 'ERROR_USER_NOT_FOUND'
2168
                    ]);
2169
                }
2170
 
2171
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2172
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2173
                if(!$chatUser) {
2174
                    return new JsonModel([
2175
                        'success' => false,
2176
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2177
                    ]);
2178
                }
2179
 
2180
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2181
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
2182
                if($result) {
2183
                    return new JsonModel([
2184
                        'success' => true,
2185
                    ]);
2186
                } else {
2187
                    return new JsonModel([
2188
                        'success' => false,
2189
                        'data' =>  $charGroupUserMessage->getError()
2190
                    ]);
2191
                }
2192
 
2193
            }
2194
 
2195
 
2196
        } else {
2197
            $response = [
2198
                'success' => false,
2199
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2200
            ];
2201
        }
2202
 
2203
        return new JsonModel($response);
2204
    }
2205
 
2206
 
2207
    public function markReceivedAction()
2208
    {
2209
        $request = $this->getRequest();
2210
        if($request->isPost()) {
2211
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2212
            $currentUser = $currentUserPlugin->getUser();
2213
 
2214
            $id = $this->params()->fromRoute('id');
2215
            if (!$id) {
2216
                return new JsonModel([
2217
                    'success' => false,
2218
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2219
                ]);
2220
            }
2221
 
2222
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2223
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2224
 
2225
            if($chatGroup) {
2226
 
2227
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2228
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2229
 
2230
                if(!$chatGroupUser) {
2231
                    return new JsonModel([
2232
                        'success' => false,
2233
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2234
                    ]);
2235
                }
2236
 
2237
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2238
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2239
                if($result) {
2240
                    return new JsonModel([
2241
                        'success' => true,
2242
                    ]);
2243
                } else {
2244
                    return new JsonModel([
2245
                        'success' => false,
2246
                        'data' =>  $charGroupUserMessage->getError()
2247
                    ]);
2248
                }
2249
 
2250
 
2251
            } else {
2252
                $userMapper = UserMapper::getInstance($this->adapter);
2253
                $user = $userMapper->fetchOneByUuid($id);
2254
 
2255
                if(!$user) {
2256
                    return new JsonModel([
2257
                        'success' => false,
2258
                        'data' => 'ERROR_USER_NOT_FOUND'
2259
                    ]);
2260
                }
2261
 
2262
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2263
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2264
                if(!$chatUser) {
2265
                    return new JsonModel([
2266
                        'success' => false,
2267
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2268
                    ]);
2269
                }
2270
 
2271
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2272
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
2273
                if($result) {
2274
                    return new JsonModel([
2275
                        'success' => true,
2276
                    ]);
2277
                } else {
2278
                    return new JsonModel([
2279
                        'success' => false,
2280
                        'data' =>  $charGroupUserMessage->getError()
2281
                    ]);
2282
                }
2283
 
2284
            }
2285
 
2286
 
2287
        } else {
2288
            $response = [
2289
                'success' => false,
2290
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2291
            ];
2292
        }
2293
 
2294
        return new JsonModel($response);
2295
    }
2296
 
2297
 
2298
 
2299
    /**
2300
     *
2301
     * @param string $file
2302
     * @return boolean
2303
     */
2304
    private function validMimeType($file)
2305
    {
2306
        /*
2307
         * image/jpeg jpeg jpg jpe
2308
         * image/gif gif
2309
         * image/png png
2310
         * video/mp4
2311
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
2312
         * video/x-flv flv
2313
         * application/msword doc dot
2314
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
2315
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
2316
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
2317
         * application/vnd.ms-powerpoint ppt pps pot
2318
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
2319
         * application/pdf pdf
2320
         */
2321
        $mime = mime_content_type($file);
2322
        $valid = false;
2323
        $types = [
2324
            'image/jpeg',
2325
            'image/gif',
2326
            'image/png',
2327
            'video/mp4',
2328
            'audio/mpeg',
2329
            'video/x-flv',
2330
            'application/msword',
2331
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
2332
            'application/vnd.ms-excel',
2333
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
2334
            'application/vnd.ms-powerpoint',
2335
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
2336
            'application/pdf'
2337
        ];
2338
        foreach ($types as $t) {
2339
            if (strpos($mime, $t) !== false) {
2340
                $valid = true;
2341
                break;
2342
            }
2343
        }
2344
        return $valid;
2345
    }
2346
 
2347
    /**
2348
     *
2349
     * @param string $text
2350
     * @return string
2351
     */
2352
    private function sanitize($text)
2353
    {
2354
        $text = htmlspecialchars($text, ENT_QUOTES);
2355
        $text = str_replace("\n\r", "\n", $text);
2356
        $text = str_replace("\r\n", "\n", $text);
2357
        $text = str_replace("\n", "<br>", $text);
2358
        return $text;
2359
    }
2360
 
2361
    /**
2362
     *
2363
     * @param string $timestamp
2364
     * @return string
2365
     */
2366
    private function timeAgo($timestamp)
2367
    {
2368
        $datetime1 = new \DateTime("now");
2369
        $datetime2 = date_create($timestamp);
2370
        $diff = date_diff($datetime1, $datetime2);
2371
        $timemsg = '';
2372
        if ($diff->y > 0) {
2373
            $timemsg = $diff->y . ' anio' . ($diff->y > 1 ? "s" : '');
2374
        } else if ($diff->m > 0) {
2375
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "s" : '');
2376
        } else if ($diff->d > 0) {
2377
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
2378
        } else if ($diff->h > 0) {
2379
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
2380
        } else if ($diff->i > 0) {
2381
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
2382
        } else if ($diff->s > 0) {
2383
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
2384
        }
2385
        if (!$timemsg) {
2386
            $timemsg = "Ahora";
2387
        } else {
2388
            $timemsg = $timemsg . '';
2389
        }
2390
        return $timemsg;
2391
    }
2392
 
2393
    /**
2394
     *
2395
     * @param string $timestamp
2396
     * @return boolean
2397
     */
2398
    private function isInactiveConnection($timestamp)
2399
    {
2400
        if (empty($timestamp)) {
2401
            return true;
2402
        }
2403
 
2404
        $now = date('Y-m-d H:i:s');
2405
        $datetime1 = date_create($now);
2406
        $datetime2 = date_create($timestamp);
2407
        $diff = date_diff($datetime1, $datetime2);
2408
 
2409
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
2410
            return true;
2411
        }
2412
 
2413
        return ($diff->s) > 15 ? true : false;
2414
    }
2415
}