Proyectos de Subversion LeadersLinked - Backend

Rev

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

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