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