Proyectos de Subversion LeadersLinked - Backend

Rev

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