Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
13529 nelberth 1
<?php
2
/**
3
 *
4
 * Controlador: Mis Perfiles
5
 *
6
 */
7
declare(strict_types=1);
8
 
9
namespace LeadersLinked\Controller;
10
 
11
use Laminas\Db\Adapter\AdapterInterface;
12
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
13
use Laminas\Mvc\Controller\AbstractActionController;
14
use Laminas\Log\LoggerInterface;
15
use Laminas\View\Model\ViewModel;
16
 
17
use LeadersLinked\Library\Functions;
18
use LeadersLinked\Mapper\UserMapper;
19
 
20
use LeadersLinked\Model\User;
21
 
22
use LeadersLinked\Mapper\UserBlockedMapper;
23
 
24
use LeadersLinked\Mapper\CompanyMapper;
25
use LeadersLinked\Mapper\CompanyUserMapper;
26
use LeadersLinked\Mapper\ConversationMapper;
27
use LeadersLinked\Mapper\MessageMapper;
28
use LeadersLinked\Model\Conversation;
29
use LeadersLinked\Model\UserType;
30
use LeadersLinked\Library\Image;
31
use Laminas\View\Model\JsonModel;
32
use LeadersLinked\Form\CommunicationInMailSendForm;
13766 nelberth 33
use LeadersLinked\Form\CommunicationInMailSendAllForm;
13529 nelberth 34
use LeadersLinked\Model\Message;
35
use LeadersLinked\Model\VideoConvert;
36
use LeadersLinked\Mapper\VideoConvertMapper;
37
 
38
 
39
 
40
class InMailController extends AbstractActionController
41
{
42
    /**
43
     *
44
     * @var AdapterInterface
45
     */
46
    private $adapter;
47
 
48
 
49
    /**
50
     *
51
     * @var AbstractAdapter
52
     */
53
    private $cache;
54
 
55
    /**
56
     *
57
     * @var  LoggerInterface
58
     */
59
    private $logger;
60
 
61
 
62
    /**
63
     *
64
     * @var array
65
     */
66
    private $config;
67
 
68
    /**
69
     *
70
     * @param AdapterInterface $adapter
71
     * @param AbstractAdapter $cache
72
     * @param LoggerInterface $logger
73
     * @param array $config
74
     */
75
    public function __construct($adapter, $cache , $logger,  $config)
76
    {
77
        $this->adapter      = $adapter;
78
        $this->cache        = $cache;
79
        $this->logger       = $logger;
80
        $this->config       = $config;
81
 
82
    }
83
 
84
    /**
85
     *
86
     * Generación del listado de conversationes
87
     *
88
     * [
89
     *  success: true,
90
     *  data:[
91
     *    [
92
     *       uuid: uuid con quien se tiene la conversación,
93
     *       name: nombre de con quien se tiene la conversacion,
94
     *       image: imagen de con quien se tiene la conversación,
95
     *       profile: url del profile con quien se tiene la conversación,
96
     *       last_message: fecha del ultimo mensaje,
97
     *       count_unread: cantidad de mensajes sin leer,
98
     *       messages_link: url para recuperar los mensajes,
99
     *       send_link: url para enviar el mensaje,
100
     *       selected: 0 = no seleccionado, 1 = seleccionado
101
     *     ]
102
     *  ]
103
     *
104
     *
105
     * @return \Laminas\View\Model\JsonModel
106
     */
107
    public function indexAction()
108
    {
109
        $request = $this->getRequest();
110
        if($request->isGet()) {
13568 nelberth 111
 
13561 nelberth 112
            $formAdd = new CommunicationInMailSendForm();
13764 nelberth 113
            $formSendAll = new CommunicationInMailSendAllForm();
13561 nelberth 114
            $this->layout()->setTemplate('layout/layout-backend');
115
            $viewModel = new ViewModel();
116
            $viewModel->setTemplate('leaders-linked/in-mail/index.phtml');
117
            $viewModel->setVariables([
118
                'formAdd'    =>  $formAdd,
13764 nelberth 119
                'formSendAll' => $formSendAll,
13561 nelberth 120
            ]);
121
            return $viewModel ;
13529 nelberth 122
 
13555 nelberth 123
        } else {
124
            return new JsonModel([
125
                'success' => false,
126
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
127
            ]);
128
        }
129
    }
130
 
131
 
132
    public function viewAction()
133
    {
13795 nelberth 134
 
13799 nelberth 135
 
13555 nelberth 136
        $request = $this->getRequest();
137
        if($request->isGet()) {
138
            $currentUserPlugin = $this->plugin('currentUserPlugin');
139
            $currentUser = $currentUserPlugin->getUser();
13562 nelberth 140
            $currentCompany = $currentUserPlugin->getCompany();
13555 nelberth 141
            $id = $this->params()->fromRoute('id');
142
 
143
            $headers  = $request->getHeaders();
144
 
145
            $isJson = false;
146
            if($headers->has('Accept')) {
147
                $accept = $headers->get('Accept');
148
 
149
                $prioritized = $accept->getPrioritized();
150
 
151
                foreach($prioritized as $key => $value) {
152
                    $raw = trim($value->getRaw());
153
 
154
                    if(!$isJson) {
155
                        $isJson = strpos($raw, 'json');
156
                    }
157
 
158
                }
159
            }
160
 
13529 nelberth 161
            if($isJson) {
13588 nelberth 162
 
13529 nelberth 163
 
164
                $userMapper = UserMapper::getInstance($this->adapter);
165
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
166
                $messageMapper = MessageMapper::getInstance($this->adapter);
167
                $conversations = [];
13756 nelberth 168
                $type = $this->params()->fromRoute('type');
169
                $owner;
170
                if($type=='company'){
171
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
172
                    $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
173
                    $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
174
                }else{
175
                    $owner = $currentUser;
176
                }
177
 
13593 nelberth 178
                $selected_user_id = 0;
13591 nelberth 179
 
13529 nelberth 180
                $id = $this->params()->fromRoute('id');
13597 nelberth 181
 
13529 nelberth 182
                if($id) {
183
 
184
                    $companyMapper = CompanyMapper::getInstance($this->adapter);
185
                    $company = $companyMapper->fetchOneByUuid($id);
186
                    if($company) {
187
 
188
                        $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
189
 
190
                        $user  = $userMapper->fetchOne($companyUser->user_id);
191
 
192
 
193
                        $selected_user_id = $user->user_id;
13597 nelberth 194
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 195
 
196
 
197
                        $timeElapsedString = '';
198
                        if($conversation) {
13597 nelberth 199
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
200
                            $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
13529 nelberth 201
 
202
                            if($lastMessage) {
203
                                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
204
                                if($dt) {
205
                                    $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
206
                                }
207
                            }
208
                        } else {
209
                            $unread = 0;
210
 
211
                        }
212
 
213
                        array_push($conversations, [
214
                            'uuid' => $company->uuid,
215
                            'name' => $company->name,
216
                            'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image]),
217
                            //'profile' => $this->url()->fromRoute('company/view', ['id' => $company->uuid ] ),
218
                            'last_message' => $timeElapsedString,
219
                            'count_unread' => intval($unread),
13805 nelberth 220
                            'messages_link' => $type=="company"?$this->url()->fromRoute('inmail/company/message', ['id' => $user->uuid, 'type'=>'company']):$this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
13806 nelberth 221
                            //'send_link' => $type=='company'?$this->url()->fromRoute('inmail/company/message/send', ['id' => $user->uuid,'type'=>'company']):$this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 222
                            'selected' => 1,
223
                        ]);
224
                    } else {
225
                        $user = $userMapper->fetchOneByUuid($id);
226
                        if($user) {
227
 
228
                            $timeElapsedString = '';
229
 
230
                            $selected_user_id = $user->id;
13597 nelberth 231
                            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 232
                            if($conversation) {
13597 nelberth 233
                                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
234
                                $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
13529 nelberth 235
                                if($lastMessage) {
236
                                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
237
                                    if($dt) {
238
                                        $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
239
                                    }
240
                                }
241
 
242
 
243
                            } else {
244
                                $unread = 0;
245
                            }
246
 
247
 
248
                            array_push($conversations, [
249
                                'uuid' => $user->uuid,
250
                                'name' => trim($user->first_name . ' ' . $user->last_name),
251
                                'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
252
                                //'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
253
                                'last_message' => $timeElapsedString,
254
                                'count_unread' => intval($unread),
13805 nelberth 255
                                'messages_link' => $type=="company"?$this->url()->fromRoute('inmail/company/message', ['id' => $user->uuid, 'type'=>'company']):$this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
13806 nelberth 256
                                //'send_link' => $type=='company'?$this->url()->fromRoute('inmail/company/message/send', ['id' => $user->uuid,'type'=>'company']):$this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 257
                                'selected' => 1,
258
                            ]);
259
                        }
260
                    }
261
                }
262
 
13592 nelberth 263
 
13597 nelberth 264
                $records = $conversationMapper->fetchAllByUserId($owner->id);
13529 nelberth 265
                foreach($records as $record)
266
                {
267
                    if($selected_user_id) {
13597 nelberth 268
                        if($record->sender_id == $owner->id && $record->receiver_id == $selected_user_id) {
13529 nelberth 269
                            continue;
270
                        }
13597 nelberth 271
                        if($record->receiver_id == $owner->id && $record->sender_id == $selected_user_id) {
13529 nelberth 272
                            continue;
273
                        }
274
 
275
                    }
13587 nelberth 276
 
13597 nelberth 277
                    if($record->sender_id == $owner->id) {
13529 nelberth 278
                        $user = $userMapper->fetchOne($record->receiver_id);
279
                    }
13597 nelberth 280
                    if($record->receiver_id == $owner->id) {
13529 nelberth 281
                        $user = $userMapper->fetchOne($record->sender_id);
282
                    }
13594 nelberth 283
 
13529 nelberth 284
                    $timeElapsedString = '';
13597 nelberth 285
                    $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $owner->id);
286
                    $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId($record->id, $owner->id);
13529 nelberth 287
 
288
 
289
                    if($lastMessage) {
290
                        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
291
                        if($dt) {
292
                            $timeElapsedString =  Functions::timeElapsedString( $dt->getTimestamp() );
293
                        }
13596 nelberth 294
                    }
13529 nelberth 295
 
296
                    array_push($conversations, [
297
                        'uuid' => $user->uuid,
298
                        'name' => trim($user->first_name . ' ' . $user->last_name),
13613 nelberth 299
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
13529 nelberth 300
                        //'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
301
                        'last_message' => $timeElapsedString,
14198 kerby 302
                        'last_message_dt' => $lastMessage,
13529 nelberth 303
                        'count_unread' => intval($unread),
13805 nelberth 304
                        'messages_link' => $type=="company"?$this->url()->fromRoute('inmail/company/message', ['id' => $user->uuid, 'type'=>'company']):$this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
13529 nelberth 305
                        'selected' => 0,
306
                    ]);
307
                }
308
 
309
                usort($conversations, function($a, $b) {
310
                    if ($a['selected'] == $b['selected']) {
14198 kerby 311
                        if($a['last_message_dt'] == $b['last_message_dt']) {
13529 nelberth 312
                            return 0;
313
                        } else {
14200 kerby 314
                            return $a['last_message_dt'] > $b['last_message_dt'] ? -1 : 1;
13529 nelberth 315
                        }
316
                    } else {
317
                        return $a['selected'] < $b['selected'] ? -1 : 1;
318
                    }
319
                });
320
 
321
 
322
                return new JsonModel([
323
                    'success' => true,
324
                    'data' => $conversations
325
                ]);
326
 
13587 nelberth 327
            }  else {
13529 nelberth 328
 
13555 nelberth 329
                return new JsonModel([
330
                    'success' => false,
331
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
13529 nelberth 332
                ]);
333
            }
334
        } else {
335
            return new JsonModel([
336
                'success' => false,
337
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
338
            ]);
339
        }
340
    }
13555 nelberth 341
 
13529 nelberth 342
 
343
    /**
344
     * Esta función remueve el usuario del grupo
345
     * Es una petición GET el url recuperado en /inmail
13596 nelberth 346
     * [ruta del servidor]/inmail/view/[uuid]/view/message
13529 nelberth 347
     * retorna un json en caso de ser  positivo
348
     * [
349
     *   success: true,
350
     *      data: [
351
     *          [
352
     *              sender_name: nombre de quien que envia el mensaje,
353
     *              sender_image: imagen de quien que recibe el mensaje,
354
     *              sender_profile: url de profile de quien que envia el mensaje,
355
     *              receiver_name: nombre de quien que recibe el mensaje,
356
     *              receiver_image: url de la imagen de quien  que recibe el mensaje,
357
     *              receiver_profile: url del profile de quien recibe el mensaje,
358
     *              side: left/righ de que lado de la pantalla se mostrara,
359
     *              message: texto del mensaje,
360
     *              type: text|image|video|document,
361
     *              filename: url del archivo enviado,
362
     *              date: cadena que describe hace cuanto se recibio el mensaje
363
     *          ]
364
     *      ]
365
     *   ]
366
     * En caso de ser negativo puede haber 2 formatos
367
     * [
368
     *  'success' : false,
369
     *  'data' : mensaje de error
370
     * ]
371
     * @return \Laminas\View\Model\JsonModel
372
     */
373
    public function messageAction()
374
    {
375
 
376
        $request = $this->getRequest();
377
        if($request->isGet()) {
378
 
379
            $page = intval($this->params()->fromQuery('page', 0), 10);
380
 
381
            $currentUserPlugin = $this->plugin('currentUserPlugin');
382
            $currentUser = $currentUserPlugin->getUser();
13610 nelberth 383
            $currentCompany = $currentUserPlugin->getCompany();
13611 nelberth 384
 
13529 nelberth 385
            $userMapper = UserMapper::getInstance($this->adapter);
386
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
387
 
388
            $messageMapper = MessageMapper::getInstance($this->adapter);
389
 
390
            $id = $this->params()->fromRoute('id');
391
            if(!$id) {
392
                return new JsonModel([
393
                    'success' => false,
394
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
395
                ]);
396
            }
397
 
398
            $user = $userMapper->fetchOneByUuid($id);
399
            if(!$user) {
400
                return new JsonModel([
401
                    'success' => false,
402
                    'data' => 'ERROR_REQUEST_IS_INVALID'
403
                ]);
404
            }
13757 nelberth 405
            $type = $this->params()->fromRoute('type');
406
            $owner;
407
            if($type=='company'){
408
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
409
                $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
410
                $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
411
            }else{
412
                $owner = $currentUser;
413
            }
13609 nelberth 414
 
415
 
416
 
13529 nelberth 417
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
13597 nelberth 418
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 419
 
420
 
421
            $messages = [];
422
            if($conversation) {
423
                $records = $messageMapper->getAllMessagesPaginatorByConversationId($conversation->id, $page);
424
                foreach($records as $record) {
425
                    $timeElapsedString = '';
426
 
427
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
428
                    if($dt) {
429
                        $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
430
                    }
431
 
432
 
13597 nelberth 433
                    if($record->sender_id == $owner->id) {
13529 nelberth 434
                        array_push($messages, [
13597 nelberth 435
                            'sender_name' => trim($owner->first_name . ' ' . $owner->last_name),
13616 nelberth 436
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
13529 nelberth 437
 
13597 nelberth 438
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 439
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
440
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
441
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
442
 
443
                            'side' => 'left',
444
                            'message' => $record->message,
445
                            'type' => $record->type,
446
                            'filename'=> $record->filename!=null?$this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]):'',
447
 
448
                            //'filename' => $record->filename,
449
                            'date' => $timeElapsedString
450
                        ]);
451
                    } else {
452
                        array_push($messages, [
453
                            'sender_name' => trim($user->first_name . ' ' . $user->last_name),
454
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
455
 
456
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
13597 nelberth 457
                            'receiver_name' => trim($owner->first_name . ' ' . $owner->last_name),
13614 nelberth 458
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
13597 nelberth 459
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 460
 
461
                            'side' => 'right',
462
                            'message' => $record->message,
463
                            'type' => $record->type,
464
                            'filename'=> $record->filename!=null?$this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]):'',
465
 
466
                            'date' => $timeElapsedString
467
                        ]);
468
 
469
                        $messageMapper->markAsRead($record->id);
470
                    }
471
                }
472
                return new JsonModel([
473
                    'success' => true,
474
                    'data' => $messages,
475
                    'receiver'=>[
476
                        'name' => trim($user->first_name . ' ' . $user->last_name),
477
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
478
                    ],
13806 nelberth 479
                    'send_link' => $type=='company'?$this->url()->fromRoute('inmail/company/message/send', ['id' => $user->uuid,'type'=>'company']):$this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 480
                    'pagination' => $records->getPages()
481
                ]);
482
            }else{
483
                return new JsonModel([
484
                    'success' => true,
485
                    'data' => $messages,
486
                    'receiver'=>[
487
                        'name' => trim($user->first_name . ' ' . $user->last_name),
488
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
489
                    ],
13806 nelberth 490
                    'send_link' => $type=='company'?$this->url()->fromRoute('inmail/company/message/send', ['id' => $user->uuid,'type'=>'company']):$this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 491
                    'pagination' => 0
492
                ]);
493
            }
494
 
495
 
496
            return new JsonModel([
497
                'success' => false,
498
                'data' => $messages
499
            ]);
500
 
501
 
502
 
503
 
504
        } else {
505
            return new JsonModel([
506
                'success' => false,
507
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
508
            ]);
509
        }
510
    }
511
 
512
    /**
513
     * Esta función envia un mensaje
514
     * Es una petición POST el url recuperado en /inmail
13596 nelberth 515
     * [ruta del servidor]/inmail/view/[uidd del usuario]/view/message/send
13529 nelberth 516
     * Lo párametros son
517
     * message: text plain requerido
518
     * file: no requerido puede jpg, png, jpeg, mp3, mp4, webm o pdf
519
     * o
13596 nelberth 520
     * [ruta del servidor]/inmail/view/[uidd del usuario]/view/message/send/encoding/base64 para el caso de react-native
13529 nelberth 521
     * Los párametros son
522
     * message: text plain requerido
523
     * fileBase64Name: nombre del archivo  que se envia en base64 solo requerido si se envia un archivo
524
     * fileBase64Content: contenido en base 64 del archivo
525
     *
526
     * retorna un json en caso de ser  positivo
527
     * [
528
     *   success: true,
529
     *      data:{
530
     *          sender_name: nombre de quien que envia el mensaje,
531
     *          sender_image: imagen de quien que recibe el mensaje,
532
     *          sender_profile: url de profile de quien que envia el mensaje,
533
     *          receiver_name: nombre de quien que recibe el mensaje,
534
     *          receiver_image: url de la imagen de quien  que recibe el mensaje,
535
     *          receiver_profile: url del profile de quien recibe el mensaje,
536
     *          side: left/righ de que lado de la pantalla se mostrara,
537
     *          message: texto del mensaje,
538
     *          type: text|image|video|document,
539
     *          filename: url del archivo enviado,
540
     *          date: cadena que describe hace cuanto se recibio el mensaje
541
     *      ]
542
     *   ]
543
     * En caso de ser negativo puede haber 2 formatos
544
     * [
545
     *  'success' : false,
546
     *  'data' : mensaje de error
547
     * ]
548
     * @return \Laminas\View\Model\JsonModel
549
     */
550
    public function sendMessageAction()
551
    {
552
        $request = $this->getRequest();
553
        if($request->isPost()) {
554
 
13768 nelberth 555
 
13529 nelberth 556
            $currentUserPlugin = $this->plugin('currentUserPlugin');
557
            $currentUser = $currentUserPlugin->getUser();
13610 nelberth 558
            $currentCompany = $currentUserPlugin->getCompany();
559
 
13529 nelberth 560
            $userMapper = UserMapper::getInstance($this->adapter);
561
 
562
            $id = $this->params()->fromRoute('id');
563
            if(!$id) {
564
                return new JsonModel([
565
                    'success' => false,
566
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
567
                ]);
568
            }
569
 
570
 
571
            $user = $userMapper->fetchOneByUuid($id);
572
            if(!$user) {
573
                return new JsonModel([
574
                    'success' => false,
575
                    'data' => 'ERROR_REQUEST_IS_INVALID'
576
                ]);
577
            }
578
 
579
 
580
            $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
581
 
582
            $form = new CommunicationInMailSendForm();
583
            $form->setData($data);
584
 
585
            if($form->isValid()) {
13611 nelberth 586
 
13758 nelberth 587
                $type = $this->params()->fromRoute('type');
588
                $owner;
589
                if($type=='company'){
590
                    $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
591
                    $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
592
                    $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
593
                }else{
594
                    $owner = $currentUser;
595
                }
13529 nelberth 596
 
597
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
13597 nelberth 598
                $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 599
 
600
                if($conversation) {
601
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
602
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
603
 
604
                    if(!$conversationMapper->update($conversation)) {
605
                        return new JsonModel([
606
                            'success'  => false,
607
                            'data' => $conversationMapper->getError()
608
                        ]);
609
                    }
610
 
611
                } else {
612
                    $conversation = new Conversation();
13597 nelberth 613
                    $conversation->sender_id = $owner->id;
13529 nelberth 614
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
615
                    $conversation->receiver_id = $user->id;
616
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
617
 
618
                    if(!$conversationMapper->insert($conversation)) {
619
                        return new JsonModel([
620
                            'success'  => false,
621
                            'data' => $conversationMapper->getError()
622
                        ]);
623
                    }
624
 
625
                }
626
                $files = $this->getRequest()->getFiles()->toArray();
627
                $type = Message::TYPE_TEXT;
628
 
629
 
630
 
631
                $encoding = $this->params()->fromRoute('encoding');
632
                if($encoding == 'base64') {
633
 
634
 
635
                    $fileBase64Name = $this->params()->fromPost('file_base64_name');
636
                    $fileBase64Content = $this->params()->fromPost('file_base64_content');
637
 
638
 
639
                    if($fileBase64Name && $fileBase64Content) {
640
 
641
                        try {
642
 
643
                            $fileBase64Content = base64_decode($fileBase64Content);
644
                            if($fileBase64Content) {
645
 
646
                                $message_filename      = $this->normalizeString($fileBase64Name);
647
                                $message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp';
648
                                if(!file_exists($message_tmp_filename)) {
649
                                    mkdir($message_tmp_filename, 0755, true);
650
                                }
651
 
652
                                $message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $message_filename;
653
                                file_put_contents($message_tmp_filename, $fileBase64Content);
654
 
655
 
656
 
657
                                $mime_type = mime_content_type($message_tmp_filename);
658
                                //echo '$mime_type = '. $mime_type; exit;
659
 
660
 
661
                                if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
662
                                    $type = Message::TYPE_IMAGE;
663
                                } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
664
                                    $type = Message::FILE_TYPE_VIDEO;
665
                                } else if($mime_type == 'application/pdf') {
666
                                    $type = Message::FILE_TYPE_DOCUMENT;
667
                                }
668
 
669
                            }
670
                        } catch(\Exception $e) {
671
 
672
                        }
673
                    }
674
 
675
                } else {
676
 
677
                    if(isset($files['file']) && empty($files['file']['error'])) {
678
                        $message_tmp_filename  = $files['file']['tmp_name'];
679
                        $message_filename      = $this->normalizeString($files['file']['name']);
680
 
681
                        $mime_type = mime_content_type($message_tmp_filename);
682
 
683
 
684
                        if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
685
                            $type = Message::TYPE_IMAGE;
686
                        } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
687
                            $type = Message::TYPE_VIDEO;
688
                        } else if($mime_type == 'application/pdf') {
689
                            $type = Message::TYPE_DOCUMENT;
690
                        }
691
                    }
692
                }
693
 
694
 
695
 
696
                $message = new Message();
697
                $message->conversation_id = $conversation->id;
698
                $message->read = Message::NO;
699
                $message->message = $form->get('message')->getValue();
700
                $message->receiver_id = $user->id;
701
                $message->receiver_status = Message::STATUS_NORMAL;
13597 nelberth 702
                $message->sender_id = $owner->id;
13529 nelberth 703
                $message->sender_status = Message::STATUS_NORMAL;
704
                $message->type = $type;
705
 
706
 
707
 
708
                $messageMapper = MessageMapper::getInstance($this->adapter);
709
                if($messageMapper->insert($message)) {
710
 
711
                    $message = $messageMapper->fetchOne($message->id);
712
 
713
 
714
                    if( $type == Message::TYPE_DOCUMENT) {
715
                        try {
716
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
717
                            if(!file_exists($target_path)) {
718
                                mkdir($target_path, 0755);
719
                            }
720
 
721
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR .$message_filename;
722
 
723
                            if($encoding == 'base64') {
724
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
725
                            } else {
726
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
727
                            }
728
 
729
                            if($resultMoveOrRename) {
730
 
731
                                $message->type = $type;
732
                                $message->filename = basename($message_filename);
733
                                $messageMapper->update($message);
734
                            } else {
735
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename );
736
                            }
737
                        } catch(\Throwable $e) {
738
                            error_log($e->getTraceAsString());
739
                        }
740
                    }
741
                    if( $type == Message::TYPE_IMAGE) {
742
                        try {
743
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
744
                            if(!file_exists($target_path)) {
745
                                mkdir($target_path, 0755);
746
                            }
747
 
748
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.message_image_size']);
749
 
750
                            $message_filename = substr($message_filename, 0, strrpos($message_filename, '.'))  . '.png';
751
                            $crop_to_dimensions = false;
752
                            if(Image::uploadImage($message_tmp_filename, $target_path, $message_filename, $target_width, $target_height, $crop_to_dimensions )) {
753
                                $message->type = $type;
754
                                $message->filename = basename($message_filename);
755
                                $messageMapper->update($message);
756
                            }
757
                        } catch(\Throwable $e) {
758
                            error_log($e->getTraceAsString());
759
                        }
760
                    }
761
                    if( $type == Message::TYPE_VIDEO) {
762
                        try {
763
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
764
                            if(!file_exists($target_path)) {
765
                                mkdir($target_path, 0755);
766
                            }
767
 
768
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
769
 
770
                            if($encoding == 'base64') {
771
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
772
                            } else {
773
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
774
                            }
775
 
776
                            if($resultMoveOrRename) {
777
 
778
                                $size = $this->config['leaderslinked.image_sizes.message_image_size'];
779
                                $getFromSecound = 2;
780
 
781
                                //extracción del cover
782
                                $generateFileName = substr($message_filename, 0, strrpos($message_filename, '.'));
783
                                $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
784
                                $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
785
                                exec($cmd);
786
 
787
 
788
                                $message->type = $type;
789
                                $message->filename = basename($message_filename);
790
                                $message->image_preview = basename($generateFile);
791
                                $messageMapper->update($message);
792
 
793
                                $videoConvert = new VideoConvert();
794
                                $videoConvert->filename = $full_filename;
795
                                $videoConvert->type = VideoConvert::TYPE_FEED;
796
 
797
                                $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
798
                                $videoConvertMapper->insert($videoConvert);
799
                            } else {
800
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename );
801
                            }
802
                        } catch(\Throwable $e) {
803
                            error_log($e->getTraceAsString());
804
                        }
805
                    }
806
 
807
                    $message = $messageMapper->fetchOne($message->id);
808
 
809
                    if($message->filename) {
810
 
811
 
812
                        $filename = $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $message->filename, 'code' => $message->uuid]);
813
 
814
                    } else {
815
                        $filename = '';
816
                    }
817
 
818
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $message->added_on);
819
 
820
 
821
                    return new JsonModel([
822
                        'success'   => true,
823
                        'data'   => [
13597 nelberth 824
                            'sender_name' => trim($owner->first_name . ' ' . $owner->last_name),
825
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
826
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 827
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
828
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
829
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
830
                            'side' => 'left',
831
                            'message' => $message->message,
832
                            'type' => $message->type,
833
                            'filename' =>$filename,
834
                            'date' => Functions::timeElapsedString($dt->getTimestamp())
835
                        ]
836
                    ]);
837
 
838
 
839
 
840
                } else {
841
                    return new JsonModel([
842
                        'success'   => false,
843
                        'data'   => $messageMapper->getError()
844
                    ]);
845
                }
846
 
847
 
848
 
849
 
850
 
851
            } else {
852
 
853
 
854
                $messages = [];
855
                $form_messages = (array) $form->getMessages();
856
                foreach($form_messages  as $fieldname => $field_messages)
857
                {
858
                    $messages[$fieldname] = array_values($field_messages);
859
                }
860
 
861
                return new JsonModel([
862
                    'success'   => false,
863
                    'data'   => $messages
864
                ]);
865
            }
866
 
867
 
868
 
869
        } else {
870
            return new JsonModel([
871
                'success' => false,
872
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
873
            ]);
874
        }
875
 
876
    }
877
 
878
    public function searchPeopleAction()
879
    {
880
        $request = $this->getRequest();
13540 nelberth 881
 
13529 nelberth 882
        if($request->isGet()) {
883
 
884
 
13601 nelberth 885
 
886
            $currentUserPlugin = $this->plugin('currentUserPlugin');
887
            $currentUser = $currentUserPlugin->getUser();
888
            $currentCompany = $currentUserPlugin->getCompany();
13608 nelberth 889
            $userMapper = UserMapper::getInstance($this->adapter);
13758 nelberth 890
            $type = $this->params()->fromRoute('type');
891
            $owner;
892
            if($type=='company'){
893
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
13608 nelberth 894
 
13758 nelberth 895
                $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
896
                $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
897
            }else{
898
                $owner = $currentUser;
899
            }
13607 nelberth 900
 
13529 nelberth 901
            $search = trim(filter_var( $this->params()->fromQuery('search'), FILTER_SANITIZE_STRING)) ;
902
            if(strlen($search) >= 3) {
903
 
13758 nelberth 904
 
13529 nelberth 905
                $records  = $userMapper->fetchAllSuggest($search);
906
 
907
                $users = [];
908
                foreach($records as $record)
909
                {
13597 nelberth 910
                    if($owner->id == $record->id) {
13529 nelberth 911
                        continue;
912
                    }
913
 
914
 
915
                    array_push($users, [
13557 nelberth 916
                        'user_link' => $this->url()->fromRoute('inmail/view', ['id' => $record->uuid]),
13529 nelberth 917
                        'name' => trim($record->first_name . ' ' . $record->last_name),
918
                        'email' => $record->email,
919
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $record->image, 'code' => $record->uuid]),
920
                    ]);
921
                }
922
 
923
                return new JsonModel([
924
                    'success' => true,
925
                    'data' => $users
926
                ]);
927
 
928
 
929
 
930
 
931
            } else {
932
                return new JsonModel([
933
                    'success' => true,
934
                    'data' => [
935
 
936
                    ]
937
                ]);
938
            }
939
 
940
 
941
 
942
 
943
        } else {
944
            return new JsonModel([
945
                'success' => false,
946
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
947
            ]);
948
        }
949
    }
950
 
951
    private function normalizeString ($str = '')
952
    {
953
        $basename  = substr($str, 0, strrpos($str, '.'));
954
        $basename  = str_replace('.', '-', $basename);
955
 
956
        $extension  = substr($str, strrpos($str, '.'));
957
 
958
        $str = $basename . $extension;
959
 
960
        $str = strip_tags($str);
961
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
962
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
963
        $str = strtolower($str);
964
        $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
965
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
966
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
967
        $str = str_replace(' ', '-', $str);
968
        $str = rawurlencode($str);
969
        $str = str_replace('%', '-', $str);
970
        return trim(strtolower($str));
971
    }
972
 
973
}