Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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