Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 5277 | Rev 5343 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

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