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
        }
158
 
159
        return new JsonModel([
160
            'contacts' => $contacts,
161
            'groups' => $groups,
162
            'user_id' => $currentUser->id,
163
            'is_chat' => true,
164
            'timezone' => $currentUser->timezone,
165
        ]);
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
 
482
            $response = [
483
                'success' => true,
484
                'data' => $chats
485
            ];
486
        } else {
487
            $response = [
488
                'success' => false,
489
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
490
            ];
491
        }
492
 
493
        return new JsonModel($response);
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
 
570
                        $response = [
571
                            'success' => true,
572
                            'data' => $chatGroup->uuid,
573
                        ];
574
                    } else {
575
                        $response = [
576
                            'success' => false,
577
                            'data' => $chatGroupUserMapper->getError(),
578
                        ];
579
                    }
580
                } else {
581
                    $response = [
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
 
594
                return new JsonModel([
595
                    'success'   => false,
596
                    'data'   => $messages
597
                ]);
598
            }
599
        } else {
600
            $response = [
601
                'success' => false,
602
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
603
            ];
604
        }
605
 
606
        return new JsonModel($response);
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)) {
663
                return new JsonModel([
664
                    'success' => false,
665
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
666
                ]);
667
            }
668
 
669
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
670
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
671
            if (!$chatGroup) {
672
                return new JsonModel([
673
                    'success' => false,
674
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
675
                ]);
676
            }
677
 
678
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
679
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
680
 
681
            if ($chatGroupOwner->user_id != $currentUser->id) {
682
                return new JsonModel([
683
                    'success' => false,
684
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
685
                ]);
686
            }
687
 
688
            $userMapper = UserMapper::getInstance($this->adapter);
689
            $user = $userMapper->fetchOneByUuid($user_id);
690
 
691
            if (!$user) {
692
                return new JsonModel([
693
                    'success' => false,
694
                    'data' => 'ERROR_USER_NOT_FOUND'
695
                ]);
696
            }
697
 
698
            if ($chatGroupOwner->user_id == $user->id) {
699
                return new JsonModel([
700
                    'success' => false,
701
                    'data' => 'ERROR_CHAT_I_CAN_NOT_ADD_HIMSELF'
702
                ]);
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) {
712
                    return new JsonModel([
713
                        'success' => false,
714
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
715
                    ]);
716
                }
717
            } else {
718
                if ($currentUser->network_id != $user->network_id) {
719
                    return new JsonModel([
720
                        'success' => false,
721
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
722
                    ]);
723
                }
724
            }
725
 
726
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
727
            if ($chatGroupUser) {
728
                return new JsonModel([
729
                    'success' => false,
730
                    'data' => 'ERROR_THIS_USER_ALREADY_EXISTS_IN_THIS_GROUP'
731
                ]);
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) {
742
                return new JsonModel([
743
                    'success' => false,
744
                    'data' => $chatGroupUserMapper->getError()
745
                ]);
746
            }
747
 
748
 
749
 
750
            $userMapper->updateLastActivity($currentUser->id);
751
 
752
            return new JsonModel([
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 {
764
            return new JsonModel([
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)) {
801
                return new JsonModel([
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) {
810
                return new JsonModel([
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) {
820
                return new JsonModel([
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) {
830
                return new JsonModel([
831
                    'success' => false,
832
                    'data' => 'ERROR_USER_NOT_FOUND'
833
                ]);
834
            }
835
 
836
            if ($chatGroupOwner->user_id == $user->id) {
837
                return new JsonModel([
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) {
848
                return new JsonModel([
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
 
859
                return new JsonModel([
860
                    'success' => true
861
                ]);
862
            } else {
863
                return new JsonModel([
864
                    'success' => false,
865
                    'data' => $chatGroupMapper->getError()
866
                ]);
867
            }
868
        } else {
869
            return new JsonModel([
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)) {
905
                return new JsonModel([
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) {
915
                return new JsonModel([
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) {
924
                return new JsonModel([
925
                    'success' => false,
926
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
927
                ]);
928
            }
929
 
930
            if ($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
931
                return new JsonModel([
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
 
944
                return new JsonModel([
945
                    'success' => true
946
                ]);
947
            } else {
948
                return new JsonModel([
949
                    'success' => false,
950
                    'data' => $chatGroupMapper->getError()
951
                ]);
952
            }
953
        } else {
954
            return new JsonModel([
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) {
1178
                return new JsonModel([
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);
1189
                return new JsonModel($response);
1190
            } else {
1191
 
1192
                $userMapper = UserMapper::getInstance($this->adapter);
1193
                $user = $userMapper->fetchOneByUuid($id);
1194
                if (!$user) {
1195
                    return new JsonModel([
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
 
1207
                        return new JsonModel([
1208
                            'success' => false,
1209
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1210
                        ]);
1211
                    }
1212
                } else {
1213
                    if ($currentNetwork->id != $user->network_id) {
1214
 
1215
                        return new JsonModel([
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) {
1234
                        return new JsonModel([
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);
1252
                return new JsonModel($response);
1253
            }
1254
        } else {
1255
            return new JsonModel([
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)) {
1304
                return new JsonModel([
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) {
1331
                    return new JsonModel([
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) {
1346
                    return new JsonModel([
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) {
1364
                    return new JsonModel([
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) {
1383
                            return new JsonModel([
1384
                                'success' => false,
1385
                                'data' => $chatGroupUserMessageMapper->getError()
1386
                            ]);
1387
                        }
1388
                    }
1389
                }
1390
 
1391
 
1392
                $msgtime = Functions::timeAgo($now, $now);
1393
                return new JsonModel([
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) {
1412
                    return new JsonModel([
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
 
1425
                        return new JsonModel([
1426
                            'success' => false,
1427
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1428
                        ]);
1429
                    }
1430
                } else {
1431
                    if ($currentUser->network_id != $user->network_id) {
1432
                        return new JsonModel([
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) {
1447
                        return new JsonModel([
1448
                            'success' => false,
1449
                            'data' => $chatUserMapper->getError()
1450
                        ]);
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) {
1476
                    return new JsonModel([
1477
                        'success' => false,
1478
                        'data' => $chatMessageMapper->getError()
1479
                    ]);
1480
                }
1481
 
1482
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
1483
 
1484
 
1485
                $msgtime = Functions::timeAgo($now, $now);
1486
                return new JsonModel([
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
                    ]
1498
                ]);
1499
            }
1500
 
1501
 
1502
 
1503
 
1504
            $userMapper->updateLastActivity($currentUser->id);
1505
 
1506
            return new JsonModel($response);
63 efrain 1507
 
1 efrain 1508
        } else {
1509
            return new JsonModel([
1510
                'success' => false,
1511
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1512
            ]);
1513
        }
1514
    }
1515
 
1516
 
1517
 
1518
    /**
1519
     * Esta función recuperar los contactos disponibles para agregarlos a un grupo
1520
     * 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.
1521
     * con el siguiente parámetro
1522
     * uid = id encriptado del usuario
1523
     * retorna un json en caso de ser  positivo
1524
     * [
1525
     *  'success' : true,
1526
     *  'data' : [
1527
     *     [
1528
     *       'id'                    => 'id del usuario encriptado',
1529
     *       'name'                  => 'nombre del usuario',
1530
     *       'image'                 => 'imagen del usuario',
1531
     *       'type'                  => 'user' //fixed,
1532
     *       'online'                => $online,
1533
     *     ]
1534
     * ]
1535
     * En caso de ser negativo puede haber 2 formatos
1536
     * [
1537
     *  'success' : false,
1538
     *  'data' : mensaje de error
1539
     * ]
1540
     * @return \Laminas\View\Model\JsonModel
1541
     */
1542
    public function contactAvailableGroupListAction()
1543
    {
1544
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1545
        $currentUser = $currentUserPlugin->getUser();
1546
 
1547
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1548
        $currentNetwork = $currentNetworkPlugin->getNetwork();
1549
 
1550
 
1551
        $request    = $this->getRequest();
1552
        if ($request->isGet()) {
1553
 
1554
 
1555
            $id = $this->params()->fromRoute('group_id');
1556
            if (!$id) {
1557
                return new JsonModel([
1558
                    'success' => false,
1559
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1560
                ]);
1561
            }
1562
 
1563
            $userMapper = UserMapper::getInstance($this->adapter);
1564
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1565
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1566
 
1567
            if (!$chatGroup) {
1568
                return new JsonModel([
1569
                    'success' => false,
1570
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1571
                ]);
1572
            }
1573
 
1574
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1575
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1576
 
1577
            if ($chatGroupOwner->user_id != $currentUser->id) {
1578
                return new JsonModel([
1579
                    'success' => false,
1580
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1581
                ]);
1582
            }
1583
 
1584
 
1585
 
1586
            $contact_ids = [];
1587
            $contacts = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1588
            foreach ($contacts as $contact) {
1589
                array_push($contact_ids, $contact->user_id);
1590
            }
1591
 
1592
            $user_ids = [];
1593
            if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
1594
 
1595
 
1596
 
1597
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1598
                $user_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1599
            } else {
1600
                if ($currentNetwork->default == Network::DEFAULT_YES) {
1601
                    $user_ids = $userMapper->fetchAllIdsByDefaultNetworkId($currentNetwork->id, $currentUser->id);
1602
                } else {
1603
                    $user_ids = $userMapper->fetchAllIdsByNonDefaultNetworkId($currentNetwork->id, $currentUser->id);
1604
                }
1605
            }
1606
 
1607
            $user_ids = array_filter($user_ids, function ($var) use ($contact_ids) {
1608
                return !in_array($var, $contact_ids);
1609
            });
1610
 
1611
 
1612
            $items = [];
1613
            foreach ($user_ids as $user_id) {
1614
                $user = $userMapper->fetchOne($user_id);
1615
                if (!$user) {
1616
                    continue;
1617
                }
1618
 
1619
                $name   = trim($user->first_name . ' ' . $user->last_name);
1620
                $image  = $this->url()->fromRoute('storage', [
1621
                    'code' => $user->uuid,
1622
                    'type' => 'user',
1623
                    'filename' => $user->image
60 efrain 1624
                ],['force_canonical' => true]);
1 efrain 1625
 
1626
 
1627
                array_push($items, [
1628
                    'id'        => $user->uuid,
1629
                    'name'      => $name,
1630
                    'image'     => $image,
1631
                    'online'    => $user->online ? 1 : 0,
1632
                ]);
1633
            }
1634
 
1635
            usort($items, function ($a, $b) {
1636
                return $a['name'] <=> $b['name'];
1637
            });
1638
 
1639
 
1640
 
1641
            $userMapper->updateLastActivity($currentUser->id);
1642
 
1643
            return new JsonModel([
1644
                'success' => true,
1645
                'data' => $items,
1646
            ]);
1647
        } else {
1648
            return new JsonModel([
1649
                'success' => false,
1650
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1651
            ]);
1652
        }
1653
    }
1654
 
1655
    /**
1656
     * Esta función recuperar los contactos de un grupo
1657
     * 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.
1658
     * con el siguiente parámetro
1659
     * uid = id encriptado del usuario
1660
     * retorna un json en caso de ser  positivo
1661
     * [
1662
     *  'success' : true,
1663
     *  'data' : [
1664
     *     [
1665
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
1666
     *       'id'                    => 'id del usuario encriptado',
1667
     *       'name'                  => 'nombre del usuario',
1668
     *       'image'                 => 'imagen del usuario',
1669
     *       'type'                  => 'user' //fixed,
1670
     *       'online'                => $online,
1671
     *     ]
1672
     * ]
1673
     * En caso de ser negativo puede haber 2 formatos
1674
     * [
1675
     *  'success' : false,
1676
     *  'data' : mensaje de error
1677
     * ]
1678
     * o
1679
     * [
1680
     *  'success' : false,
1681
     *  'data' : [
1682
     *      'fieldname' : [
1683
     *          'mensaje de error'
1684
     *      ]
1685
     *  ]
1686
     * ]
1687
     * @return \Laminas\View\Model\JsonModel
1688
     */
1689
 
1690
    public function contactGroupListAction()
1691
    {
1692
 
1693
        $request    = $this->getRequest();
1694
        if ($request->isGet()) {
1695
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1696
            $currentUser = $currentUserPlugin->getUser();
1697
 
1698
            $id = $this->params()->fromRoute('group_id');
1699
            if (!$id) {
1700
                return new JsonModel([
1701
                    'success' => false,
1702
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1703
                ]);
1704
            }
1705
 
1706
            $userMapper = UserMapper::getInstance($this->adapter);
1707
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1708
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1709
 
1710
            if (!$chatGroup) {
1711
                return new JsonModel([
1712
                    'success' => false,
1713
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1714
                ]);
1715
            }
1716
 
1717
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1718
 
1719
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1720
 
1721
            if (!$chatGroupUser) {
1722
                return new JsonModel([
1723
                    'success' => false,
1724
                    'data' => 'ERROR_CHAT_GROUP_USER_NOT_FOUND'
1725
                ]);
1726
            }
1727
 
1728
            $items = [];
1729
            $chatGroupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1730
            foreach ($chatGroupUsers as $chatGroupUser) {
1731
                $user = $userMapper->fetchOne((int) $chatGroupUser->user_id);
1732
                if (!$user) {
1733
                    continue;
1734
                }
1735
 
1736
                $name   = trim($user->first_name . ' ' . $user->last_name);
1737
                $image  = $this->url()->fromRoute('storage', [
1738
                    'code' => $user->uuid,
1739
                    'type' => 'user',
1740
                    'filename' => $user->image
60 efrain 1741
                ],['force_canonical' => true]);
1 efrain 1742
 
1743
 
1744
                if ($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1745
                    $url_remove_from_group = '';
1746
                } else {
1747
                    $url_remove_from_group = $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]);
1748
                }
1749
 
1750
 
1751
                array_push($items, [
1752
                    'url_remove_from_group' => $url_remove_from_group,
1753
                    'id'                    => $user->uuid,
1754
                    'name'                  => $name,
1755
                    'image'                 => $image,
1756
                    'online'                => $user->online ? 1 : 0,
1757
                ]);
1758
            }
1759
 
1760
            $userMapper->updateLastActivity($currentUser->id);
1761
 
1762
            return new JsonModel([
1763
                'success' => true,
1764
                'data' => $items,
1765
            ]);
1766
        } else {
1767
            return new JsonModel([
1768
                'success' => false,
1769
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1770
            ]);
1771
        }
1772
    }
1773
 
1774
    /**
1775
     * Elimina un grupo de chat, solo el owner puede realizarla
1776
     * 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.
1777
     * Parámetros del route
1778
     * :group_id = id del grupo encriptado
1779
     * En caso de una respuesta positiva
1780
     * [
1781
     *      'success' => true,
1782
     *      'data'=> (int) registros_borrados
1783
     * ]
1784
     * En caso de un respuesta negativa
1785
     * [
1786
     *      'success' => false,
1787
     *      'data' => (string) 'mensaje_de_error'
1788
     * ]
1789
     * @return \Laminas\View\Model\JsonModel
1790
     */
1791
    public function deleteGroupAction()
1792
    {
1793
 
1794
        $request    = $this->getRequest();
1795
        if ($request->isPost()) {
1796
 
1797
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1798
            $currentUser = $currentUserPlugin->getUser();
1799
 
1800
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('group_id'));
1801
            if (!$id) {
1802
                return new JsonModel([
1803
                    'success' => false,
1804
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1805
                ]);
1806
            }
1807
 
1808
 
1809
 
1810
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1811
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1812
 
1813
            if (!$chatGroup) {
1814
                return new JsonModel([
1815
                    'success' => false,
1816
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1817
                ]);
1818
            }
1819
 
1820
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1821
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1822
 
1823
            if ($chatGroupOwner->user_id != $currentUser->id) {
1824
                return new JsonModel([
1825
                    'success' => false,
1826
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1827
                ]);
1828
            }
1829
 
1830
 
1831
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1832
            $result = $chatGroupUserMessageMapper->deleteAllByGroupId($chatGroup->id);
1833
            if (!$result) {
1834
                return new JsonModel([
1835
                    'success' => false,
1836
                    'data' => $chatGroupUserMessageMapper->getError()
1837
                ]);
1838
            }
1839
 
1840
            $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1841
            $result = $chatGroupMessageMapper->deleteAllByGroupId($chatGroup->id);
1842
            if (!$result) {
1843
                return new JsonModel([
1844
                    'success' => false,
1845
                    'data' => $chatGroupMessageMapper->getError()
1846
                ]);
1847
            }
1848
 
1849
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1850
            $result = $chatGroupUserMapper->deleteAllByGroupId($chatGroup->id);
1851
            if (!$result) {
1852
                return new JsonModel([
1853
                    'success' => false,
1854
                    'data' => $chatGroupUserMapper->getError()
1855
                ]);
1856
            }
1857
 
1858
            $chatGroupMapper->deleteByGroupId($chatGroup->id);
1859
            if (!$result) {
1860
                return new JsonModel([
1861
                    'success' => false,
1862
                    'data' => $chatGroupMapper->getError()
1863
                ]);
1864
            }
1865
 
1866
 
1867
            $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1868
            $dirpath = $fullpath_chat . $chatGroup->uuid;
1869
 
1870
            Functions::rmDirRecursive($dirpath);
1871
 
1872
 
1873
            $userMapper = UserMapper::getInstance($this->adapter);
1874
            $userMapper->updateLastActivity($currentUser->id);
1875
 
1876
            return new JsonModel([
1877
                'success' => true
1878
            ]);
1879
        } else {
1880
            return new JsonModel([
1881
                'success' => false,
1882
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1883
            ]);
1884
        }
1885
    }
1886
 
1887
    /**
1888
     * Cerrar el chat, consiste en borrar de la variable de sessión para que el mismo no se presente la siguiente vez abierto ,
1889
     * al menos que tenga mensajes sin leer
1890
     * 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.
1891
     * Parámetros del route
1892
     * :id = id del chat encriptado
1893
     * En caso de una respuesta positiva
1894
     * [
1895
     *  'success' => true
1896
     * ]
1897
     * En caso de un respuesta negativa
1898
     * [
1899
     *  'success' => false,
1900
     *  'data'  => mensaje_de_error
1901
     * ]
1902
     * @return \Laminas\View\Model\JsonModel
1903
     */
1904
    public function closeAction()
1905
    {
1906
        $request    = $this->getRequest();
1907
        if ($request->isPost()) {
1908
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1909
            $currentUser = $currentUserPlugin->getUser();
1910
 
1911
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
1912
 
1913
            if (!$id) {
1914
                return new JsonModel([
1915
                    'success' => false,
1916
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1917
                ]);
1918
            }
1919
 
1920
 
1921
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1922
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1923
            if ($chatGroup) {
1924
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1925
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1926
 
1927
                if (!$chatGroupUser) {
1928
                    return new JsonModel([
1929
                        'success' => false,
1930
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1931
                    ]);
1932
                }
1933
 
1934
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1935
            } else {
1936
 
1937
                $userMapper = UserMapper::getInstance($this->adapter);
1938
                $user = $userMapper->fetchOneByUuid($id);
1939
                if (!$user) {
1940
                    return new JsonModel([
1941
                        'success' => false,
1942
                        'data' => 'ERROR_USER_NOT_FOUND'
1943
                    ]);
1944
                }
1945
 
1946
 
1947
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1948
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1949
                if ($chatUser) {
1950
 
1951
                    if ($currentUser->id == $chatUser->user_id1) {
1952
                        $chatUserMapper->markIsClose1($chatUser->id);
1953
                    } else {
1954
                        $chatUserMapper->markIsClose2($chatUser->id);
1955
                    }
1956
                }
1957
            }
1958
 
1959
 
1960
            $userMapper->updateLastActivity($currentUser->id);
1961
 
1962
            return new JsonModel([
1963
                'success' => true
1964
            ]);
1965
        } else {
1966
            return new JsonModel([
1967
                'success' => false,
1968
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1969
            ]);
1970
        }
1971
    }
1972
 
1973
    /**
1974
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1975
     * 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.
1976
     * Parámetros del route
1977
     * :id = id del usuario encriptado
1978
     * En caso de una respuesta positiva
1979
     * [
1980
     *      'success' => true,
1981
     *      'data'=> (int) registros_borrados
1982
     * ]
1983
     * En caso de un respuesta negativa
1984
     * [
1985
     *      'success' => false,
1986
     *      'data' => (string) 'mensaje_de_error'
1987
     * ]
1988
     * @return \Laminas\View\Model\JsonModel
1989
     */
1990
    public function clearAction()
1991
    {
1992
        $request    = $this->getRequest();
1993
        if ($request->isPost()) {
1994
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1995
            $currentUser = $currentUserPlugin->getUser();
1996
 
1997
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
1998
 
1999
            if (!$id) {
2000
                return new JsonModel([
2001
                    'success' => false,
2002
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2003
                ]);
2004
            }
2005
 
2006
 
2007
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2008
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2009
            if ($chatGroup) {
2010
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2011
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2012
 
2013
                if (!$chatGroupUser) {
2014
                    return new JsonModel([
2015
                        'success' => false,
2016
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2017
                    ]);
2018
                }
2019
 
2020
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
2021
            } else {
2022
 
2023
                $userMapper = UserMapper::getInstance($this->adapter);
2024
                $user = $userMapper->fetchOneByUuid($id);
2025
                if (!$user) {
2026
                    return new JsonModel([
2027
                        'success' => false,
2028
                        'data' => 'ERROR_USER_NOT_FOUND'
2029
                    ]);
2030
                }
2031
 
2032
 
2033
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2034
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2035
                if ($chatUser) {
2036
                    if ($currentUser->id == $chatUser->user_id1) {
2037
                        $chatUserMapper->markIsClose1($chatUser->id);
2038
                    } else {
2039
                        $chatUserMapper->markIsClose2($chatUser->id);
2040
                    }
2041
                }
2042
            }
2043
 
2044
 
2045
            $userMapper->updateLastActivity($currentUser->id);
2046
 
2047
            return new JsonModel([
2048
                'success' => true
2049
            ]);
2050
        } else {
2051
            return new JsonModel([
2052
                'success' => false,
2053
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2054
            ]);
2055
        }
2056
    }
2057
 
2058
    /**
2059
     * Marca como abierto el caht
2060
     * 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.
2061
     * Parámetros del route
2062
     * :id = id del usuario encriptado
2063
     * En caso de una respuesta positiva
2064
     * [
2065
     *      'success' => true,
2066
     *      'data'=> (int) registros_borrados
2067
     * ]
2068
     * En caso de un respuesta negativa
2069
     * [
2070
     *      'success' => false,
2071
     *      'data' => (string) 'mensaje_de_error'
2072
     * ]
2073
     * @return \Laminas\View\Model\JsonModel
2074
     */
2075
    public function openOrCreateAction()
2076
    {
2077
        $request    = $this->getRequest();
2078
        if ($request->isPost()) {
2079
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2080
            $currentUser = $currentUserPlugin->getUser();
2081
 
2082
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
2083
            $currentNetwork = $currentNetworkPlugin->getNetwork();
2084
 
2085
 
2086
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
2087
 
2088
            if (!$id) {
2089
                return new JsonModel([
2090
                    'success' => false,
2091
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2092
                ]);
2093
            }
2094
 
2095
            $userMapper = UserMapper::getInstance($this->adapter);
2096
            $now = $userMapper->getDatebaseNow();
2097
 
2098
            $user = $userMapper->fetchOneByUuid($id);
2099
 
2100
            if (!$user) {
2101
                return new JsonModel([
2102
                    'success' => false,
2103
                    'data' => 'ERROR_USER_NOT_FOUND'
2104
                ]);
2105
            }
2106
 
2107
            if ($user->email_verified == User::EMAIL_VERIFIED_NO || $user->status != User::STATUS_ACTIVE) {
2108
                return new JsonModel([
2109
                    'success' => false,
2110
                    'data' => 'ERROR_USER_IS_INACTIVE'
2111
                ]);
2112
            }
2113
 
2114
            if ($user->network_id != $currentUser->network_id) {
2115
                return new JsonModel([
2116
                    'success' => false,
2117
                    'data' => 'ERROR_USER_IS_INACTIVE'
2118
                ]);
2119
            }
2120
 
2121
            if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
2122
 
2123
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2124
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2125
 
2126
                if (!$connection) {
2127
                    return new JsonModel([
2128
                        'success' => false,
2129
                        'data' =>  'ERROR_CONNECTION_NOT_ACTIVE'
2130
                    ]);
2131
                }
2132
            }
2133
 
2134
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2135
            $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2136
            if ($chatUser) {
2137
                if ($currentUser->id == $chatUser->user_id1) {
2138
                    $chatUserMapper->markIsOpen1($chatUser->id);
2139
                } else {
2140
                    $chatUserMapper->markIsOpen2($chatUser->id);
2141
                }
2142
            } else {
2143
                $chatUser = new ChatUser();
2144
                $chatUser->user_id1 = $currentUser->id;
2145
                $chatUser->user_id2 = $user->id;
2146
                $chatUser->user_open1 = ChatUser::OPEN_YES;
2147
                $chatUser->user_open2 = ChatUser::OPEN_NO;
2148
 
2149
 
2150
                if (!$chatUserMapper->insert($chatUser)) {
2151
                    return new JsonModel([
2152
                        'success' => false,
2153
                        'data' =>  $chatUserMapper->getError()
2154
                    ]);
2155
                }
2156
            }
2157
 
2158
 
2159
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2160
            $count_not_received_messages = $chatMessageMapper->countNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
2161
            $count_not_seen_messages = $chatMessageMapper->countNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
2162
            $lastMessage = $chatMessageMapper->fetchLastMessage($chatUser->id, $currentUser->id);
2163
 
2164
            if ($lastMessage) {
2165
                $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2166
            } else {
2167
                $lastMessage = '';
2168
            }
2169
 
2170
            if ($currentUser->id == $chatUser->user_id1) {
2171
                $is_open = $chatUser->user_open1 == ChatUser::OPEN_YES;
2172
            } else {
2173
                $is_open = $chatUser->user_open2 == ChatUser::OPEN_YES;
2174
            }
2175
 
2176
 
2177
            $not_received_messages = $count_not_received_messages > 0;
2178
            $not_seen_messages = $count_not_seen_messages > 0;
2179
 
2180
            $data = [
2181
                'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
2182
                'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
2183
                'url_open'                  => $this->url()->fromRoute('chat/open', ['id' => $user->uuid]),
2184
                'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
2185
                'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
2186
                'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
2187
                'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
2188
                'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
2189
                'url_zoom'                  => $this->url()->fromRoute('chat/zoom', ['id' => $user->uuid, 'type' => 'chat']),
2190
                'id'                        => $user->uuid,
2191
                'name'                      => trim($user->first_name . ' ' . $user->last_name),
60 efrain 2192
                'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image],['force_canonical' => true]),
1 efrain 2193
                'profile'                   => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
2194
                'type'                      => 'user',
2195
                'online'                    => $user->online ? 1 : 0,
2196
                'is_open'                   => $is_open ? 1 : 0,
2197
                'not_seen_messages'         => $not_seen_messages,
2198
                'not_received_messages'     => $not_received_messages,
2199
                'count_not_seen_messages'       => $count_not_seen_messages,
2200
                'count_not_received_messages'   => $count_not_received_messages,
2201
                'last_message'                  => $lastMessage
2202
            ];
2203
 
2204
 
2205
 
2206
            $userMapper->updateLastActivity($currentUser->id);
2207
 
2208
            return new JsonModel([
2209
                'success' => true,
2210
                'data' => $data,
2211
            ]);
2212
        } else {
2213
            return new JsonModel([
2214
                'success' => false,
2215
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2216
            ]);
2217
        }
2218
    }
2219
 
2220
 
2221
    /**
2222
     * Marca como abierto el caht
2223
     * 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.
2224
     * Parámetros del route
2225
     * :id = id del usuario encriptado
2226
     * En caso de una respuesta positiva
2227
     * [
2228
     *      'success' => true,
2229
     *      'data'=> (int) registros_borrados
2230
     * ]
2231
     * En caso de un respuesta negativa
2232
     * [
2233
     *      'success' => false,
2234
     *      'data' => (string) 'mensaje_de_error'
2235
     * ]
2236
     * @return \Laminas\View\Model\JsonModel
2237
     */
2238
    public function openAction()
2239
    {
2240
        $request    = $this->getRequest();
2241
        if ($request->isPost()) {
2242
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2243
            $currentUser = $currentUserPlugin->getUser();
2244
 
2245
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
2246
 
2247
            if (!$id) {
2248
                return new JsonModel([
2249
                    'success' => false,
2250
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2251
                ]);
2252
            }
2253
 
2254
 
2255
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2256
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2257
            if ($chatGroup) {
2258
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2259
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2260
 
2261
                if (!$chatGroupUser) {
2262
                    return new JsonModel([
2263
                        'success' => false,
2264
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2265
                    ]);
2266
                }
2267
 
2268
                $chatGroupUserMapper->markIsOpen($chatGroup->id, $currentUser->id);
2269
            } else {
2270
 
2271
                $userMapper = UserMapper::getInstance($this->adapter);
2272
                $user = $userMapper->fetchOneByUuid($id);
2273
                if (!$user) {
2274
                    return new JsonModel([
2275
                        'success' => false,
2276
                        'data' => 'ERROR_USER_NOT_FOUND'
2277
                    ]);
2278
                }
2279
 
2280
 
2281
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2282
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2283
                if ($chatUser) {
2284
                    if ($currentUser->id == $chatUser->user_id1) {
2285
                        $chatUserMapper->markIsOpen1($chatUser->id);
2286
                    } else {
2287
                        $chatUserMapper->markIsOpen2($chatUser->id);
2288
                    }
2289
                }
2290
            }
2291
 
2292
 
2293
            $userMapper->updateLastActivity($currentUser->id);
2294
 
2295
            return new JsonModel([
2296
                'success' => true
2297
            ]);
2298
        } else {
2299
            return new JsonModel([
2300
                'success' => false,
2301
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2302
            ]);
2303
        }
2304
    }
2305
 
2306
    public function uploadAction()
2307
    {
2308
        $request    = $this->getRequest();
2309
        if ($request->isPost()) {
2310
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2311
            $currentUser = $currentUserPlugin->getUser();
2312
 
2313
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
2314
            if (!$id) {
2315
                return new JsonModel([
2316
                    'success' => false,
2317
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2318
                ]);
2319
            }
2320
 
2321
            $files = $this->getRequest()->getFiles()->toArray();
2322
            if (!isset($files['file']) || !empty($files['file']['error'])) {
2323
                return new JsonModel([
2324
                    'success' => false,
2325
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
2326
                ]);
2327
            }
2328
 
2329
            $tmp_filename   = $files['file']['tmp_name'];
2330
            if (!$this->validMimeType($tmp_filename)) {
2331
                return new JsonModel([
2332
                    'success' => false,
2333
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
2334
                ]);
2335
            }
2336
 
2337
 
2338
            $extensions     = explode('.', $files['file']['name']);
2339
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
2340
            $filename       = uniqid() . '.' . $extension;
2341
 
2342
 
2343
            $mime_type = mime_content_type($tmp_filename);
2344
            if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
2345
                $file_type = 'image';
2346
            } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
2347
                $file_type = 'video';
2348
            } else if ($mime_type == 'application/pdf') {
2349
                $file_type = 'document';
2350
            }
2351
 
2352
 
2353
            $userMapper = UserMapper::getInstance($this->adapter);
2354
            $now = $userMapper->getDatebaseNow();
2355
 
2356
            $sender_result = $userMapper->fetchOne($currentUser->id);
2357
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
2358
            $sender_pic = $this->url()->fromRoute('storage', [
2359
                'code' => $sender_result->uuid,
2360
                'type' => 'user',
2361
                'filename' => $sender_result->image
60 efrain 2362
            ],['force_canonical' => true]);
1 efrain 2363
 
2364
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2365
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2366
            if ($chatGroup) {
2367
 
2368
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2369
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2370
 
2371
                if (!$chatGroupUser) {
2372
                    return new JsonModel([
2373
                        'success' => false,
2374
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2375
                    ]);
2376
                }
2377
 
2378
 
2379
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2380
                $dirpath = $fullpath_chat . $chatGroup->uuid;
2381
                if (!file_exists($dirpath)) {
2382
                    mkdir($dirpath, 0777, true);
2383
                    chmod($dirpath, 0777);
2384
                }
2385
 
2386
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2387
                if (!move_uploaded_file($tmp_filename, $full_filename)) {
2388
                    return new JsonModel([
2389
                        'success' => false,
2390
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2391
                    ]);
2392
                }
2393
 
2394
                $chatGroupMessage = new ChatGroupMessage();
2395
                $chatGroupMessage->sender_id    = $currentUser->id;
2396
                $chatGroupMessage->group_id     = $chatGroup->id;
2397
                $chatGroupMessage->content      = $filename;
2398
                $chatGroupMessage->type         = $file_type;
2399
 
2400
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
2401
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
2402
                if (!$result) {
2403
                    return new JsonModel([
2404
                        'success' => false,
2405
                        'data' => $chatGroupMessageMapper->getError()
2406
                    ]);
2407
                }
2408
 
2409
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
2410
 
2411
 
2412
                $chatGroupUserMessage = new ChatGroupUserMessage();
2413
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2414
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2415
                $chatGroupUserMessage->receiver_id = $currentUser->id;
2416
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
2417
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
2418
 
2419
 
2420
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
2421
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2422
                if (!$result) {
2423
                    return new JsonModel([
2424
                        'success' => false,
2425
                        'data' => $chatGroupUserMessageMapper->getError()
2426
                    ]);
2427
                }
2428
 
2429
 
2430
 
2431
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2432
 
2433
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
2434
                foreach ($results as $r) {
2435
                    if ($r->user_id != $currentUser->id) {
2436
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2437
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2438
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2439
                        $chatGroupUserMessage->receiver_id = $r->user_id;
2440
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2441
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2442
 
2443
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2444
                        if (!$result) {
2445
                            return new JsonModel([
2446
                                'success' => false,
2447
                                'data' => $chatGroupUserMessageMapper->getError()
2448
                            ]);
2449
                        }
2450
                    }
2451
                }
2452
 
2453
 
2454
                $userMapper->updateLastActivity($currentUser->id);
2455
 
2456
 
2457
                $msgtime = Functions::timeAgo($now, $now);
2458
                return new JsonModel([
2459
                    'success' => true,
2460
                    'data' => [
2461
                        'user_name'     => $sender_from,
2462
                        'user_id'       => $currentUser->uuid,
2463
                        'user_image'    => $sender_pic,
2464
                        'u'             => 1,
2465
                        'mtype'         => $file_type,
60 efrain 2466
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename],['force_canonical' => true]),
1 efrain 2467
                        'time'          => $msgtime,
2468
                        'id'            => $chatGroupMessage->uuid
2469
                    ]
2470
                ]);
2471
            } else {
2472
 
2473
                $user = $userMapper->fetchOneByUuid($id);
2474
                if (!$user) {
2475
                    return new JsonModel([
2476
                        'success' => false,
2477
                        'data' => 'ERROR_USER_NOT_FOUND'
2478
                    ]);
2479
                }
2480
 
2481
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2482
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2483
                if (!$chatUser) {
2484
                    return new JsonModel([
2485
                        'success' => false,
2486
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2487
                    ]);
2488
                }
2489
 
2490
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2491
                $dirpath = $fullpath_chat . $chatUser->uuid;
2492
 
2493
                if (!file_exists($dirpath)) {
2494
                    mkdir($dirpath, 0777, true);
2495
                    chmod($dirpath, 0777);
2496
                }
2497
 
2498
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2499
                if (!move_uploaded_file($tmp_filename, $full_filename)) {
2500
                    return new JsonModel([
2501
                        'success' => false,
2502
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2503
                    ]);
2504
                }
2505
 
2506
                $chatMessage = new ChatMessage();
2507
                $chatMessage->chat_id = $chatUser->id;
2508
                $chatMessage->from_id = $currentUser->id;
2509
                $chatMessage->to_id = $user->id;
2510
                $chatMessage->content = $filename;
2511
                $chatMessage->type = $file_type;
2512
                $chatMessage->recd = ChatMessage::RECD_NO;
2513
                $chatMessage->seen = ChatMessage::SEEN_NO;
2514
 
2515
 
2516
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2517
                $result = $chatMessageMapper->insert($chatMessage);
2518
                if (!$result) {
2519
                    return new JsonModel([
2520
                        'success' => false,
2521
                        'data' =>  $chatMessageMapper->getError()
2522
                    ]);
2523
                }
2524
 
2525
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
2526
 
2527
                $userMapper->updateLastActivity($currentUser->id);
2528
 
2529
                $msgtime = Functions::timeAgo($chatMessage->added_on, $now);
2530
                return new JsonModel([
2531
                    'success' => true,
2532
                    'data' => [
2533
                        'user_name' => $sender_from,
2534
                        'user_id' => $currentUser->uuid,
2535
                        'user_image' => $sender_pic,
2536
                        'u' => 1,
2537
                        'mtype' => $file_type,
60 efrain 2538
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename],['force_canonical' => true]),
1 efrain 2539
                        'time' => $msgtime,
2540
                        'id' => $chatMessage->uuid
2541
                    ]
2542
                ]);
2543
            }
2544
        } else {
2545
            return new JsonModel([
2546
                'success' => false,
2547
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2548
            ]);
2549
        }
2550
    }
2551
 
2552
    public function markSeenAction()
2553
    {
2554
        $request = $this->getRequest();
2555
        if ($request->isPost()) {
2556
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2557
            $currentUser = $currentUserPlugin->getUser();
2558
 
2559
            $id = $this->params()->fromRoute('id');
2560
            if (!$id) {
2561
                return new JsonModel([
2562
                    'success' => false,
2563
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2564
                ]);
2565
            }
2566
 
2567
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2568
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2569
 
2570
            if ($chatGroup) {
2571
 
2572
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2573
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2574
 
2575
                if (!$chatGroupUser) {
2576
                    return new JsonModel([
2577
                        'success' => false,
2578
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2579
                    ]);
2580
                }
2581
 
2582
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2583
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2584
                if ($result) {
2585
                    return new JsonModel([
2586
                        'success' => true,
2587
                    ]);
2588
                } else {
2589
                    return new JsonModel([
2590
                        'success' => false,
2591
                        'data' =>  $charGroupUserMessage->getError()
2592
                    ]);
2593
                }
2594
            } else {
2595
                $userMapper = UserMapper::getInstance($this->adapter);
2596
                $user = $userMapper->fetchOneByUuid($id);
2597
 
2598
                if (!$user) {
2599
                    return new JsonModel([
2600
                        'success' => false,
2601
                        'data' => 'ERROR_USER_NOT_FOUND'
2602
                    ]);
2603
                }
2604
 
2605
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2606
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2607
                if (!$chatUser) {
2608
                    return new JsonModel([
2609
                        'success' => false,
2610
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2611
                    ]);
2612
                }
2613
 
2614
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2615
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
2616
                if ($result) {
2617
                    return new JsonModel([
2618
                        'success' => true,
2619
                    ]);
2620
                } else {
2621
                    return new JsonModel([
2622
                        'success' => false,
2623
                        'data' =>  $charGroupUserMessage->getError()
2624
                    ]);
2625
                }
2626
            }
2627
        } else {
2628
            $response = [
2629
                'success' => false,
2630
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2631
            ];
2632
        }
2633
 
2634
        return new JsonModel($response);
2635
    }
2636
 
2637
 
2638
    public function markReceivedAction()
2639
    {
2640
        $request = $this->getRequest();
2641
        if ($request->isPost()) {
2642
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2643
            $currentUser = $currentUserPlugin->getUser();
2644
 
2645
            $id = $this->params()->fromRoute('id');
2646
            if (!$id) {
2647
                return new JsonModel([
2648
                    'success' => false,
2649
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2650
                ]);
2651
            }
2652
 
2653
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2654
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2655
 
2656
            if ($chatGroup) {
2657
 
2658
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2659
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2660
 
2661
                if (!$chatGroupUser) {
2662
                    return new JsonModel([
2663
                        'success' => false,
2664
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2665
                    ]);
2666
                }
2667
 
2668
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2669
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2670
                if ($result) {
2671
                    return new JsonModel([
2672
                        'success' => true,
2673
                    ]);
2674
                } else {
2675
                    return new JsonModel([
2676
                        'success' => false,
2677
                        'data' =>  $charGroupUserMessage->getError()
2678
                    ]);
2679
                }
2680
            } else {
2681
                $userMapper = UserMapper::getInstance($this->adapter);
2682
                $user = $userMapper->fetchOneByUuid($id);
2683
 
2684
                if (!$user) {
2685
                    return new JsonModel([
2686
                        'success' => false,
2687
                        'data' => 'ERROR_USER_NOT_FOUND'
2688
                    ]);
2689
                }
2690
 
2691
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2692
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2693
                if (!$chatUser) {
2694
                    return new JsonModel([
2695
                        'success' => false,
2696
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2697
                    ]);
2698
                }
2699
 
2700
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2701
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
2702
                if ($result) {
2703
                    return new JsonModel([
2704
                        'success' => true,
2705
                    ]);
2706
                } else {
2707
                    return new JsonModel([
2708
                        'success' => false,
2709
                        'data' =>  $charGroupUserMessage->getError()
2710
                    ]);
2711
                }
2712
            }
2713
        } else {
2714
            $response = [
2715
                'success' => false,
2716
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2717
            ];
2718
        }
2719
 
2720
        return new JsonModel($response);
2721
    }
2722
 
2723
    public function usersAction()
2724
    {
2725
        $currentUserPlugin = $this->plugin('currentUserPlugin');
2726
        $currentUser = $currentUserPlugin->getUser();
2727
 
2728
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
2729
        $currentNetwork = $currentNetworkPlugin->getNetwork();
2730
 
2731
        $request = $this->getRequest();
2732
        if ($request->isGet()) {
2733
 
2734
            $items = [];
2735
 
2736
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2737
 
2738
 
2739
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
2740
            if (strlen($search) >= 3) {
2741
                $user_ids = [];
2742
 
2743
                $userMapper = UserMapper::getInstance($this->adapter);
2744
 
2745
 
2746
                if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
2747
 
2748
                    $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2749
                    $user_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
2750
                } else {
2751
                    if ($currentNetwork->default == Network::DEFAULT_YES) {
2752
                        $user_ids = $userMapper->fetchAllIdsByDefaultNetworkId($currentNetwork->id, $currentUser->id);
2753
                    } else {
2754
                        $user_ids = $userMapper->fetchAllIdsByNonDefaultNetworkId($currentNetwork->id, $currentUser->id);
2755
                    }
2756
                }
2757
 
2758
 
2759
 
2760
                $items = [];
2761
                $records = $userMapper->fetchAllByIdsAndSearch($user_ids, $search, $currentUser->id);
2762
 
2763
                foreach ($records as $record) {
2764
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $record->id);
2765
                    if ($chatUser) {
2766
                        $link_send = $this->url()->fromRoute('chat/send', ['id' => $record->uuid]);
2767
                    } else {
2768
                        $link_send = '';
2769
                    }
2770
 
2771
                    $link_open_or_create = $this->url()->fromRoute('chat/open-or-create', ['id' => $record->uuid]);
2772
 
2773
 
2774
 
2775
 
2776
                    array_push($items, [
2777
                        'name'  => trim($record->first_name .  '  ' . $record->last_name) . ' (' . $record->email . ')',
60 efrain 2778
                        'image' => $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'user', 'filename' => $record->image],['force_canonical' => true]),
1 efrain 2779
                        'link_send' => $link_send,
2780
                        'link_open_or_create' => $link_open_or_create,
2781
                    ]);
2782
                }
2783
            }
2784
 
2785
            $response = [
2786
                'success' => true,
2787
                'data' => $items
2788
            ];
2789
        } else {
2790
            $response = [
2791
                'success' => false,
2792
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2793
            ];
2794
        }
2795
 
2796
        return new JsonModel($response);
2797
    }
2798
 
2799
 
2800
    public function zoomAction()
2801
    {
2802
        $request = $this->getRequest();
2803
        if ($request->isPost()) {
2804
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2805
            $currentUser = $currentUserPlugin->getUser();
2806
 
2807
            $id = $this->params()->fromRoute('id');
2808
 
2809
            if (!$id) {
2810
                return new JsonModel([
2811
                    'success' => false,
2812
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2813
                ]);
2814
            }
2815
 
2816
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2817
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2818
 
2819
            $chatUser = null;
2820
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2821
 
2822
            if ($chatGroup) {
2823
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2824
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2825
 
2826
                if (!$chatGroupUser) {
2827
                    $data = [
2828
                        'success' => false,
2829
                        'data' =>  'ERROR_ZOOM_CHAT_UNAUTHORIZE'
2830
                    ];
2831
 
2832
 
2833
                    return new JsonModel($data);
2834
                }
2835
            } else {
2836
 
2837
                $userMapper = UserMapper::getInstance($this->adapter);
2838
                $user = $userMapper->fetchOneByUuid($id);
2839
                if (!$user) {
2840
                    return new JsonModel([
2841
                        'success' => false,
2842
                        'data' => 'ERROR_USER_NOT_FOUND'
2843
                    ]);
2844
                }
2845
 
2846
 
2847
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2848
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2849
                if (!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
2850
 
2851
                    return new JsonModel([
2852
                        'success' => false,
2853
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
2854
                    ]);
2855
                }
2856
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2857
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2858
                if (!$chatUser) {
2859
                    $chatUser = new ChatUser();
2860
                    $chatUser->user_id1 = $currentUser->id;
2861
                    $chatUser->user_id2 = $user->id;
2862
 
2863
                    $response = $chatUserMapper->insert($chatUser);
2864
                    if (!$response) {
2865
                        return new JsonModel([
2866
                            'success' => false,
2867
                            'data' => $chatUserMapper->getError()
2868
                        ]);
2869
                    }
2870
 
2871
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
2872
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2873
                    $dirpath = $fullpath_chat . $chatUser->uuid;
2874
                    if (!file_exists($dirpath)) {
2875
                        mkdir($dirpath, 0777, true);
2876
                        chmod($dirpath, 0777);
2877
                    }
2878
                }
2879
            }
2880
 
2881
 
2882
 
2883
 
2884
 
2885
            if (!$chatUser && !$chatGroup) {
2886
                $data = [
2887
                    'success' => false,
2888
                    'data' => 'ERROR_ZOOM_CHAT_NOT_FOUND'
2889
                ];
2890
 
2891
 
2892
                return new JsonModel($data);
2893
            }
2894
 
2895
            $dataPost = $request->getPost()->toArray();
2896
            $form = new ZoomAddForm();
2897
            $form->setData($dataPost);
2898
            if ($form->isValid()) {
2899
 
2900
                $dataPost = (array) $form->getData();
2901
 
2902
 
2903
                $dtStart = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
2904
                if (!$dtStart) {
2905
                    return new JsonModel([
2906
                        'success' => false,
2907
                        'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2908
                    ]);
2909
                }
2910
 
2911
 
2912
 
2913
                $dtEnd = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
2914
                $dtEnd->add(new \DateInterval('PT' . $dataPost['duration'] . 'M'));
2915
 
2916
                $start_time = $dtStart->format('Y-m-d\TH:i:s');
2917
                $zoom = new Zoom($this->adapter, $this->config, $this->cache);
2918
 
2919
                $response =  $zoom->getOAuthAccessToken();
2920
                if ($response['success']) {
2921
                    $access_token = $response['data'];
2922
                    $result = $zoom->addMeeting($access_token, $dataPost['title'], $dataPost['description'], $dataPost['type'], $start_time, $dataPost['duration'], $dataPost['timezone'], $dataPost['password']);
2923
                } else {
2924
                    return new JsonModel([
2925
                        'success' => false,
2926
                        'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
2927
                    ]);
2928
                }
2929
 
2930
 
2931
 
2932
 
2933
 
2934
 
2935
 
2936
 
2937
                if ($result['success']) {
2938
 
2939
 
2940
                    $zoomMeetingMapper = ZoomMeetingMapper::getInstance($this->adapter);
2941
                    $zoomMeeting = $zoomMeetingMapper->fetchOne($result['data']['id']);
2942
 
2943
                    if (!$zoomMeeting) {
2944
 
2945
 
2946
                        $zoomMeeting = new ZoomMeeting();
2947
                        $zoomMeeting->id = $result['data']['id'];
2948
                        $zoomMeeting->topic = $dataPost['title'];
2949
                        $zoomMeeting->agenda = $dataPost['description'];
2950
                        $zoomMeeting->duration = $dataPost['duration'];
2951
                        $zoomMeeting->join_url = $result['data']['join_url'];
2952
                        $zoomMeeting->start_time = $dtStart->format('Y-m-d H:i:s');
2953
                        $zoomMeeting->end_time = $dtEnd->format('Y-m-d H:i:s');
2954
                        $zoomMeeting->timezone = $dataPost['timezone'];
2955
                        $zoomMeeting->type = $dataPost['type'];
2956
                        $zoomMeeting->uuid = $result['data']['uuid'];
2957
                        $zoomMeeting->password = $dataPost['password'];
2958
 
2959
 
2960
                        if (!$zoomMeetingMapper->insert($zoomMeeting)) {
2961
                            return new JsonModel([
2962
                                'success' => false,
2963
                                'data' => $zoomMeetingMapper->getError()
2964
                            ]);
2965
                        }
2966
                    }
2967
 
2968
 
2969
 
2970
 
2971
 
2972
                    $chatMessageContent = "LABEL_ZOOM_MEETING \r\n" .
2973
                        " LABEL_ZOOM_MEETING_START_DATE : " . $dtStart->format('Y-m-d') . "\r\n" .
2974
                        " LABEL_ZOOM_MEETING_START_TIME : " . $dtStart->format('H:i a') . "\r\n" .
2975
                        " LABEL_ZOOM_MEETING_TIMEZONE : " . $zoomMeeting->timezone . "\r\n" .
2976
                        " LABEL_ZOOM_MEETING_TITLE :  " . $zoomMeeting->topic  . "\r\n" .
2977
                        " LABEL_ZOOM_MEETING_URL : " . $zoomMeeting->join_url . "\r\n" .
2978
                        " LABEL_ZOOM_MEETING_PASSWORD : " . $zoomMeeting->password . "\r\n";
2979
 
2980
 
2981
                    $zoomMeetingUserMapper = ZoomMeetingUserMapper::getInstance($this->adapter);
2982
                    $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $currentUser->id);
2983
 
2984
                    if (!$zoomMeetingUser) {
2985
 
2986
                        $zoomMeetingUser = new ZoomMeetingUser();
2987
                        $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2988
                        $zoomMeetingUser->user_id = $currentUser->id;
2989
                        $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2990
                        $zoomMeetingUserMapper->insert($zoomMeetingUser);
2991
                    }
2992
 
2993
 
2994
 
2995
 
2996
 
2997
 
2998
                    if ($chatUser) {
2999
 
3000
                        if ($chatUser->user_id1 == $currentUser->id) {
3001
 
3002
                            $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id2);
3003
                            if (!$zoomMeetingUser) {
3004
                                $zoomMeetingUser = new ZoomMeetingUser();
3005
                                $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3006
                                $zoomMeetingUser->user_id = $chatUser->user_id2;
3007
                                $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3008
                                $zoomMeetingUserMapper->insert($zoomMeetingUser);
3009
                            }
3010
                        } else {
3011
                            $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id1);
3012
                            if (!$zoomMeetingUser) {
3013
                                $zoomMeetingUser = new ZoomMeetingUser();
3014
                                $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3015
                                $zoomMeetingUser->user_id = $chatUser->user_id1;
3016
                                $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3017
                                $zoomMeetingUserMapper->insert($zoomMeetingUser);
3018
                            }
3019
                        }
3020
 
3021
                        $chatMessage = new ChatMessage();
3022
                        $chatMessage->recd = ChatMessage::RECD_NO;
3023
                        $chatMessage->seen = ChatMessage::SEEN_NO;
3024
                        $chatMessage->type = ChatMessage::TYPE_TEXT;
3025
                        $chatMessage->content = $chatMessageContent;
3026
                        $chatMessage->from_id = $currentUser->id;
3027
                        $chatMessage->to_id = $chatUser->user_id1 == $currentUser->id ? $chatUser->user_id2 : $chatUser->user_id1;
3028
                        $chatMessage->chat_id = $chatUser->id;
3029
 
3030
 
3031
                        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
3032
                        $chatMessageMapper->insert($chatMessage);
3033
 
3034
 
3035
                        $chatUserMapper->markIsOpen1($chatUser->id);
3036
                        $chatUserMapper->markIsOpen2($chatUser->id);
3037
                    } else if ($chatGroup) {
3038
 
3039
                        $chatGroupMessage = new ChatGroupMessage();
3040
                        $chatGroupMessage->group_id = $chatGroup->id;
3041
                        $chatGroupMessage->content = $chatMessageContent;
3042
                        $chatGroupMessage->sender_id = $currentUser->id;
3043
                        $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
3044
                        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
3045
                        if ($chatGroupMessageMapper->insert($chatGroupMessage)) {
3046
 
3047
                            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
3048
                            $groupUsers =   $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
3049
 
3050
 
3051
                            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
3052
                            foreach ($groupUsers as $groupUser) {
3053
 
3054
                                if ($groupUser->user_id != $currentUser->id) {
3055
                                    $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $groupUser->user_id);
3056
 
3057
                                    if (!$zoomMeetingUser) {
3058
                                        $zoomMeetingUser = new ZoomMeetingUser();
3059
                                        $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3060
                                        $zoomMeetingUser->user_id = $groupUser->user_id;
3061
                                        $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3062
                                        $zoomMeetingUserMapper->insert($zoomMeetingUser);
3063
                                    }
3064
                                }
3065
 
3066
 
3067
                                $chatGroupUserMessage = new ChatGroupUserMessage();
3068
                                $chatGroupUserMessage->group_id = $chatGroup->id;
3069
                                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
3070
                                $chatGroupUserMessage->receiver_id = $groupUser->user_id;
3071
                                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
3072
                                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
3073
                                $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
3074
 
3075
                                $chatGroupUserMapper->markIsOpen($groupUser->group_id, $groupUser->user_id);
3076
                            }
3077
                        }
3078
                    }
3079
 
3080
                    return new JsonModel([
3081
                        'success' => true,
3082
                        'data' => 'LABEL_ZOOM_NEW_MEETING_SUCCESSFULLY'
3083
                    ]);
3084
                } else {
3085
                    return new JsonModel([
3086
                        'success' => false,
3087
                        'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
3088
                    ]);
3089
                }
3090
            } else {
3091
 
3092
 
3093
 
3094
                $messages = [];
3095
                $form_messages = (array) $form->getMessages();
3096
                foreach ($form_messages  as $fieldname => $field_messages) {
3097
 
3098
                    $messages[$fieldname] = array_values($field_messages);
3099
                }
3100
 
3101
                return new JsonModel([
3102
                    'success'   => false,
3103
                    'data'   => $messages
3104
                ]);
3105
 
3106
 
3107
                return new JsonModel($response);
3108
            }
3109
        } else {
3110
            $response = [
3111
                'success' => false,
3112
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
3113
            ];
3114
        }
3115
 
3116
        return new JsonModel($response);
3117
    }
3118
 
3119
 
3120
 
3121
    /**
3122
     *
3123
     * @param string $file
3124
     * @return boolean
3125
     */
3126
    private function validMimeType($file)
3127
    {
3128
        /*
3129
         * image/jpeg jpeg jpg jpe
3130
         * image/gif gif
3131
         * image/png png
3132
         * video/mp4
3133
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
3134
         * video/x-flv flv
3135
         * application/msword doc dot
3136
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
3137
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
3138
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
3139
         * application/vnd.ms-powerpoint ppt pps pot
3140
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
3141
         * application/pdf pdf
3142
         */
3143
        $mime = mime_content_type($file);
3144
        $valid = false;
3145
        $types = [
3146
            'image/jpeg',
3147
            'image/gif',
3148
            'image/png',
3149
            'video/mp4',
3150
            'audio/mpeg',
3151
            'video/x-flv',
3152
            'application/msword',
3153
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
3154
            'application/vnd.ms-excel',
3155
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
3156
            'application/vnd.ms-powerpoint',
3157
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
3158
            'application/pdf'
3159
        ];
3160
        foreach ($types as $t) {
3161
            if (strpos($mime, $t) !== false) {
3162
                $valid = true;
3163
                break;
3164
            }
3165
        }
3166
        return $valid;
3167
    }
3168
 
3169
    /**
3170
     *
3171
     * @param string $text
3172
     * @return string
3173
     */
3174
    private function sanitize($text)
3175
    {
3176
        $text = htmlspecialchars($text, ENT_QUOTES);
3177
        $text = str_replace("\n\r", "\n", $text);
3178
        $text = str_replace("\r\n", "\n", $text);
3179
        $text = str_replace("\n", "<br>", $text);
3180
        return $text;
3181
    }
3182
 
3183
    /**
3184
     *
3185
     * @param string $timestamp
3186
     * @param string $now
3187
     * @return string
3188
     */
3189
    private function timeAgo($timestamp, $now = '')
3190
    {
3191
 
3192
        if ($now) {
3193
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
3194
        } else {
3195
            $now = date('Y-m-d H:i:s');
3196
            $datetime1 = date_create($now);
3197
        }
3198
        $datetime2 = date_create($timestamp);
3199
 
3200
        $diff = date_diff($datetime1, $datetime2);
3201
        $timemsg = '';
3202
        if ($diff->y > 0) {
3203
            $timemsg = $diff->y . ' año' . ($diff->y > 1 ? "s" : '');
3204
        } else if ($diff->m > 0) {
3205
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "es" : '');
3206
        } else if ($diff->d > 0) {
3207
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
3208
        } else if ($diff->h > 0) {
3209
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
3210
        } else if ($diff->i > 0) {
3211
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
3212
        } else if ($diff->s > 0) {
3213
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
3214
        }
3215
        if (!$timemsg) {
3216
            $timemsg = "Ahora";
3217
        } else {
3218
            $timemsg = $timemsg . '';
3219
        }
3220
        return $timemsg;
3221
    }
3222
 
3223
    /**
3224
     *
3225
     * @param string $timestamp
3226
     * @param string $now
3227
     * @return boolean
3228
     */
3229
    private function isInactiveConnection($timestamp, $now = '')
3230
    {
3231
        if ($now) {
3232
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
3233
        } else {
3234
            $now = date('Y-m-d H:i:s');
3235
            $datetime1 = date_create($now);
3236
        }
3237
 
3238
 
3239
        if (empty($timestamp)) {
3240
            return true;
3241
        }
3242
 
3243
 
3244
        $datetime2 = date_create($timestamp);
3245
        $diff = date_diff($datetime1, $datetime2);
3246
 
3247
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
3248
            return true;
3249
        }
3250
 
3251
        return ($diff->s) > 15 ? true : false;
3252
    }
3253
}