Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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