Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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