Proyectos de Subversion LeadersLinked - Backend

Rev

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

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