Proyectos de Subversion LeadersLinked - Services

Rev

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

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