Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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