Proyectos de Subversion LeadersLinked - Services

Rev

Rev 307 | Rev 345 | 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;
307 www 22
use LeadersLinked\Mapper\ConversationMapper;
23
use LeadersLinked\Mapper\MessageMapper;
24
use LeadersLinked\Model\Conversation;
1 efrain 25
use LeadersLinked\Library\Image;
26
use Laminas\View\Model\JsonModel;
307 www 27
use LeadersLinked\Form\InMail\SendForm;
28
use LeadersLinked\Model\Message;
29
use LeadersLinked\Model\VideoConvert;
30
use LeadersLinked\Mapper\VideoConvertMapper;
1 efrain 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,
307 www 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,
1 efrain 102
     *       send_link: url para enviar el mensaje,
307 www 103
     *       selected: 0 = no seleccionado, 1 = seleccionado
104
     *     ]
1 efrain 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();
307 www 116
 
117
            $id = $this->params()->fromRoute('id');
118
 
119
            $currentUserPlugin = $this->plugin('currentUserPlugin');
120
            $currentUser = $currentUserPlugin->getUser();
261 efrain 121
 
307 www 122
                $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
123
                $user_blocked_ids = $userBlockedMapper ->fetchAllBlockedReturnIds($currentUser->id);
261 efrain 124
 
307 www 125
                $user_blocked_me_ids = $userBlockedMapper->fetchAllUserBlockMeReturnIds($currentUser->id);
1 efrain 126
 
199 efrain 127
 
307 www 128
                $userMapper = UserMapper::getInstance($this->adapter);
129
                $now = $userMapper->getDatebaseNow();
1 efrain 130
 
307 www 131
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
132
                $messageMapper = MessageMapper::getInstance($this->adapter);
133
                $conversations = [];
1 efrain 134
 
307 www 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
 
307 www 147
                        if(!in_array($companyUser->user_id, $user_blocked_ids) && !in_array($companyUser->id, $user_blocked_me_ids)) {
148
                            $user  = $userMapper->fetchOne($companyUser->user_id);
149
 
150
 
151
                            $selected_user_id = $user->id;
152
                            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
153
 
154
 
155
                            $timeElapsedString = '';
156
                            if ($conversation) {
157
                                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
158
                                $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
159
 
160
                                if ($lastMessage) {
161
                                    $timeElapsedString =  $this->timeAgo($lastMessage, $now);
162
                                }
163
                            } else {
164
                                $unread = 0;
165
                            }
166
 
167
 
168
                            array_push($conversations, [
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]),
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
                            ]);
180
 
261 efrain 181
                        }
182
 
307 www 183
 
184
 
185
                    } else {
186
                        $user = $userMapper->fetchOneByUuid($id);
187
                        if ($user) {
188
 
189
                            if(!in_array($user->id, $user_blocked_ids) && !in_array($user->id, $user_blocked_me_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;
1 efrain 203
                                }
307 www 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
                                ]);
1 efrain 218
                            }
219
                        }
220
                    }
221
                }
222
 
223
 
307 www 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
                    }
1 efrain 234
 
307 www 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);
240
 
241
                        if(in_array($user->id, $user_blocked_ids) || in_array($user->id, $user_blocked_me_ids)) {
242
                            continue;
243
                        }
244
                    }
1 efrain 245
 
307 www 246
                    $timeElapsedString = '';
247
                    $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);
248
                    $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);
1 efrain 249
 
250
 
307 www 251
                    if ($lastMessage) {
252
                        $timeElapsedString =  $this->timeAgo($lastMessage, $now);
253
                    }
1 efrain 254
 
307 www 255
                    array_push($conversations, [
256
                        'uuid' => $user->uuid,
257
                        'name' => trim($user->first_name . ' ' . $user->last_name),
258
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image],['force_canonical' => true]),
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
                }
1 efrain 268
 
269
 
307 www 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
                });
1 efrain 281
 
282
 
307 www 283
                return new JsonModel([
284
                    'success' => true,
285
                    'data' => $conversations
286
                ]);
1 efrain 287
 
288
        } else {
289
            return new JsonModel([
290
                'success' => false,
291
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
292
            ]);
293
        }
294
    }
307 www 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()
1 efrain 328
    {
329
        $request = $this->getRequest();
330
        if ($request->isGet()) {
307 www 331
            $page = intval($this->params()->fromQuery('page', 0), 10);
332
 
1 efrain 333
            $currentUserPlugin = $this->plugin('currentUserPlugin');
334
            $currentUser = $currentUserPlugin->getUser();
307 www 335
 
336
            $userMapper = UserMapper::getInstance($this->adapter);
337
            $now = $userMapper->getDatebaseNow();
1 efrain 338
 
307 www 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
 
307 www 359
            $abuseReportMapper = AbuseReportMapper::getInstance($this->adapter);
360
            $abuse_report_message_ids = $abuseReportMapper->fetchAllDataByUserReportingIdAndTypeReturnIds($currentUser->id, AbuseReport::TYPE_INMAIL_MESSAGE);
199 efrain 361
 
307 www 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),
384
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid],['force_canonical' => true]),
385
                            'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
386
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
387
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid],['force_canonical' => true]),
388
                            'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
389
                            'side' => 'left',
390
                            'message' => $record->message,
391
                            'type' => $record->type,
392
                            'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid],['force_canonical' => true]) : '',
393
                            'date' => $timeElapsedString,
394
                            'url_abuse_report' => '',
395
                        ]);
396
                    } else {
199 efrain 397
 
307 www 398
                        if(in_array($record->id, $abuse_report_message_ids)) {
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]);
199 efrain 418
 
307 www 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
                            ]);
199 efrain 434
                        }
307 www 435
 
436
                        $messageMapper->markAsRead($record->id);
261 efrain 437
                    }
307 www 438
                }
1 efrain 439
 
440
                return new JsonModel([
307 www 441
                    'success' => true,
442
                    'data' => $messages,
443
                    'pagination' => $records->getPages()
1 efrain 444
                ]);
445
            }
307 www 446
 
447
 
448
            return new JsonModel([
449
                'success' => true,
450
                'data' => $messages,
451
                'pagination' => 1
452
            ]);
1 efrain 453
        } else {
454
            return new JsonModel([
455
                'success' => false,
456
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
457
            ]);
458
        }
459
    }
307 www 460
 
461
    /**
462
     * Esta función envia un mensaje
463
     * Es una petición POST el url recuperado en /inmail
464
     * [ruta del servidor]/inmail/[uidd del usuario]/message/send
465
     * Lo párametros son
466
     * message: text plain requerido
467
     * file: no requerido puede jpg, png, jpeg, mp3, mp4, webm o pdf
468
     * o
469
     * [ruta del servidor]/inmail/[uidd del usuario]/message/send/encoding/base64 para el caso de react-native
470
     * Los párametros son
471
     * message: text plain requerido
472
     * fileBase64Name: nombre del archivo  que se envia en base64 solo requerido si se envia un archivo
473
     * fileBase64Content: contenido en base 64 del archivo
474
     *
475
     * retorna un json en caso de ser  positivo
476
     * [
477
     *   success: true,
478
     *      data:{
479
     *          sender_name: nombre de quien que envia el mensaje,
480
     *          sender_image: imagen de quien que recibe el mensaje,
481
     *          sender_profile: url de profile de quien que envia el mensaje,
482
     *          receiver_name: nombre de quien que recibe el mensaje,
483
     *          receiver_image: url de la imagen de quien  que recibe el mensaje,
484
     *          receiver_profile: url del profile de quien recibe el mensaje,
485
     *          side: left/righ de que lado de la pantalla se mostrara,
486
     *          message: texto del mensaje,
487
     *          type: text|image|video|document,
488
     *          filename: url del archivo enviado,
489
     *          date: cadena que describe hace cuanto se recibio el mensaje
490
     *      ]
491
     *   ]
492
     * En caso de ser negativo puede haber 2 formatos
493
     * [
494
     *  'success' : false,
495
     *  'data' : mensaje de error
496
     * ]
497
     * @return \Laminas\View\Model\JsonModel
498
     */
499
    public function sendMessageAction()
1 efrain 500
    {
501
        $request = $this->getRequest();
307 www 502
        if ($request->isPost()) {
1 efrain 503
            $currentUserPlugin = $this->plugin('currentUserPlugin');
504
            $currentUser = $currentUserPlugin->getUser();
307 www 505
 
506
            $userMapper = UserMapper::getInstance($this->adapter);
507
            $now = $userMapper->getDatebaseNow();
1 efrain 508
 
307 www 509
 
510
            $id = $this->params()->fromRoute('id');
511
            if (!$id) {
512
                return new JsonModel([
513
                    'success' => false,
514
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
515
                ]);
516
            }
517
 
518
 
519
            $user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
520
            if (!$user) {
521
                return new JsonModel([
522
                    'success' => false,
523
                    'data' => 'ERROR_REQUEST_IS_INVALID'
524
                ]);
525
            }
526
 
527
 
528
            $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
529
 
530
            if(!empty($data['file']) && empty($data['file']['error'])) {
531
                $data['message'] = $data['file']['name'];
532
            }
261 efrain 533
 
307 www 534
            $form = new SendForm();
535
            $form->setData($data);
536
 
537
            if ($form->isValid()) {
538
 
539
                $dataPost = (array) $form->getData();
540
 
541
 
542
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
543
                $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
544
 
545
                if ($conversation) {
546
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
547
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
548
 
549
                    if (!$conversationMapper->update($conversation)) {
550
                        return new JsonModel([
551
                            'success'  => false,
552
                            'data' => $conversationMapper->getError()
553
                        ]);
554
                    }
555
                } else {
556
                    $conversation = new Conversation();
557
                    $conversation->sender_id = $currentUser->id;
558
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
559
                    $conversation->receiver_id = $user->id;
560
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
561
 
562
                    if (!$conversationMapper->insert($conversation)) {
563
                        return new JsonModel([
564
                            'success'  => false,
565
                            'data' => $conversationMapper->getError()
566
                        ]);
567
                    }
568
                }
569
                $files                  = $this->getRequest()->getFiles()->toArray();
570
                $type                   = Message::TYPE_TEXT;
571
                $message_tmp_filename   = '';
572
                $message_filename       = '';
573
 
574
 
575
                if (isset($files['file']) && empty($files['file']['error'])) {
576
                    $message_tmp_filename  = $files['file']['tmp_name'];
334 www 577
                    $message_filename      = \LeadersLinked\Library\Functions::normalizeStringFilename($files['file']['name']);
307 www 578
 
579
                    $mime_type = mime_content_type($message_tmp_filename);
580
 
581
 
582
                    if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
583
                        $type = Message::TYPE_IMAGE;
584
                    } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
585
                        $type = Message::TYPE_VIDEO;
586
                    } else if ($mime_type == 'application/pdf') {
587
                        $type = Message::TYPE_DOCUMENT;
588
                    }
589
                }
590
 
591
 
592
 
593
 
594
                $message = new Message();
595
                $message->conversation_id = $conversation->id;
596
                $message->read = Message::NO;
597
                $message->message = $type == Message::TYPE_TEXT ? $dataPost['message'] : '';
598
                $message->receiver_id = $user->id;
599
                $message->receiver_status = Message::STATUS_NORMAL;
600
                $message->sender_id = $currentUser->id;
601
                $message->sender_status = Message::STATUS_NORMAL;
602
                $message->type = $type;
603
 
604
 
605
 
606
 
607
 
608
                $messageMapper = MessageMapper::getInstance($this->adapter);
609
                if ($messageMapper->insert($message)) {
610
 
611
                    $message = $messageMapper->fetchOne($message->id);
612
 
613
 
614
                    if ($type == Message::TYPE_DOCUMENT) {
615
                        try {
616
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
617
                            if (!file_exists($target_path)) {
618
                                mkdir($target_path, 0755);
1 efrain 619
                            }
307 www 620
 
621
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
622
                            /*
623
                            if($encoding == 'base64') {
624
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
625
                            } else {
626
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
627
                            }
628
                            */
629
 
630
                            $resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);
631
                            if ($resultMoveOrRename) {
632
 
633
                                $message->type = $type;
634
                                $message->filename = basename($message_filename);
635
                                $messageMapper->update($message);
636
                            } else {
637
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);
638
                            }
639
                        } catch (\Throwable $e) {
640
                            error_log($e->getTraceAsString());
1 efrain 641
                        }
642
                    }
307 www 643
                    if ($type == Message::TYPE_IMAGE) {
644
                        try {
645
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
646
                            if (!file_exists($target_path)) {
647
                                mkdir($target_path, 0755);
1 efrain 648
                            }
307 www 649
 
650
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.message_image_size']);
651
 
652
                            $message_filename = substr($message_filename, 0, strrpos($message_filename, '.'))  . '.png';
653
 
654
                            //echo "target_path = $target_path message_tmp_filename = $message_tmp_filename message_filename = $message_filename"; exit;
655
 
656
                            $crop_to_dimensions = false;
657
                            if (Image::uploadImage($message_tmp_filename, $target_path, $message_filename, $target_width, $target_height, $crop_to_dimensions)) {
658
                                $message->type = $type;
659
                                $message->filename = basename($message_filename);
660
                                $messageMapper->update($message);
661
                            }
662
                        } catch (\Throwable $e) {
663
                            error_log($e->getTraceAsString());
1 efrain 664
                        }
665
                    }
307 www 666
                    if ($type == Message::TYPE_VIDEO) {
667
                        try {
668
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
669
                            if (!file_exists($target_path)) {
670
                                mkdir($target_path, 0755);
671
                            }
672
 
673
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
674
 
675
                            /*
676
                            if($encoding == 'base64') {
677
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
678
                            } else {
679
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
680
                            }*/
681
 
682
                            $resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);
683
                            if ($resultMoveOrRename) {
684
 
685
                                $size = $this->config['leaderslinked.image_sizes.message_image_size'];
686
                                $getFromSecound = 2;
687
 
688
                                //extracción del cover
689
                                $generateFileName = substr($message_filename, 0, strrpos($message_filename, '.'));
690
                                $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
691
                                $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
692
                                exec($cmd);
693
 
694
 
695
                                $message->type = $type;
696
                                $message->filename = basename($message_filename);
697
                                $message->image_preview = basename($generateFile);
698
                                $messageMapper->update($message);
699
 
700
                                $videoConvert = new VideoConvert();
701
                                $videoConvert->filename = $full_filename;
702
                                $videoConvert->type = VideoConvert::TYPE_FEED;
703
 
704
                                $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
705
                                $videoConvertMapper->insert($videoConvert);
706
                            } else {
707
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);
708
                            }
709
                        } catch (\Throwable $e) {
710
                            error_log($e->getTraceAsString());
711
                        }
712
                    }
713
 
714
                    $message = $messageMapper->fetchOne($message->id);
715
 
716
                    if ($message->filename) {
717
                        $filename = $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $message->filename, 'code' => $message->uuid],['force_canonical' => true]);
718
                    } else {
719
                        $filename = '';
720
                    }
721
 
722
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $message->added_on);
723
 
724
                    $userMapper->updateLastActivity($currentUser->id);
725
 
726
 
727
 
1 efrain 728
                    return new JsonModel([
307 www 729
                        'success'   => true,
730
                        'data'   => [
731
                            'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
732
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid],['force_canonical' => true]),
733
                            'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
734
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
735
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid],['force_canonical' => true]),
736
                            'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
737
                            'side' => 'left',
738
                            'message' => $message->message,
739
                            'type' => $message->type,
740
                            'filename' => $filename,
741
                            'date' => $this->timeAgo($now, $now),
1 efrain 742
                        ]
743
                    ]);
744
                } else {
745
                    return new JsonModel([
307 www 746
                        'success'   => false,
747
                        'data'   => $messageMapper->getError()
1 efrain 748
                    ]);
749
                }
307 www 750
            } else {
751
 
752
 
753
                $messages = [];
754
                $form_messages = (array) $form->getMessages();
755
                foreach ($form_messages  as $fieldname => $field_messages) {
756
                    $messages[$fieldname] = array_values($field_messages);
757
                }
758
 
1 efrain 759
                return new JsonModel([
307 www 760
                    'success'   => false,
761
                    'data'   => $messages
1 efrain 762
                ]);
763
            }
764
        } else {
765
            return new JsonModel([
766
                'success' => false,
767
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
768
            ]);
769
        }
770
    }
307 www 771
 
772
 
773
 
774
    /**
775
     *
776
     * @param string $timestamp
777
     * @param string $now
778
     * @return string
779
     */
780
    private function timeAgo($timestamp, $now = '')
781
    {
782
 
783
        if ($now) {
784
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
1 efrain 785
        } else {
307 www 786
            $now = date('Y-m-d H:i:s');
787
            $datetime1 = date_create($now);
1 efrain 788
        }
307 www 789
        $datetime2 = date_create($timestamp);
790
 
791
        $diff = date_diff($datetime1, $datetime2);
792
        $timemsg = '';
793
        if ($diff->y > 0) {
794
            $timemsg = $diff->y . ' ' .($diff->y > 1 ? $this->translator->translate('LABEL_YEARS_SMALL')  : $this->translator->translate('LABEL_YEAR_SMALL') );
795
        } else if ($diff->m > 0) {
796
            $timemsg = $diff->m  . ' ' .($diff->m > 1 ? $this->translator->translate('LABEL_MONTHS_SMALL')  : $this->translator->translate('LABEL_MONTH_SMALL') );
797
        } else if ($diff->d > 0) {
798
            $timemsg = $diff->d . ' ' .($diff->d > 1 ? $this->translator->translate('LABEL_DAYS_SMALL')  : $this->translator->translate('LABEL_DAY_SMALL') );
799
        } else if ($diff->h > 0) {
800
            $timemsg = $diff->h  . ' ' .($diff->h > 1 ? $this->translator->translate('LABEL_HOURS_SMALL')  : $this->translator->translate('LABEL_HOUR_SMALL') );
801
        } else if ($diff->i > 0) {
802
            $timemsg = $diff->i  . ' ' .($diff->i > 1 ? $this->translator->translate('LABEL_MINUTES_SMALL')  : $this->translator->translate('LABEL_MINUTE_SMALL') );
803
        } else if ($diff->s > 0) {
804
            $timemsg = $diff->s  . ' ' . ($diff->s > 1 ? $this->translator->translate('LABEL_SECONDS_SMALL')  : $this->translator->translate('LABEL_SECOND_SMALL') );
805
        }
806
        if (!$timemsg) {
807
            $timemsg = $this->translator->translate('LABEL_NOW') ;
808
        } else {
809
            $timemsg = $this->translator->translate('LABEL_AGO_SMALL') . ' '. $timemsg . '';
810
        }
811
        return $timemsg;
812
 
1 efrain 813
    }
307 www 814
 
815
 
816
    public function deleteAction()
1 efrain 817
    {
818
        $request = $this->getRequest();
819
        if ($request->isPost()) {
820
            $currentUserPlugin = $this->plugin('currentUserPlugin');
821
            $currentUser = $currentUserPlugin->getUser();
822
 
823
            $id = $this->params()->fromRoute('id');
824
            if (!$id) {
825
                return new JsonModel([
826
                    'success' => false,
827
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
828
                ]);
829
            }
830
 
307 www 831
            $userMapper = UserMapper::getInstance($this->adapter);
832
            $user = $userMapper->fetchOneByUuid($id);
1 efrain 833
            if (!$user) {
834
                return new JsonModel([
835
                    'success' => false,
836
                    'data' => 'ERROR_REQUEST_IS_INVALID'
837
                ]);
838
            }
839
 
307 www 840
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
841
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1 efrain 842
 
843
 
307 www 844
            if ($conversation) {
1 efrain 845
 
307 www 846
                if ($conversation->sender_id == $currentUser->id && $conversation->receiver_id == $user->id) {
847
                    $conversation->sender_status = Conversation::STATUS_DELETED;
848
                    if ($conversationMapper->update($conversation)) {
849
                        $response = [
850
                            'success' => true,
851
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
852
                        ];
853
                    } else {
291 www 854
 
307 www 855
 
856
                        $response = [
857
                            'success' => false,
858
                            'data' => $conversationMapper->getError()
859
                        ];
291 www 860
                    }
307 www 861
                }
862
 
863
                if ($conversation->receiver_id == $currentUser->id && $conversation->sender_id == $user->id) {
864
                    $conversation->receiver_status = Conversation::STATUS_DELETED;
865
                    if ($conversationMapper->update($conversation)) {
866
                        $response = [
867
                            'success' => true,
868
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
869
                        ];
291 www 870
                    } else {
1 efrain 871
 
307 www 872
 
873
                        $response = [
874
                            'success' => false,
875
                            'data' => $conversationMapper->getError()
876
                        ];
1 efrain 877
                    }
878
                }
879
 
307 www 880
                return new JsonModel($response);
261 efrain 881
 
1 efrain 882
            } else {
307 www 883
                $response = [
884
                    'success' => false,
885
                    'data' => 'ERROR_CONVERSATION_NOT_FOUND'
886
                ];
1 efrain 887
            }
307 www 888
 
889
            return new JsonModel($response);
1 efrain 890
        } else {
307 www 891
            $response = [
1 efrain 892
                'success' => false,
893
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
307 www 894
            ];
1 efrain 895
        }
307 www 896
 
897
        return new JsonModel($response);
1 efrain 898
    }
899
}