Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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