Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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