Proyectos de Subversion LeadersLinked - Backend

Rev

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