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