Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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