Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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