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