Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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