Proyectos de Subversion LeadersLinked - Services

Rev

| Ultima modificación | Ver Log |

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