Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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