Proyectos de Subversion LeadersLinked - Backend

Rev

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