Proyectos de Subversion LeadersLinked - Backend

Rev

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