Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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