Proyectos de Subversion LeadersLinked - Services

Rev

| Ultima modificación | Ver Log |

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