Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
10273 eleazar 1
<?php
11317 eleazar 2
declare(strict_types=1);
10273 eleazar 3
 
11317 eleazar 4
namespace LeadersLinked\Controller;
10273 eleazar 5
 
11985 eleazar 6
 
11317 eleazar 7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
11985 eleazar 10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
 
14
use LeadersLinked\Mapper\CompanyMapper;
15
use LeadersLinked\Mapper\CompanyUserMapper;
16
use LeadersLinked\Form\CreateFeedForm;
11798 eleazar 17
use LeadersLinked\Form\CommentForm;
18
use LeadersLinked\Form\CommentAnswerForm;
19
use LeadersLinked\Model\Comment;
20
use LeadersLinked\Mapper\CommentMapper;
21
use LeadersLinked\Mapper\FeedMapper;
22
use LeadersLinked\Mapper\GroupMapper;
11985 eleazar 23
use LeadersLinked\Model\Feed;
24
use LeadersLinked\Mapper\QueryMapper;
11317 eleazar 25
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
11795 eleazar 26
use LeadersLinked\Library\Image;
27
use LeadersLinked\Model\VideoConvert;
28
use LeadersLinked\Mapper\VideoConvertMapper;
29
use LeadersLinked\Mapper\LikeMapper;
30
use Laminas\Paginator\Adapter\DbSelect;
31
use Laminas\Paginator\Paginator;
32
use LeadersLinked\Mapper\UserMapper;
33
use LeadersLinked\Library\Functions;
34
use LeadersLinked\Model\Company;
35
use LeadersLinked\Model\UserType;
11985 eleazar 36
use Laminas\Authentication\AuthenticationService;
37
use Laminas\Authentication\Result as AuthResult;
38
use Laminas\Mvc\I18n\Translator;
39
use LeadersLinked\Mapper\MyTrainerQuestionsMapper;
40
use LeadersLinked\Mapper\FeedTopicMapper;
12376 eleazar 41
use LeadersLinked\Mapper\TopicMapper;
11985 eleazar 42
use LeadersLinked\Form\MyTrainerQuestionForm;
43
use LeadersLinked\Model\MyTrainerQuestions;
10601 eleazar 44
 
11709 eleazar 45
use LeadersLinked\Model\FeedTopic;
11317 eleazar 46
use LeadersLinked\Form\TopicForm;
10601 eleazar 47
 
11317 eleazar 48
class MyTrainerAnswerController extends AbstractActionController
49
{
50
    /**
51
     *
52
     * @var AdapterInterface
53
     */
54
    private $adapter;
55
 
56
 
57
    /**
58
     *
59
     * @var AbstractAdapter
60
     */
61
    private $cache;
62
 
63
    /**
64
     *
65
     * @var  LoggerInterface
66
     */
67
    private $logger;
68
 
69
    /**
70
     *
71
     * @var array
72
     */
73
    private $config;
74
 
75
 
76
 
77
    /**
78
     *
79
     * @param AdapterInterface $adapter
80
     * @param AbstractAdapter $cache
81
     * @param LoggerInterface $logger
82
     * @param array $config
83
     */
84
    public function __construct($adapter, $cache , $logger, $config)
85
    {
86
        $this->adapter      = $adapter;
87
        $this->cache        = $cache;
88
        $this->logger       = $logger;
89
        $this->config       = $config;
90
 
91
 
10273 eleazar 92
    }
10601 eleazar 93
 
11873 eleazar 94
    public function indexAction()
95
    {
96
        $currentUserPlugin = $this->plugin('currentUserPlugin');
97
        $currentUser = $currentUserPlugin->getUser();
98
        $currentCompany = $currentUserPlugin->getCompany();
11882 eleazar 99
        $id =  $this->params()->fromRoute('id');
12603 eleazar 100
 
11982 eleazar 101
        $feedMapper = FeedMapper::getInstance($this->adapter);
102
        $title  = $feedMapper->fetchOneByUuid($id);
12621 eleazar 103
 
11837 eleazar 104
        $request = $this->getRequest();
11873 eleazar 105
        if($request->isGet()) {
106
            $headers  = $request->getHeaders();
107
 
108
            $isJson = false;
109
            if($headers->has('Accept')) {
110
                $accept = $headers->get('Accept');
111
 
112
                $prioritized = $accept->getPrioritized();
113
 
114
                foreach($prioritized as $key => $value) {
115
                    $raw = trim($value->getRaw());
116
 
117
                    if(!$isJson) {
118
                        $isJson = strpos($raw, 'json');
119
                    }
12707 eleazar 120
 
11873 eleazar 121
                }
122
            }
12471 eleazar 123
 
124
            $form = new CreateFeedForm($this->adapter);
12794 eleazar 125
 
126
            $tagsMapper = TopicMapper::getInstance($this->adapter);
12470 eleazar 127
            $topicsMapper = FeedTopicMapper::getInstance($this->adapter);
12590 eleazar 128
            $feedTopic = $topicsMapper->fetchOneByFeedId($title->id);
12816 eleazar 129
            $answer = $feedMapper->fetchAllByMytAnswer($title->related_feed);
12707 eleazar 130
            $topicRelationships = $topicsMapper->fetchAllByTopicId($feedTopic->topic_id);
12794 eleazar 131
            $tags = $topicsMapper->fetchAllByFeedId($title->id);
12707 eleazar 132
                foreach ($topicRelationships as $rel) {
133
 
12708 eleazar 134
                    if ($question = $feedMapper->fetchOne($rel->feed_id)) {
12707 eleazar 135
                        $questions [] = $question;
136
                    }
12580 eleazar 137
                }
12794 eleazar 138
 
139
                foreach($tags as $tel){
12796 eleazar 140
                    $badge = $tagsMapper->fetchOne($tel->topic_id);
12794 eleazar 141
                    $badges [] = $badge;
142
                }
12798 eleazar 143
 
12819 eleazar 144
 
11873 eleazar 145
            $this->layout()->setTemplate('layout/layout-backend');
146
            $viewModel = new ViewModel();
11877 eleazar 147
            $viewModel->setTemplate('leaders-linked/my-trainer-answer/index.phtml');
11873 eleazar 148
            $viewModel->setVariables([
11878 eleazar 149
                'form'      => $form,
11882 eleazar 150
                'id'        => $id,
11982 eleazar 151
                'title_title' => $title->title,
152
                'title_description' => $title->description,
12520 eleazar 153
                'questions' => $questions,
12798 eleazar 154
                'badges' => $badges,
12811 eleazar 155
                'date' => $title->added_on,
12819 eleazar 156
                'answer' => $answer,
12501 eleazar 157
 
11873 eleazar 158
            ]);
159
            return $viewModel ;
12707 eleazar 160
 
161
 
11873 eleazar 162
        } else {
163
            return new JsonModel([
164
                'success' => false,
165
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
166
            ]);
167
        }
168
    }
11944 eleazar 169
 
11971 eleazar 170
    public function timelineAction(){
11944 eleazar 171
         $currentUserPlugin = $this->plugin('currentUserPlugin');
172
         $currentUser = $currentUserPlugin->getUser();
173
         $currentCompany = $currentUserPlugin->getCompany();
11945 eleazar 174
         $request = $this->getRequest();
11944 eleazar 175
         if($request->isGet()) {
176
 
11952 eleazar 177
            $feed_uuid =  $this->params()->fromRoute('id');
178
                     if(!isset($feed_uuid)){
179
                    $data = [
180
                        'success'   => false,
181
                        'data'   => 'ERROR_INVALID_PARAMETER'
182
                    ];
11944 eleazar 183
 
11952 eleazar 184
                    return new JsonModel($data);
185
            }
186
 
187
            $items = [];
188
            $feedMapper = FeedMapper::getInstance($this->adapter);
11953 eleazar 189
            $feed  = $feedMapper->fetchOneByUuid($feed_uuid);
11954 eleazar 190
            $feeds = $feedMapper->fetchAllByMytAnswer($feed->related_feed);
11957 eleazar 191
 
192
            if (!$feeds) {
11952 eleazar 193
                $data = [
194
                    'success' => false,
195
                    'data' => 'ERROR_RECORD_NOT_FOUND'
196
                ];
197
                      return new JsonModel($data);
198
            }
199
 
11955 eleazar 200
            $items = [];
201
 
202
 
203
            foreach($feeds as $solution)
204
            {
205
                $items = $this->renderFeed($solution->id);
206
            }
11962 eleazar 207
 
11952 eleazar 208
               $response = [
209
                    'success' => true,
210
                    'data' => [
11959 eleazar 211
                        'items' =>$items,
11952 eleazar 212
                        'feed_title'=>$feed->title,
213
                        'topic_title'=>$feed->description
214
                    ]
215
                ];
216
                      return new JsonModel($response);
217
        }
11944 eleazar 218
    }
11873 eleazar 219
 
11971 eleazar 220
    public function feedAction() {
11967 eleazar 221
 
222
        $currentUserPlugin = $this->plugin('currentUserPlugin');
223
        $currentUser = $currentUserPlugin->getUser();
224
        $currentCompany = $currentUserPlugin->getCompany();
225
 
226
 
227
 
228
 
11837 eleazar 229
 
11967 eleazar 230
        $request = $this->getRequest();
231
        if($request->isGet()) {
232
 
233
 
11972 eleazar 234
            $page = (int) $this->params()->fromQuery('page');
11967 eleazar 235
            $myt_id =  $this->params()->fromRoute('id');
236
 
237
 
238
            $feedMapper = FeedMapper::getInstance($this->adapter);
239
            $myt  = $feedMapper->fetchOneByUuid($myt_id);
240
            $queryMapper = QueryMapper::getInstance($this->adapter);
241
            $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
11973 eleazar 242
            $select->columns(['id']);
11967 eleazar 243
            $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
244
            $select->where->equalTo('company_id',$currentCompany->id);
245
            $select->where->equalTo('related_feed', $myt->id);
246
            $select->where->and->equalTo('type', Feed::TYPE_MYT_ANSWER);
247
            $select->order('added_on desc');
248
 
249
 
250
            $dbSelect = new DbSelect($select, $this->adapter);
251
            $paginator = new Paginator($dbSelect);
252
            $paginator->setCurrentPageNumber($page ? $page : 1);
253
            $paginator->setItemCountPerPage(10);
254
 
255
            $items = [];
256
            $feeds = $paginator->getCurrentItems();
11980 eleazar 257
 
11967 eleazar 258
            foreach($feeds as $feed)
259
            {
260
                $items[] = $this->renderFeed($feed->id);
261
            }
262
 
263
            $response = [
264
                'success' => true,
265
                'data' => [
266
                    'total' => [
267
                        'count' => $paginator->getTotalItemCount(),
268
                        'pages' => $paginator->getPages()->pageCount,
269
                    ],
270
                    'current' => [
271
                        'items'    => $items,
272
                        'page'     => $paginator->getCurrentPageNumber(),
273
                        'count'    => $paginator->getCurrentItemCount(),
274
                    ]
275
                ]
276
            ];
277
 
278
            return new JsonModel($response);
279
        }
280
 
281
        $response = [
282
            'success' => false,
283
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
284
        ];
285
 
286
 
287
        return new JsonModel($response);
288
    }
289
 
11336 eleazar 290
    public function addAction() {
291
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
292
        $currentCompany     = $currentUserPlugin->getCompany();
293
        $currentUser        = $currentUserPlugin->getUser();
294
 
11787 eleazar 295
        $id =  $this->params()->fromRoute('id');
11343 eleazar 296
        $questionsMapper = FeedMapper::getInstance($this->adapter);
11787 eleazar 297
        $question = $questionsMapper->fetchOneByUuid($id);
11336 eleazar 298
        $request    = $this->getRequest();
299
        try{
300
        if($request->isPost()) {
301
            $form = new  CreateFeedForm($this->adapter);
11710 eleazar 302
 
303
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
11336 eleazar 304
            $categoriesId = $dataPost['category_id'] ?? [];
305
            $dataPost['category_id'] = null;
306
            $form->setData($dataPost);
307
 
308
            if($form->isValid()) {
309
 
310
                $dataPost = (array) $form->getData();
311
                $hydrator = new ObjectPropertyHydrator();
312
                $feed = new Feed();
313
                $hydrator->hydrate($dataPost, $feed);
314
 
315
                $feed->user_id = $currentUser->id;
316
                $feed->company_id = $currentCompany->id;
317
                $feed->user_id          = $currentUser->id;
11343 eleazar 318
                $feed->type             = Feed::TYPE_MYT_ANSWER;
11336 eleazar 319
                $feed->posted_or_shared = Feed::POSTED;
320
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
11343 eleazar 321
                $feed->related_feed = $question->id;
11336 eleazar 322
 
11710 eleazar 323
                $feed->total_comments   = 0;
324
                $feed->total_shared     = 0;
325
 
326
 
327
                $files = $this->getRequest()->getFiles()->toArray();
328
                $file_type = '';
329
                if(isset($files['file']) && empty($files['file']['error'])) {
330
                    $feed_tmp_filename  = $files['file']['tmp_name'];
331
                    $feed_filename      = $this->normalizeString($files['file']['name']);
332
 
333
                    $mime_type = mime_content_type($feed_tmp_filename);
334
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
335
                        $file_type = Feed::FILE_TYPE_IMAGE;
336
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
337
                        $file_type = Feed::FILE_TYPE_VIDEO;
338
                    } else if($mime_type == 'application/pdf') {
339
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
340
                    }
341
                }
342
 
11336 eleazar 343
                $feedMapper = FeedMapper::getInstance($this->adapter);
344
 
345
                if($feedMapper->insert($feed)) {
11343 eleazar 346
                    $feed = $feedMapper->fetchOne($feed->id);
347
                    $category = new FeedTopic();
348
                    $feedMapper->update($feed);
11705 eleazar 349
 
11336 eleazar 350
 
11705 eleazar 351
                        $feed = $feedMapper->fetchOne($feed->id);
352
 
353
                        if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
354
                            try {
355
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
356
                                if(!file_exists($target_path)) {
357
                                    mkdir($target_path, 0755);
358
                                }
359
 
360
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
361
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
362
                                if($result) {
363
 
364
                                    $feed->file_type = $file_type;
365
                                    $feed->file_name = basename($feed_filename);
366
                                    $feedMapper->update($feed);
367
                                } else {
368
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
369
                                }
370
                            } catch(\Throwable $e) {
371
                                error_log($e->getTraceAsString());
372
                            }
373
                        }
374
                        if( $file_type == Feed::FILE_TYPE_IMAGE) {
375
                            try {
376
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
377
                                if(!file_exists($target_path)) {
378
                                    mkdir($target_path, 0755);
379
                                }
380
 
381
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
382
 
383
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
384
                                $crop_to_dimensions = false;
385
                                if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
386
                                    $feed->file_type = $file_type;
387
                                    $feed->file_name = basename($feed_filename);
388
                                    $feedMapper->update($feed);
389
                                }
390
                            } catch(\Throwable $e) {
391
                                error_log($e->getTraceAsString());
392
                            }
393
                        }
394
                        if( $file_type == Feed::FILE_TYPE_VIDEO) {
395
                            try {
396
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
397
                                if(!file_exists($target_path)) {
398
                                    mkdir($target_path, 0755);
399
                                }
400
 
401
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
402
 
403
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
404
                                if($result) {
405
 
406
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
407
                                    $getFromSecound = 2;
408
 
409
                                    //extracción del cover
410
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
411
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
412
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
413
                                    exec($cmd);
414
 
415
 
416
                                    $feed->file_type = $file_type;
417
                                    $feed->file_name = basename($feed_filename);
418
                                    $feed->file_image_preview = basename($generateFile);
419
                                    $feedMapper->update($feed);
420
 
421
                                    $videoConvert = new VideoConvert();
422
                                    $videoConvert->filename = $full_filename;
423
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
424
 
425
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
426
                                    $videoConvertMapper->insert($videoConvert);
427
                                } else {
428
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
429
                                }
430
                            } catch(\Throwable $e) {
431
                                error_log($e->getTraceAsString());
432
                            }
433
                        }
11714 eleazar 434
 
435
 
436
                        $response = [
437
                            'success'   => true,
438
                            'data'   => 'success'
439
                        ];
11336 eleazar 440
                } else {
11705 eleazar 441
                    $messages = [];
442
                    $form_messages = (array) $form->getMessages();
443
                    foreach($form_messages  as $fieldname => $field_messages)
444
                    {
445
                        $messages[$fieldname] = array_values($field_messages);
446
                    }
447
 
11336 eleazar 448
                }
449
 
450
            } else {
11705 eleazar 451
                $response = [
452
                    'success' => false,
453
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
454
                ];
11336 eleazar 455
            }
456
 
11714 eleazar 457
            return new JsonModel($response);
11336 eleazar 458
        }
459
 
460
    } catch (\Throwable $e) {
461
        $e->getMessage();
11984 eleazar 462
        return new JsonModel([
463
            'success' => false,
464
            'data' => $e
465
        ]);
11336 eleazar 466
    }
467
    }
11791 eleazar 468
 
11998 eleazar 469
     /**
470
     *
471
     * @param string $str
472
     * @return string
473
     */
474
    private function normalizeString ($str = ''){
475
        $basename  = substr($str, 0, strrpos($str, '.'));
476
        $basename  = str_replace('.', '-', $basename);
477
 
478
        $extension  = substr($str, strrpos($str, '.'));
479
 
480
        $str = $basename . $extension;
481
 
482
        $str = strip_tags($str);
483
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
484
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
485
        $str = strtolower($str);
486
        $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
487
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
488
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
489
        $str = str_replace(' ', '-', $str);
490
        $str = rawurlencode($str);
491
        $str = str_replace('%', '-', $str);
492
        return trim(strtolower($str));
493
    }
494
 
11793 eleazar 495
    private function renderFeed($id){
11791 eleazar 496
 
11885 eleazar 497
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
498
        if($sandbox) {
499
            $company_profile_url = $this->config['leaderslinked.frontend.sandbox_company_profile'];
500
            $user_profile_url = $this->config['leaderslinked.frontend.sandbox_user_profile'];
501
 
502
        } else {
503
            $company_profile_url = $this->config['leaderslinked.frontend.production_company_profile'];
504
            $user_profile_url = $this->config['leaderslinked.frontend.production_user_profile'];
505
        }
11791 eleazar 506
 
507
 
508
        $currentUserPlugin = $this->plugin('currentUserPlugin');
509
        $currentUser = $currentUserPlugin->getUser();
510
        $currentCompany = $currentUserPlugin->getCompany();
511
 
512
        $companyMapper = CompanyMapper::getInstance($this->adapter);
513
        $company = $companyMapper->fetchOne($currentCompany->id);
514
 
515
        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
11980 eleazar 516
        $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
11791 eleazar 517
 
518
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
11976 eleazar 519
 
520
 
11995 eleazar 521
 
11791 eleazar 522
 
11977 eleazar 523
        $feedMapper = FeedMapper::getInstance($this->adapter);
524
        $feed = $feedMapper->fetchOne($id);
11995 eleazar 525
 
526
        $params = [
527
            'id' => $feed->uuid,
528
        ];
11791 eleazar 529
 
530
        $item = [
531
            'feed_unique' => uniqid(),
532
            'feed_uuid' => $feed->uuid,
11973 eleazar 533
            'feed_description' => $feed->description,
11994 eleazar 534
            'feed_delete_url' =>  $this->url()->fromRoute('my-trainer/question/answer/delete', $params),
11791 eleazar 535
            'feed_content_type' => $feed->file_type ? $feed->file_type : '',
536
            'feed_priority'=> $feed->priority,
537
        ];
538
 
539
        $userMapper = UserMapper::getInstance($this->adapter);
540
        $user = $userMapper->fetchOne($feed->user_id);
11994 eleazar 541
        $item['feed_delete_url'] = $this->url()->fromRoute('my-trainer/question/answer/delete',  $params);
11791 eleazar 542
        $item['owner_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
543
        $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $company->uuid, 'type' => 'user', 'filename' => $company->image]);
544
        $item['owner_name'] = $company->name;
545
 
546
        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $feed->added_on);
547
        $item['owner_time_elapse'] = Functions::timeElapsedString( $dt->getTimestamp());
548
 
549
        if($feed->file_type == Feed::FILE_TYPE_IMAGE) {
550
            $item['owner_file_image'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
551
 
552
        }
553
        if($feed->file_type == Feed::FILE_TYPE_DOCUMENT) {
554
            $item['owner_file_document'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
555
        }
556
        if($feed->file_type == Feed::FILE_TYPE_VIDEO) {
557
            $item['owner_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_image_preview]);
558
            $item['owner_file_video'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
559
        }
560
        if($feed->file_type == Feed::FILE_TYPE_MEETING) {
561
            $dt = \DateTime::createFromFormat('Y-m-d', $feed->date);
562
            $dt2 = \DateTime::createFromFormat('H:i:s', $feed->time);
563
            $item['owner_meeting'] =  true;
564
            $item['owner_meeting_date'] =  $dt->format('d/m/Y');
565
            $item['owner_meeting_time'] =  $dt2->format('h:i a');
566
            $item['owner_meeting_link_type'] =  $feed->link_type;
567
            $item['owner_meeting_link_name'] =  $feed->link_name;
568
 
569
        }
570
 
571
        $commentMapper = CommentMapper::getInstance($this->adapter);
572
        $records = $commentMapper->fetchAllPublishedByFeedId($feed->id);
573
 
574
 
575
        $comments = [];
576
        $comment_count=0;
577
        foreach($records as $record)
578
        {
579
            $user = $userMapper->fetchOne($record->user_id);
580
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
581
 
582
            $comment = [];
583
            $comment['unique'] = uniqid();
584
            $comment_count++;
585
            $comment['comment_index']=$comment_count;
586
            $user = $userMapper->fetchOne($record->user_id);
587
            if($user->id == $owner->user_id) {
588
                $comment['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
589
                $comment['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
590
                $comment['user_name'] = $company->name;
591
            } else {
592
                $comment['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
593
                $comment['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
594
                $comment['user_name'] = $user->first_name . ' ' . $user->last_name;
595
            }
11854 eleazar 596
            $comment['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record->uuid ]);
11791 eleazar 597
 
598
 
11854 eleazar 599
            $comment['link_answer_add'] = $this->url()->fromRoute('my-trainer/question/answer/comments/answer',['id' => $feed->uuid, 'comment' => $record->uuid ]);
11791 eleazar 600
            $comment['time_elapsed'] = Functions::timeElapsedString($dt->getTimestamp());
601
            $comment['comment'] = $record->comment;
602
 
603
            $records2 = $commentMapper->fetchAllPublishedByCommentId($record->id);
604
            $answers = [];
605
            $contador=0;
606
            foreach($records2 as $record2)
607
            {
608
                $user = $userMapper->fetchOne($record2->user_id);
609
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record2->added_on);
610
 
611
                $answer = [];
612
                $answer['unique'] = uniqid();
613
 
614
 
615
                $user = $userMapper->fetchOne($record2->user_id);
616
                if($user->id == $owner->user_id) {
617
                    $answer['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
618
                    $answer['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
619
                    $answer['user_name'] = $company->name;
620
                } else {
621
                    $answer['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
622
                    $answer['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
623
                    $answer['user_name'] = $user->first_name . ' ' . $user->last_name;
624
                }
625
 
11854 eleazar 626
                    $answer['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record2->uuid ]);
11791 eleazar 627
 
628
 
629
                $answer['time_elapsed'] = Functions::timeElapsedString($dt->getTimestamp());
630
                $answer['comment'] = $record2->comment;
631
 
632
                $records2 = $commentMapper->fetchAllPublishedByCommentId($record2->id);
633
 
634
                $contador++;
635
                array_push($answers, $answer);
636
            }
637
            $comment['number_answers']=$contador;
638
            $comment['answers'] = $answers;
639
            array_push($comments, $comment);
640
        }
11854 eleazar 641
        $item['comment_add_url'] = $this->url()->fromRoute('my-trainer/question/answer/comments', ['id' => $feed->uuid]);
11791 eleazar 642
            $item['comments'] = $comments;
643
 
644
 
645
 
646
        return $item;
647
    }
11809 eleazar 648
 
649
    public function commentAction()
650
    {
651
 
652
 
653
        $currentUserPlugin = $this->plugin('currentUserPlugin');
654
        $currentUser = $currentUserPlugin->getUser();
655
        $currentCompany = $currentUserPlugin->getCompany();
656
 
657
 
658
        $id = $this->params()->fromRoute('id');
659
 
660
        $request = $this->getRequest();
661
        if($request->isPost()) {
662
            $feedMapper = FeedMapper::getInstance($this->adapter);
663
            $feed = $feedMapper->fetchOneByUuid($id);
664
            if(!$feed) {
665
                $response = [
666
                    'success' => false,
667
                    'data' => 'ERROR_POST_NOT_FOUND'
668
                ];
669
                return new JsonModel($response);
670
            }
671
 
672
            if($feed->company_id != $currentCompany->id) {
673
                $response = [
674
                    'success' => false,
675
                    'data' => 'ERROR_UNAUTHORIZED'
676
                ];
677
                return new JsonModel($response);
678
            }
679
 
680
            $dataPost = $request->getPost()->toArray();
681
            $form = new CommentForm();
682
            $form->setData($dataPost);
683
 
684
            if($form->isValid()) {
685
 
686
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
687
                $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
688
 
689
                $dataPost = (array) $form->getData();
690
                $comment = new Comment();
691
                $comment->comment = $dataPost['comment'];
692
                $comment->feed_id = $feed->id;
693
                $comment->user_id = $currentCompany->id;
694
 
695
                $commentMapper = CommentMapper::getInstance($this->adapter);
696
                if($commentMapper->insert($comment)) {
697
 
698
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
699
 
700
                    $feed->total_comments = $total_comments;
701
                    $feedMapper->update($feed);
702
 
703
                    $response = [
704
                        'success'   => true,
705
                        'data'   => $this->renderComment($comment->id),
706
                        'total_comments' => $total_comments
707
                    ];
708
 
709
                    return new JsonModel($response);
710
 
711
                } else {
712
 
713
                    $response = [
714
                        'success'   => false,
715
                        'data'   => $commentMapper->getError()
716
                    ];
717
 
718
                    return new JsonModel($response);
719
                }
720
 
721
            } else {
722
                $message = '';;
723
                $form_messages = (array) $form->getMessages();
724
                foreach($form_messages  as $fieldname => $field_messages)
725
                {
726
                    foreach( $field_messages as $key => $value)
727
                    {
728
                        $message = $value;
729
                    }
730
                }
731
 
732
                $response = [
733
                    'success'   => false,
734
                    'data'   => $message
735
                ];
736
 
737
                return new JsonModel($response);
738
            }
739
 
740
 
741
        } else {
742
            $response = [
743
                'success' => false,
744
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
745
            ];
746
 
747
            return new JsonModel($response);
748
        }
749
 
750
 
751
    }
11317 eleazar 752
 
11837 eleazar 753
    public function answerAction()
11809 eleazar 754
    {
11317 eleazar 755
 
11809 eleazar 756
 
757
        $currentUserPlugin = $this->plugin('currentUserPlugin');
758
        $currentUser = $currentUserPlugin->getUser();
759
        $currentCompany = $currentUserPlugin->getCompany();
760
 
761
 
762
        $id = $this->params()->fromRoute('id');
763
        $comment_uuid = $this->params()->fromRoute('comment');
764
 
765
        $request = $this->getRequest();
766
        if($request->isPost()) {
767
            $feedMapper = FeedMapper::getInstance($this->adapter);
768
            $feed = $feedMapper->fetchOneByUuid($id);
769
            if(!$feed) {
770
                $response = [
771
                    'success' => false,
772
                    'data' => 'ERROR_POST_NOT_FOUND'
773
                ];
774
                return new JsonModel($response);
775
            }
776
 
777
            if($feed->company_id != $currentCompany->id) {
778
                $response = [
779
                    'success' => false,
780
                    'data' => 'ERROR_UNAUTHORIZED'
781
                ];
782
                return new JsonModel($response);
783
            }
784
 
785
            $dataPost = $request->getPost()->toArray();
786
            $form = new CommentAnswerForm();
787
            $form->setData($dataPost);
788
 
789
            if($form->isValid()) {
790
 
791
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
792
                $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
793
 
794
                $dataPost = (array) $form->getData();
795
                $answer = new Comment();
796
                $answer->comment = $dataPost['answer'];
797
                $answer->feed_id = $feed->id;
798
 
799
                $answer->user_id = $owner->user_id;
800
 
801
                $commentMapper = CommentMapper::getInstance($this->adapter);
802
                $comment=$commentMapper->fetchOneByUuid($comment_uuid);
803
                $answer->parent_id = $comment->id;
804
 
805
                if($commentMapper->insert($answer)) {
806
 
807
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
808
 
809
                    $feed->total_comments = $total_comments;
810
                    $feedMapper->update($feed);
811
 
812
                    $response = [
813
                        'success'   => true,
814
                        'data'   => $this->renderComment($answer->id),
815
                        'total_comments' => $total_comments
816
                    ];
817
 
818
                    return new JsonModel($response);
819
 
820
                } else {
821
 
822
                    $response = [
823
                        'success'   => false,
824
                        'data'   => $commentMapper->getError()
825
                    ];
826
 
827
                    return new JsonModel($response);
828
                }
829
 
830
            } else {
831
                $message = '';;
832
                $form_messages = (array) $form->getMessages();
833
                foreach($form_messages  as $fieldname => $field_messages)
834
                {
835
                    foreach( $field_messages as $key => $value)
836
                    {
837
                        $message = $value;
838
                    }
839
                }
840
 
841
                $response = [
842
                    'success'   => false,
843
                    'data'   => $message
844
                ];
845
 
846
                return new JsonModel($response);
847
            }
848
 
849
 
850
        } else {
851
            $response = [
852
                'success' => false,
853
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
854
            ];
855
 
856
            return new JsonModel($response);
857
        }
858
 
859
 
860
    }
861
 
862
    public function commentDeleteAction()
863
    {
864
        $currentUserPlugin = $this->plugin('currentUserPlugin');
865
        $currentUser = $currentUserPlugin->getUser();
866
        $currentCompany = $currentUserPlugin->getCompany();
867
 
868
        $request = $this->getRequest();
869
        if($request->isPost()) {
870
            $currentUserPlugin = $this->plugin('currentUserPlugin');
871
            $currentUser = $currentUserPlugin->getUser();
872
 
873
            $id = $this->params()->fromRoute('id');
874
            $comment = $this->params()->fromRoute('comment');
875
 
876
            $feedMapper = FeedMapper::getInstance($this->adapter);
877
            $feed = $feedMapper->fetchOneByUuid($id);
878
            if(!$feed) {
879
                $response = [
880
                    'success' => false,
881
                    'data' => 'ERROR_POST_NOT_FOUND'
882
                ];
883
                return new JsonModel($response);
884
            }
885
 
886
            if($feed->company_id != $currentCompany->id) {
887
                $response = [
888
                    'success' => false,
889
                    'data' => 'ERROR_UNAUTHORIZED'
890
                ];
891
                return new JsonModel($response);
892
            }
893
 
894
            $commentMapper = CommentMapper::getInstance($this->adapter);
895
            $comment = $commentMapper->fetchOneByUuid($comment);
896
 
897
            if($comment && $comment->feed_id == $feed->id) {
898
                $comment->status = Comment::STATUS_DELETED;
899
                if($commentMapper->update($comment)) {
900
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
901
 
902
                    $feed = $feedMapper->fetchOne($comment->feed_id);
903
                    $feed->total_comments = $total_comments;
904
                    $feedMapper->update($feed);
905
 
906
 
907
 
908
 
909
 
910
                    $response = [
911
                        'success' => true,
912
                        'data' => [
913
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
914
                            'total_comments' => $total_comments
915
                        ]
916
                   ];
917
                } else {
918
                    $response = [
919
                        'success' => false,
920
                        'data' => $commentMapper->getError()
921
                    ];
922
                }
923
 
924
            } else {
925
                $response = [
926
                    'success' => false,
927
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
928
                ];
929
            }
930
 
931
        } else {
932
            $response = [
933
                'success' => false,
934
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
935
            ];
936
        }
937
 
938
        return new JsonModel($response);
939
    }
940
 
941
    private function renderComment($comment_id)
942
    {
943
        $currentUserPlugin = $this->plugin('currentUserPlugin');
944
        $currentUser = $currentUserPlugin->getUser();
945
        $currentCompany = $currentUserPlugin->getCompany();
946
 
947
        $companyMapper = CompanyMapper::getInstance($this->adapter);
948
        $company = $companyMapper->fetchOne($currentCompany->id);
949
 
950
        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
951
        $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
952
 
953
 
954
 
955
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
956
        if($sandbox) {
957
            $company_profile_url = $this->config['leaderslinked.frontend.sandbox_company_profile'];
958
            $user_profile_url = $this->config['leaderslinked.frontend.sandbox_user_profile'];
959
        } else {
960
            $company_profile_url = $this->config['leaderslinked.frontend.production_company_profile'];
961
            $user_profile_url = $this->config['leaderslinked.frontend.production_user_profile'];
962
        }
963
 
964
 
965
        $item = [];
966
 
967
        $commentMapper = CommentMapper::getInstance($this->adapter);
968
        $record = $commentMapper->fetchOne($comment_id);
969
 
970
        $feedMapper = FeedMapper::getInstance($this->adapter);
971
        $feed = $feedMapper->fetchOne($record->feed_id);
972
 
973
        if($record) {
974
            $userMapper = UserMapper::getInstance($this->adapter);
975
 
976
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
977
 
978
 
979
            $item = [];
980
            $item['unique'] = uniqid();
981
 
982
 
983
            $user = $userMapper->fetchOne($record->user_id);
984
            if($user->id == $owner->user_id) {
985
                $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
986
                $item['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
987
                $item['user_name'] = $company->name;
988
            } else {
989
                $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
990
                $item['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
991
                $item['user_name'] = $user->first_name . ' ' . $user->last_name;
992
            }
993
 
994
 
995
 
11854 eleazar 996
            $item['link_answer_add'] = $this->url()->fromRoute('my-trainer/question/answer/comments/answer',['id' => $feed->uuid, 'comment' => $record->uuid ]);
997
            $item['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record->uuid ]);
11809 eleazar 998
            $item['time_elapsed'] = Functions::timeElapsedString($dt->getTimestamp());
999
            $item['comment'] = $record->comment;
1000
 
1001
        }
1002
        return $item;
1003
    }
11990 eleazar 1004
 
1005
    public function deleteAction()
1006
    {
1007
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1008
        $currentUser = $currentUserPlugin->getUser();
1009
        $currentCompany = $currentUserPlugin->getCompany();
1010
 
1011
        $request = $this->getRequest();
1012
        if($request->isPost()) {
1013
 
1014
 
1015
            $id =  $this->params()->fromRoute('id');
1016
 
1017
            $feedMapper = FeedMapper::getInstance($this->adapter);
1018
            $feed = $feedMapper->fetchOneByUuid($id);
1019
            if(!$feed) {
1020
                $response = [
1021
                    'success' => false,
1022
                    'data' => 'ERROR_POST_NOT_FOUND'
1023
                ];
1024
                return new JsonModel($response);
1025
            }
1026
 
1027
            if($feed->company_id != $currentCompany->id) {
1028
                $response = [
1029
                    'success' => false,
1030
                    'data' => 'ERROR_UNAUTHORIZED'
1031
                ];
1032
                return new JsonModel($response);
1033
            }
1034
 
1035
            $feedMapper = FeedMapper::getInstance($this->adapter);
1036
            $feed->status = Feed::STATUS_DELETED;
1037
            if($feedMapper->update($feed)) {
1038
                $response = [
1039
                    'success' => true,
1040
                    'data' => 'LABEL_FEED_WAS_DELETED'
1041
                ];
1042
 
1043
            } else {
1044
                $response = [
1045
                    'success' => false,
1046
                    'data' => $feedMapper->getError()
1047
                ];
1048
            }
1049
 
1050
 
1051
            return new JsonModel($response);
1052
 
1053
        } else {
1054
            $response = [
1055
                'success' => false,
1056
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1057
            ];
1058
        }
1059
 
1060
        return new JsonModel($response);
1061
    }
11809 eleazar 1062
 
11317 eleazar 1063
}