Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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