Proyectos de Subversion LeadersLinked - Backend

Rev

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