Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5050 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
6849 efrain 7
 
5050 efrain 8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
6388 efrain 12
use LeadersLinked\Mapper\MyCoachCategoryMapper;
6521 efrain 13
 
6388 efrain 14
use LeadersLinked\Form\MyCoach\MyCoachQuestionForm;
6521 efrain 15
use LeadersLinked\Library\MyCoachAccessControl;
16
use LeadersLinked\Form\MyCoach\MyCoachAnswerForm;
17
use LeadersLinked\Mapper\MyCoachQuestionMapper;
18
use LeadersLinked\Mapper\MyCoachQuestionCategoryMapper;
19
use LeadersLinked\Model\MyCoachQuestionCategory;
20
use LeadersLinked\Mapper\QueryMapper;
21
use LeadersLinked\Model\MyCoachQuestion;
22
use Laminas\Db\ResultSet\HydratingResultSet;
23
use Laminas\Paginator\Adapter\DbSelect;
24
use Laminas\Paginator\Paginator;
25
use LeadersLinked\Mapper\UserMapper;
26
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
27
use LeadersLinked\Library\Functions;
28
use LeadersLinked\Mapper\MyCoachAnswerMapper;
29
use LeadersLinked\Mapper\CommentMapper;
30
use LeadersLinked\Model\MyCoachAnswer;
31
use LeadersLinked\Form\MyCoach\CommentForm;
32
use LeadersLinked\Model\Comment;
33
use LeadersLinked\Mapper\ContentReactionMapper;
34
use LeadersLinked\Model\ContentReaction;
35
use LeadersLinked\Mapper\MyCoachQuestionViewMapper;
36
use LeadersLinked\Model\MyCoachQuestionView;
5050 efrain 37
 
7141 efrain 38
 
5050 efrain 39
class MyCoachController extends AbstractActionController
40
{
41
    /**
42
     *
6866 efrain 43
     * @var \Laminas\Db\Adapter\AdapterInterface
5050 efrain 44
     */
45
    private $adapter;
6866 efrain 46
 
5050 efrain 47
    /**
48
     *
6866 efrain 49
     * @var \LeadersLinked\Cache\CacheInterface
5050 efrain 50
     */
6866 efrain 51
    private $cache;
52
 
53
 
54
    /**
55
     *
56
     * @var \Laminas\Log\LoggerInterface
57
     */
5050 efrain 58
    private $logger;
6866 efrain 59
 
5050 efrain 60
    /**
61
     *
62
     * @var array
63
     */
64
    private $config;
6866 efrain 65
 
66
 
5050 efrain 67
    /**
68
     *
6866 efrain 69
     * @var \Laminas\Mvc\I18n\Translator
70
     */
71
    private $translator;
72
 
73
 
74
    /**
75
     *
76
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
77
     * @param \LeadersLinked\Cache\CacheInterface $cache
78
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
5050 efrain 79
     * @param array $config
6866 efrain 80
     * @param \Laminas\Mvc\I18n\Translator $translator
5050 efrain 81
     */
6866 efrain 82
    public function __construct($adapter, $cache, $logger, $config, $translator)
5050 efrain 83
    {
84
        $this->adapter      = $adapter;
6866 efrain 85
        $this->cache        = $cache;
5050 efrain 86
        $this->logger       = $logger;
87
        $this->config       = $config;
6866 efrain 88
        $this->translator   = $translator;
6388 efrain 89
    }
5050 efrain 90
 
91
    /**
92
     *
93
     * Generación del listado de perfiles
94
     * {@inheritDoc}
95
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
96
     */
97
    public function indexAction()
98
    {
6388 efrain 99
        $currentUserPlugin = $this->plugin('currentUserPlugin');
100
        $currentUser = $currentUserPlugin->getUser();
101
 
102
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
103
        $currentNetwork = $currentNetworkPlugin->getNetwork();
104
 
5050 efrain 105
        $request = $this->getRequest();
6388 efrain 106
        if ($request->isGet()) {
6521 efrain 107
 
7120 efrain 108
            $isJson = false;
6521 efrain 109
 
7120 efrain 110
            $headers  = $request->getHeaders();
111
            if ($headers->has('Accept')) {
112
                $accept = $headers->get('Accept');
113
 
114
                $prioritized = $accept->getPrioritized();
115
 
116
                foreach ($prioritized as $key => $value) {
117
                    $raw = trim($value->getRaw());
118
 
119
                    if (!$isJson) {
120
                        $isJson = strpos($raw, 'json');
121
                    }
122
                }
123
            }
124
 
125
            // $isJson = true;
126
            if ($isJson) {
127
 
128
                $myCoachAccesControl = MyCoachAccessControl::getInstance($this->adapter);
129
                $categories = $myCoachAccesControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
130
 
131
                return new JsonModel([
132
                    'success' => true,
133
                    'data' => [
134
                        'categories' => $categories,
135
                    ]
136
                ]);
137
 
138
            } else {
139
 
140
                $myCoachAccesControl = MyCoachAccessControl::getInstance($this->adapter);
141
                $categories = $myCoachAccesControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
142
 
143
                $formQuestion = new MyCoachQuestionForm($categories);
144
                $formAnswer = new MyCoachAnswerForm();
145
 
146
 
147
                $this->layout()->setTemplate('layout/layout');
148
                $viewModel = new ViewModel();
149
                $viewModel->setTemplate('leaders-linked/my-coach/index');
150
                $viewModel->setVariables([
151
                    'categories' => $categories,
152
                    'formQuestion' => $formQuestion,
153
                    'formAnswer' => $formAnswer,
154
                ]);
155
                return $viewModel;
156
            }
5050 efrain 157
 
6521 efrain 158
        } else {
159
            return new JsonModel([
160
                'success' => false,
161
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
162
            ]);
163
        }
164
    }
165
 
166
    public function questionsAction()
167
    {
168
        $currentUserPlugin = $this->plugin('currentUserPlugin');
169
        $currentUser = $currentUserPlugin->getUser();
170
 
171
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
172
        $currentNetwork = $currentNetworkPlugin->getNetwork();
173
 
174
 
175
        $request = $this->getRequest();
176
        if ($request->isGet()) {
177
            $userMapper                     = UserMapper::getInstance($this->adapter);
178
            $myCoachCategoryMapper          = MyCoachCategoryMapper::getInstance($this->adapter);
179
            $myCoachQuestionCategoryMapper  = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
180
            $myCoachAccessControl           = MyCoachAccessControl::getInstance($this->adapter);
181
 
6749 efrain 182
            $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
183
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
6521 efrain 184
            $page   = intval($this->params()->fromQuery('start', 1), 10);
185
 
186
            $order_field        = 'added_on';
187
            $order_direction    = 'asc';
188
            $records_x_page     = 12;
189
 
6685 efrain 190
 
6521 efrain 191
            if ($category_filter_id) {
192
 
193
                $message_error = '';
194
                if(!$myCoachAccessControl->hasAccessForCategory($currentUser->id, $category_filter_id, $currentNetwork->id, $message_error)) {
195
 
196
                    return new JsonModel([
197
                        'success' => true,
198
                        'data' => $message_error,
199
                    ]);
200
 
6388 efrain 201
                }
6521 efrain 202
 
203
                $categoryFilter = $myCoachCategoryMapper->fetchOneByUuid($category_filter_id);
204
                $category_ids = [$categoryFilter->id];
205
            } else {
206
                $category_ids = $myCoachAccessControl->getCategoryIdsWithAccess($currentUser->id, $currentNetwork->id);
207
            }
208
 
209
            $category_ids_with_edition = $myCoachAccessControl->getCategoryIdsWithEdition($currentUser->id);
210
 
211
            $queryMapper = QueryMapper::getInstance($this->adapter);
212
 
213
            $prototype = new MyCoachQuestion();
214
            $selectIn = $queryMapper->getSql()->select(MyCoachQuestionCategoryMapper::_TABLE);
6685 efrain 215
            $selectIn->columns(['question_id']);
6521 efrain 216
            $selectIn->where->in('category_id', $category_ids);
217
 
218
 
219
 
220
            $select = $queryMapper->getSql()->select(MyCoachQuestionMapper::_TABLE);
221
            $select->where->in('id', $selectIn);
222
 
223
            if($search) {
224
                $select->where->nest()
225
                -> like('title', '%' . $search . '%')->or->like('description', '%' . $search . '%')
226
                ->unnest();
227
            }
228
            $select->order($order_field . ' ' . $order_direction);
229
 
230
            //echo $select->getSqlString($this->adapter->platform);
231
            //exit;
232
 
233
 
234
            $users = [];
235
            $categories = [];
236
            //echo $select->getSqlString($this->adapter->platform); exit;
237
 
238
            $hydrator   = new ObjectPropertyHydrator();
239
            $resultset  = new HydratingResultSet($hydrator, $prototype);
240
 
241
            $adapter = new DbSelect($select, $queryMapper->getSql(), $resultset);
242
            $paginator = new Paginator($adapter);
243
            $paginator->setItemCountPerPage($records_x_page);
244
            $paginator->setCurrentPageNumber($page);
245
 
246
 
247
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
248
            $commentMapper = CommentMapper::getInstance($this->adapter);
249
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
250
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
251
 
252
            $items = [];
253
            $records = $paginator->getCurrentItems();
254
            foreach ($records as $record)
255
            {
256
                $bags_categories = [];
257
 
258
                $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($record->id);
6388 efrain 259
 
6521 efrain 260
 
261
 
262
 
263
                $allowEdit   = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
264
                $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
265
                foreach($questionCategories as $questionCategory)
266
                {
267
                    if(in_array($questionCategory->category_id, $category_ids_with_edition)) {
268
 
269
                        $allowDelete = true;
270
                    }
271
 
272
                    if (!isset($categories[$questionCategory->category_id])) {
273
                        $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
274
                        if ($category) {
275
                            $categories[$category->id] = $category->name;
276
 
6388 efrain 277
                        }
278
                    }
6521 efrain 279
 
280
                    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
6388 efrain 281
                }
6521 efrain 282
 
283
                if(isset($users[$record->user_id])) {
284
                    $user = $users[ $record->user_id ];
285
                } else {
286
                    $user = $userMapper->fetchOne($record->user_id);
287
                    $users[ $record->user_id ] = $user;
288
                }
289
 
290
 
291
                $description = strip_tags($record->description);
292
                if (strlen($description) > 250) {
293
                    $description = substr($description, 0, 250) . '...';
294
                }
295
 
296
 
297
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
298
                $added_on = $dt->format('d/m/Y H:i a');
299
 
300
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
301
                $updated_on = $dt->format('d/m/Y H:i a');
302
 
303
                $item = [
304
                    'uuid' => $record->uuid,
305
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
306
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
307
                    'title' => $record->title,
308
                    'description' => $description,
309
                    'categories' => $bags_categories,
310
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($record->id), 10),
311
                    'answers' =>  intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($record->id), 10),
312
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($record->id), 10),
313
                    'comments' =>  intval($commentMapper->fetchCountByMyCoachQuestionId($record->id), 10),
314
                    'added_on' => $added_on,
315
                    'updated_on' => $updated_on,
316
                    'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $record->uuid]),
317
                    'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $record->uuid]),
318
                    'link_edit' => $allowEdit ?  $this->url()->fromRoute('my-coach/questions/edit', ['id' => $record->uuid]) : '',
319
                    'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' =>  $record->uuid]) : '',
320
                ];
321
 
322
                array_push($items, $item);
323
            }
324
 
325
            return new JsonModel([
326
                'success' => true,
327
                'data' => [
328
                    'items' => $items,
329
                    'total' => $paginator->getTotalItemCount(),
330
                    'page' => $paginator->getCurrentPageNumber(),
331
                    'total_pages' => $paginator->getPageRange()
332
                ]
333
            ]);
334
 
335
 
336
        } else {
337
            return new JsonModel([
338
                'success' => false,
339
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
340
            ]);
341
        }
342
    }
343
 
344
    public function addQuestionAction()
345
    {
346
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
347
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
348
 
349
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
350
        $currentUser        = $currentUserPlugin->getUser();
351
 
352
        $request            = $this->getRequest();
353
 
354
        if ($request->isPost()) {
355
 
356
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
357
 
358
 
359
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
360
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
361
 
362
            $form = new MyCoachQuestionForm($categories);
363
            $form->setData($dataPost);
364
 
365
            if ($form->isValid()) {
366
                $dataPost = (array) $form->getData();
367
 
368
                $myCoachQuestion = new MyCoachQuestion();
369
                $myCoachQuestion->network_id    = $currentNetwork ->id;
370
                $myCoachQuestion->user_id       = $currentUser->id;
371
                $myCoachQuestion->title         = $dataPost['title'];
372
                $myCoachQuestion->description   = $dataPost['description'];
373
 
374
 
375
                $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
376
                if ($myCoachQuestionMapper->insert($myCoachQuestion)) {
377
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
378
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
379
 
380
                    $category_ids = $dataPost['category_id'];
381
                    foreach($category_ids as $category_id)
382
                    {
383
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
384
                        if($myCoachCategory) {
385
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
386
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
387
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
388
 
389
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
390
                        }
391
                    }
392
 
393
 
394
                    $this->logger->info('Se agrego la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
395
 
396
                    $data = [
397
                        'success'   => true,
398
                        'data'   => 'LABEL_RECORD_ADDED'
399
                    ];
400
                } else {
401
                    $data = [
402
                        'success'   => false,
403
                        'data'      => $myCoachQuestionMapper->getError()
404
                    ];
405
                }
406
 
407
                return new JsonModel($data);
408
            } else {
409
                $messages = [];
410
                $form_messages = (array) $form->getMessages();
411
                foreach ($form_messages  as $fieldname => $field_messages)
412
                {
413
                    $messages[$fieldname] = array_values($field_messages);
414
                }
415
 
416
                return new JsonModel([
417
                    'success'   => false,
418
                    'data'   => $messages
419
                ]);
420
            }
421
        } else {
422
            $data = [
423
                'success' => false,
424
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
425
            ];
426
 
427
            return new JsonModel($data);
428
        }
429
 
430
        return new JsonModel($data);
431
    }
432
 
433
 
434
 
435
    public function deleteQuestionAction()
436
    {
437
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
438
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
439
 
440
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
441
        $currentUser        = $currentUserPlugin->getUser();
442
 
443
        $request    = $this->getRequest();
444
        $id         = $this->params()->fromRoute('id');
445
 
446
        $message_error = '';
447
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
448
        if(!$myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
449
            return new JsonModel([
450
                'success'   => false,
451
                'data'   => $message_error
452
            ]);
453
        }
454
 
455
 
456
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
457
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
6388 efrain 458
 
6521 efrain 459
 
460
        if ($request->isPost()) {
461
 
462
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
463
            $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
464
 
465
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
466
            $myCoachAnswerMapper->deleteAllByQuestionId($myCoachQuestion->id);
467
 
468
            $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
469
            if ($result) {
470
                $data = [
471
                    'success' => true,
472
                    'data' => 'LABEL_RECORD_DELETED'
473
                ];
474
            } else {
475
 
476
                $data = [
477
                    'success'   => false,
478
                    'data'      => $myCoachQuestionMapper->getError()
479
                ];
480
 
481
                return new JsonModel($data);
482
            }
483
        } else {
484
            $data = [
485
                'success' => false,
486
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
487
            ];
488
 
489
            return new JsonModel($data);
490
        }
491
 
492
        return new JsonModel($data);
493
    }
494
 
495
 
496
    public function editQuestionAction()
497
    {
498
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
499
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
500
 
501
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
502
        $currentUser        = $currentUserPlugin->getUser();
503
 
504
        $request    = $this->getRequest();
505
        $id    = $this->params()->fromRoute('id');
506
 
507
        $message_error = '';
508
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
509
        if(!$myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
510
            return new JsonModel([
511
                'success'   => false,
512
                'data'   => $message_error
513
            ]);
514
        }
515
 
516
 
517
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
518
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
519
 
520
 
521
        if ($request->isGet()) {
522
 
523
            $category_ids = [];
524
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
525
 
526
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
527
            $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
528
            foreach($records as $record)
529
            {
530
                $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
531
                if($myCoachCategory) {
532
                    array_push($category_ids,$myCoachCategory->uuid);
533
                }
534
            }
535
 
536
 
537
 
538
            $data = [
539
                'success' => true,
540
                'data' => [
541
                    'category_id' => $category_ids,
542
                    'title' => $myCoachQuestion->title,
543
                    'description' => $myCoachQuestion->description,
544
                ]
545
            ];
546
 
547
            return new JsonModel($data);
548
        } else if ($request->isPost()) {
549
 
550
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($myCoachQuestion->user_id, $currentNetwork->id);
551
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
552
 
553
            $form = new MyCoachQuestionForm($categories);
554
            $form->setData($dataPost);
555
 
556
            if ($form->isValid()) {
557
                $dataPost = (array) $form->getData();
558
 
559
 
560
 
561
                $myCoachQuestion->title = $dataPost['title'];
562
                $myCoachQuestion->description = $dataPost['description'];
563
 
564
 
565
                if ($myCoachQuestionMapper->update($myCoachQuestion)) {
566
 
567
 
568
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
569
 
570
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
571
                    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
572
 
573
                    $category_ids = $dataPost['category_id'];
574
                    foreach($category_ids as $category_id)
575
                    {
576
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
577
                        if($myCoachCategory) {
578
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
579
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
580
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
581
 
582
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
6388 efrain 583
                        }
584
                    }
6521 efrain 585
 
586
 
587
                    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
588
 
589
                    $data = [
590
                        'success'   => true,
591
                        'data'   => 'LABEL_RECORD_UPDATED'
592
                    ];
593
                } else {
594
                    $data = [
595
                        'success'   => false,
596
                        'data'      => $myCoachQuestionMapper->getError()
597
                    ];
6388 efrain 598
                }
6521 efrain 599
 
600
                return new JsonModel($data);
601
            } else {
602
                $messages = [];
603
                $form_messages = (array) $form->getMessages();
604
                foreach ($form_messages  as $fieldname => $field_messages) {
605
 
606
                    $messages[$fieldname] = array_values($field_messages);
607
                }
608
 
609
                return new JsonModel([
610
                    'success'   => false,
611
                    'data'   => $messages
612
                ]);
613
            }
614
        } else {
615
            $data = [
616
                'success' => false,
617
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
618
            ];
619
 
620
            return new JsonModel($data);
621
        }
622
 
623
        return new JsonModel($data);
624
    }
625
 
626
 
627
    public function viewQuestionAction()
628
    {
629
        $currentUserPlugin = $this->plugin('currentUserPlugin');
630
        $currentUser = $currentUserPlugin->getUser();
631
 
632
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
633
        $currentNetwork = $currentNetworkPlugin->getNetwork();
634
 
635
        $request    = $this->getRequest();
636
        $id    = $this->params()->fromRoute('id');
637
 
638
        $message_error = '';
639
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
640
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
641
            return new JsonModel([
642
                'success'   => false,
643
                'data'   => $message_error
644
            ]);
645
        }
646
 
647
 
648
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
649
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
650
 
651
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
652
        $commentMapper = CommentMapper::getInstance($this->adapter);
653
        $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
654
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
655
 
656
 
657
        $request = $this->getRequest();
658
        if ($request->isGet()) {
659
 
660
            $categories = [];
661
            $users = [];
662
 
663
 
664
 
665
            $bags_categories = [];
666
 
667
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
668
            $myCoachQuestionView = $myCoachQuestionViewMapper->fetchOneByQuestionIdAndUserId($myCoachQuestion->id, $currentUser->id);
669
            if(!$myCoachQuestionView) {
670
                $myCoachQuestionView = new MyCoachQuestionView();
671
                $myCoachQuestionView->question_id = $myCoachQuestion->id;
672
                $myCoachQuestionView->user_id = $currentUser->id;
673
 
674
                $myCoachQuestionViewMapper->insert($myCoachQuestionView);
675
 
676
            }
677
 
678
 
679
 
680
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
681
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
682
 
683
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
684
            foreach($questionCategories as $questionCategory)
685
            {
686
 
687
                if (!isset($categories[$questionCategory->category_id])) {
688
                    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
689
                    if ($category) {
690
                        $categories[$category->id] = $category->name;
691
                    }
692
                }
693
 
694
                array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
695
            }
696
 
697
            $users = [];
698
            $userMapper = UserMapper::getInstance($this->adapter);
699
            if(isset($users[$myCoachQuestion->user_id])) {
700
                $user = $users[$myCoachQuestion->user_id];
701
            } else {
702
                $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
703
                $users[ $myCoachQuestion->user_id ] = $user;
704
            }
705
 
706
 
707
 
708
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
709
            $added_on = $dt->format('d/m/Y H:i a');
710
 
711
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
712
            $updated_on = $dt->format('d/m/Y H:i a');
713
 
714
 
715
 
716
            $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
717
            if($allowDelete) {
718
                $link_delete = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
719
            } else {
720
                $link_delete = '';
721
            }
722
 
723
            $allowAnswerAdd = $myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
724
            if ($allowAnswerAdd) {
725
                $link_answers_add = $this->url()->fromRoute('my-coach/questions/answers/add', ['id' => $myCoachQuestion->uuid]);
726
            } else {
727
                $link_answers_add = '';
728
            }
6547 efrain 729
 
6521 efrain 730
 
6388 efrain 731
 
6521 efrain 732
            $myCoachLastAnswer = $myCoachAnswerMapper->fetchOneLastAnswerByQuestionId($myCoachQuestion->id);
733
 
734
            if( $myCoachLastAnswer) {
735
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachLastAnswer->added_on);
736
                $last_answer_on = $dt->format('d/m/Y H:i a');
737
 
738
 
739
 
740
            } else {
741
                $last_answer_on = '';
742
            }
743
 
6388 efrain 744
 
6521 efrain 745
            return new JsonModel([
746
                'success' => true,
747
                'data' => [
748
                    'uuid' => $myCoachQuestion->uuid,
749
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
750
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
751
                    'title' => $myCoachQuestion->title,
752
                    'description' => $myCoachQuestion->description,
753
                    'categories' => $bags_categories,
754
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id) , 10),
6547 efrain 755
                    'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id) , 10),
6521 efrain 756
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
757
                    'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
758
                    'added_on' => $added_on,
759
                    'updated_on' => $updated_on,
760
                    'last_answer_on' => $last_answer_on,
761
                    'link_answers' => $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]),
762
                    'link_answers_add' => $link_answers_add,
763
                    'link_delete' => $link_delete,
764
                ]
765
 
766
            ]);
767
 
768
 
769
        } else {
770
            return new JsonModel([
771
                'success' => false,
772
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
773
            ]);
774
        }
775
 
776
 
777
 
778
 
779
 
780
    }
781
 
782
    /**
783
     *
784
     * {@inheritDoc}
785
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
786
     */
787
    public function answersAction()
788
    {
789
        $currentUserPlugin = $this->plugin('currentUserPlugin');
790
        $currentUser = $currentUserPlugin->getUser();
791
 
792
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
793
        $currentNetwork = $currentNetworkPlugin->getNetwork();
794
 
795
        $request    = $this->getRequest();
796
        $id    = $this->params()->fromRoute('id');
797
 
798
        $message_error = '';
799
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
800
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
801
            return new JsonModel([
802
                'success'   => false,
803
                'data'   => $message_error
804
            ]);
805
        }
806
 
807
 
808
 
809
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
810
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
811
 
812
        $request = $this->getRequest();
813
        if ($request->isGet()) {
814
 
815
 
816
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
817
            $now = $myCoachAnswerMapper->getDatebaseNow();
818
 
819
            $records = $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
820
 
821
 
822
            $items = [];
823
 
824
            foreach($records as $record)
825
            {
826
                $items[] = $this->renderAnswer($record->id, $currentUser->id, $now);
827
            }
828
 
829
 
830
 
831
            return new JsonModel([
832
                'success' => true,
833
                'data' => [
834
                    'items' => $items
835
                ]
836
            ]);
837
 
838
 
839
        } else {
840
            return new JsonModel([
841
                'success' => false,
842
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
843
            ]);
844
        }
845
    }
846
 
6547 efrain 847
    public function deleteAnswerAction()
848
    {
849
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
850
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
851
 
852
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
853
        $currentUser        = $currentUserPlugin->getUser();
854
 
855
        $request    = $this->getRequest();
856
        $answer     = $this->params()->fromRoute('answer');
857
 
858
        $message_error = '';
859
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
860
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
861
            return new JsonModel([
862
                'success'   => false,
863
                'data'   => $message_error
864
            ]);
865
        }
866
 
867
 
868
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
869
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
870
 
871
        if ($request->isPost()) {
872
 
873
            if($myCoachAnswerMapper->delete($myCoachAnswer)) {
874
 
875
                $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
876
                $commentMapper = CommentMapper::getInstance($this->adapter);
877
 
878
 
879
                $this->logger->info('Se borro la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
880
 
881
                $data = [
882
                    'success'   => true,
883
                    'data'   => [
884
                        'total_comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
885
                        'total_answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
886
                        'total_reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10)
887
 
888
                    ]
889
                ];
890
            } else {
891
                $data = [
892
                    'success'   => false,
893
                    'data'      => $myCoachAnswerMapper->getError()
894
                ];
895
            }
896
        } else {
897
            $data = [
898
                'success' => false,
899
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
900
            ];
901
 
902
 
903
        }
904
        return new JsonModel($data);
905
 
906
 
907
    }
908
 
909
 
910
    public function editAnswerAction()
911
    {
912
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
913
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
914
 
915
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
916
        $currentUser        = $currentUserPlugin->getUser();
917
 
918
        $request    = $this->getRequest();
919
        $answer     = $this->params()->fromRoute('answer');
920
 
921
        $message_error = '';
922
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
923
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
924
            return new JsonModel([
925
                'success'   => false,
926
                'data'   => $message_error
927
            ]);
928
        }
929
 
930
 
931
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
932
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
933
 
934
        if ($request->isPost()) {
935
 
936
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
937
            $form = new MyCoachAnswerForm();
938
            $form->setData($dataPost);
939
 
940
            if ($form->isValid()) {
941
                $myCoachAnswer->text        = $dataPost['description'];
6388 efrain 942
 
6547 efrain 943
                if($myCoachAnswerMapper->update($myCoachAnswer)) {
944
 
945
                    $this->logger->info('Se edito la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
946
 
947
                    $data = [
948
                        'success'   => true,
949
                        'data'   => [
950
                            'description' => $myCoachAnswer->text
951
                        ]
952
                    ];
953
                } else {
954
                    $data = [
955
                        'success'   => false,
956
                        'data'      => $myCoachAnswerMapper->getError()
957
                    ];
958
                }
959
 
960
                return new JsonModel($data);
961
            } else {
962
                $messages = [];
963
                $form_messages = (array) $form->getMessages();
964
                foreach ($form_messages  as $fieldname => $field_messages)
965
                {
966
                    $messages[$fieldname] = array_values($field_messages);
967
                }
968
 
969
                return new JsonModel([
970
                    'success'   => false,
971
                    'data'   => $messages
972
                ]);
973
            }
974
        } else  if ($request->isGet()) {
975
            return new JsonModel([
976
                'success'   => true,
977
                'data'   => [
978
                    'description' => $myCoachAnswer->text
979
                ]
980
            ]);
981
        } else {
982
            $data = [
983
                'success' => false,
984
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
985
            ];
986
 
987
            return new JsonModel($data);
988
        }
989
 
990
 
991
    }
992
 
6521 efrain 993
 
994
 
6547 efrain 995
 
996
 
6521 efrain 997
    public function addAnswerAction()
998
    {
999
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1000
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1001
 
1002
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1003
        $currentUser        = $currentUserPlugin->getUser();
1004
 
1005
        $request    = $this->getRequest();
1006
        $id    = $this->params()->fromRoute('id');
1007
 
1008
        $message_error = '';
1009
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1010
        if(!$myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1011
            return new JsonModel([
1012
                'success'   => false,
1013
                'data'   => $message_error
1014
            ]);
1015
        }
1016
 
1017
 
1018
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1019
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1020
 
1021
        if ($request->isPost()) {
1022
 
1023
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1024
            $form = new MyCoachAnswerForm();
1025
            $form->setData($dataPost);
1026
 
1027
            if ($form->isValid()) {
6388 efrain 1028
 
6521 efrain 1029
                $myCoachAnswer = new MyCoachAnswer();
1030
                $myCoachAnswer->question_id = $myCoachQuestion->id;
1031
                $myCoachAnswer->text        = $dataPost['description'];
1032
                $myCoachAnswer->user_id     = $currentUser->id;
1033
 
1034
 
1035
                $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1036
                if($myCoachAnswerMapper->insert($myCoachAnswer)) {
1037
                    $now = $myCoachAnswerMapper->getDatebaseNow();
1038
 
1039
                    $this->logger->info('Se agrego la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1040
 
1041
                    $data = [
1042
                        'success'   => true,
1043
                        'data'   => [
1044
                            'answers' => $myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id),
1045
                            'item' => $this->renderAnswer($myCoachAnswer->id, $currentUser->id, $now)
1046
                        ]
1047
                    ];
1048
                } else {
1049
                    $data = [
1050
                        'success'   => false,
1051
                        'data'      => $myCoachQuestionMapper->getError()
1052
                    ];
1053
                }
1054
 
1055
                return new JsonModel($data);
1056
            } else {
1057
                $messages = [];
1058
                $form_messages = (array) $form->getMessages();
1059
                foreach ($form_messages  as $fieldname => $field_messages)
6388 efrain 1060
                {
6521 efrain 1061
                    $messages[$fieldname] = array_values($field_messages);
1062
                }
6388 efrain 1063
 
6521 efrain 1064
                return new JsonModel([
1065
                    'success'   => false,
1066
                    'data'   => $messages
1067
                ]);
1068
            }
1069
 
1070
        } else {
1071
            $data = [
1072
                'success' => false,
1073
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1074
            ];
1075
 
1076
            return new JsonModel($data);
1077
        }
1078
 
1079
 
1080
    }
1081
 
1082
    /*
1083
 
1084
    public function deleteAction()
1085
    {
1086
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1087
    $currentUser    = $currentUserPlugin->getUser();
1088
 
1089
 
1090
    $request    = $this->getRequest();
1091
    $id         = $this->params()->fromRoute('id');
1092
 
1093
 
1094
 
1095
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1096
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1097
    if (!$myCoachQuestion) {
1098
    return new JsonModel([
1099
    'success'   => false,
1100
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1101
    ]);
1102
    }
1103
 
1104
    $ok = false;
1105
    if(!$myCoachQuestion->answers) {
1106
 
1107
    if($currentUser->id == $myCoachQuestion->user_id) {
1108
    $ok = true;
1109
    } else {
1110
    $category_ids_with_edition = [];
1111
 
1112
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1113
    $records = $myCoachCategoryUser = $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1114
 
1115
    foreach($records as $record)
1116
    {
1117
    array_push($category_ids_with_edition, $record->user_id);
1118
    }
1119
 
1120
 
1121
 
1122
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1123
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1124
    foreach($records as $record)
1125
    {
1126
    if (in_array($record->category_id, $category_ids_with_edition) && $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_EDITOR || $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR) {
1127
    $ok = true;
1128
    break;
1129
    }
1130
    }
1131
    }
1132
    }
1133
 
1134
 
1135
    if (!$ok) {
1136
    return new JsonModel([
1137
    'success'   => false,
1138
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1139
    ]);
1140
    }
1141
 
1142
    if ($request->isPost()) {
1143
 
1144
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1145
    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
1146
 
1147
    $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
1148
    if ($result) {
1149
    $data = [
1150
    'success' => true,
1151
    'data' => 'LABEL_RECORD_DELETED'
1152
    ];
1153
    } else {
1154
 
1155
    $data = [
1156
    'success'   => false,
1157
    'data'      => $myCoachQuestionMapper->getError()
1158
    ];
1159
 
1160
    return new JsonModel($data);
1161
    }
1162
    } else {
1163
    $data = [
1164
    'success' => false,
1165
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1166
    ];
1167
 
1168
    return new JsonModel($data);
1169
    }
1170
 
1171
    return new JsonModel($data);
1172
    }
1173
 
1174
 
1175
    public function editAction()
1176
    {
1177
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1178
    $currentUser    = $currentUserPlugin->getUser();
1179
 
1180
    $request    = $this->getRequest();
1181
    $id    = $this->params()->fromRoute('id');
1182
 
1183
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1184
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1185
    if (!$myCoachQuestion) {
1186
    return new JsonModel([
1187
    'success'   => false,
1188
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1189
    ]);
1190
    }
1191
 
1192
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1193
 
1194
    $ok = false;
1195
    if(!$myCoachQuestion->answers) {
1196
 
1197
    if($currentUser->id == $myCoachQuestion->user_id) {
1198
    $ok = true;
1199
    } else {
1200
    $category_ids_with_edition = [];
1201
 
1202
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1203
    $records = $myCoachCategoryUser = $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1204
 
1205
    foreach($records as $record)
1206
    {
1207
    array_push($category_ids_with_edition, $record->user_id);
1208
    }
1209
 
1210
 
1211
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1212
    foreach($records as $record)
1213
    {
1214
    if (in_array($record->category_id, $category_ids_with_edition) && $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_EDITOR || $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR) {
1215
    $ok = true;
1216
    break;
1217
    }
1218
    }
1219
    }
1220
    }
1221
 
1222
 
1223
    if (!$ok) {
1224
    return new JsonModel([
1225
    'success'   => false,
1226
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1227
    ]);
1228
    }
1229
 
1230
    if (!$ok) {
1231
    return new JsonModel([
1232
    'success'   => false,
1233
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1234
    ]);
1235
    }
1236
 
1237
    if ($request->isGet()) {
1238
 
1239
 
1240
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1241
 
1242
 
1243
 
1244
    $category_ids = [];
1245
 
1246
 
1247
 
1248
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1249
    foreach($records as $record)
1250
    {
1251
    $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
1252
    if($myCoachCategory) {
1253
    array_push($category_ids,$myCoachCategory->uuid);
1254
    }
1255
    }
1256
 
1257
 
1258
 
1259
    $data = [
1260
    'success' => true,
1261
    'data' => [
1262
    'category_id' => $category_ids,
1263
    'title' => $myCoachQuestion->title,
1264
    'description' => $myCoachQuestion->description,
1265
    ]
1266
    ];
1267
 
1268
    return new JsonModel($data);
1269
    } else if ($request->isPost()) {
1270
    $category_with_edition_ids = [];
1271
    $category_ids = [];
1272
 
1273
 
1274
    $categories = [];
1275
 
1276
 
1277
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1278
    $records =  $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1279
    foreach ($records as $record) {
1280
    if ($record->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR || $record->role == MyCoachCategoryUser::ROLE_USER) {
1281
 
1282
    array_push($category_with_edition_ids, $record->category_id);
1283
    }
1284
 
1285
    array_push($category_ids, $record->category_id);
1286
    }
1287
 
1288
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1289
 
1290
    if ($category_ids) {
1291
    $records =  $myCoachCategoryMapper->fetchAllByIds($category_ids);
1292
    foreach ($records as $record) {
1293
    if ($record->status == MyCoachCategory::STATUS_ACTIVE) {
1294
 
1295
    $categories[$record->id] = [
1296
    'uuid' => $record->uuid,
1297
    'name' => $record->name,
1298
    ];
1299
    }
1300
    }
1301
    }
1302
 
1303
 
1304
 
1305
    $categories = array_values($categories);
1306
    usort($categories, function ($a, $b) {
1307
    return $a['name'] <=> $b['name'];
1308
    });
1309
 
1310
    $categories_question_available = [];
1311
    foreach($categories as $cartegory)
1312
    {
1313
    $categories_question_available[ $cartegory['uuid'] ] = $cartegory['name'];
1314
    }
1315
 
1316
    $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1317
    $form = new MyCoachQuestionForm($categories_question_available);
1318
    $form->setData($dataPost);
1319
 
1320
    if ($form->isValid()) {
1321
    $dataPost = (array) $form->getData();
1322
 
1323
 
1324
 
1325
    $myCoachQuestion->title = $dataPost['title'];
1326
    $myCoachQuestion->description = $dataPost['description'];
1327
 
1328
 
1329
    if ($myCoachQuestionMapper->update($myCoachQuestion)) {
1330
 
1331
 
1332
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1333
 
1334
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1335
    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
1336
 
1337
    $category_ids = $dataPost['category_id'];
1338
    foreach($category_ids as $category_id)
1339
    {
1340
    $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
1341
    if($myCoachCategory) {
1342
    $myCoachQuestionCategory = new MyCoachQuestionCategory();
1343
    $myCoachQuestionCategory->category_id = $myCoachCategory->id;
1344
    $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
1345
 
1346
    $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
1347
    }
1348
    }
1349
 
1350
 
1351
    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1352
 
1353
    $data = [
1354
    'success'   => true,
1355
    'data'   => 'LABEL_RECORD_UPDATED'
1356
    ];
1357
    } else {
1358
    $data = [
1359
    'success'   => false,
1360
    'data'      => $myCoachQuestionMapper->getError()
1361
    ];
1362
    }
1363
 
1364
    return new JsonModel($data);
1365
    } else {
1366
    $messages = [];
1367
    $form_messages = (array) $form->getMessages();
1368
    foreach ($form_messages  as $fieldname => $field_messages) {
1369
 
1370
    $messages[$fieldname] = array_values($field_messages);
1371
    }
1372
 
1373
    return new JsonModel([
1374
    'success'   => false,
1375
    'data'   => $messages
1376
    ]);
1377
    }
1378
    } else {
1379
    $data = [
1380
    'success' => false,
1381
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1382
    ];
1383
 
1384
    return new JsonModel($data);
1385
    }
1386
 
1387
    return new JsonModel($data);
1388
    }
1389
 
1390
 
1391
    public function viewAction()
1392
    {
1393
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1394
    $currentUser = $currentUserPlugin->getUser();
1395
 
1396
    $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1397
    $currentNetwork = $currentNetworkPlugin->getNetwork();
1398
 
1399
    $request    = $this->getRequest();
1400
    $id    = $this->params()->fromRoute('id');
1401
 
1402
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1403
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1404
    if (!$myCoachQuestion) {
1405
    return new JsonModel([
1406
    'success'   => false,
1407
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1408
    ]);
1409
    }
1410
 
1411
 
1412
    $request = $this->getRequest();
1413
    if ($request->isGet()) {
1414
 
1415
 
1416
 
1417
    $category_with_edition_ids = [];
1418
    $category_ids = [];
1419
    $categories = [];
1420
 
1421
 
1422
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1423
    $records =  $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1424
    foreach ($records as $record) {
1425
    if ($record->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR || $record->role == MyCoachCategoryUser::ROLE_USER) {
1426
 
1427
    array_push($category_with_edition_ids, $record->category_id);
1428
    }
1429
 
1430
    array_push($category_ids, $record->category_id);
1431
    }
1432
 
1433
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1434
 
1435
 
1436
 
1437
    if ($category_ids) {
1438
    $records =  $myCoachCategoryMapper->fetchAllByIds($category_ids);
1439
    foreach ($records as $record) {
1440
    $categories[$record->id] = [
1441
    'uuid' => $record->uuid,
1442
    'name' => $record->name,
1443
    ];
1444
    }
1445
    }
1446
 
1447
    $records =  $myCoachCategoryMapper->fetchAllPublicByNetworkId($currentNetwork->id);
1448
    foreach ($records as $record) {
1449
    if (!isset($categories[$record->id])) {
1450
 
1451
    $categories[$record->id] = [
1452
    'uuid' => $record->uuid,
1453
    'name' => $record->name,
1454
    ];
1455
    }
1456
    }
1457
 
1458
 
1459
 
1460
 
1461
 
1462
    $categories = array_values($categories);
1463
    usort($categories, function ($a, $b) {
1464
    return $a['name'] <=> $b['name'];
1465
    });
1466
 
1467
 
1468
    $access = $myCoachQuestion->user_id == $currentUser->id;
1469
 
1470
    $allowDelete = false;
1471
    $allowAnswer = false;
1472
 
1473
    $bags_categories = [];
1474
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1475
 
1476
    $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1477
    foreach($questionCategories as $questionCategory)
1478
    {
1479
 
1480
    if(in_array($questionCategory->category_id, $categories)) {
1481
    $access = true;
1482
    }
1483
 
1484
 
1485
    if(in_array($questionCategory->category_id, $category_with_edition_ids)) {
1486
 
1487
    $allowDelete = true;
1488
    $allowAnswer = true;
1489
    }
1490
 
1491
    if (!isset($categories[$questionCategory->category_id])) {
1492
    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
1493
    if ($category) {
1494
    $categories[$category->id] = [
1495
    'uuid' =>  $category->uuid,
1496
    'name' =>  $category->name,
1497
    ];
1498
    }
1499
    }
1500
 
1501
    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ]['name'] ]);
1502
    }
1503
 
1504
    $users = [];
1505
    $userMapper = UserMapper::getInstance($this->adapter);
1506
    if(isset($users[$myCoachQuestion->user_id])) {
1507
    $user = $users[$myCoachQuestion->user_id];
1508
    } else {
1509
    $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
1510
    $users[ $myCoachQuestion->user_id ] = $user;
1511
    }
1512
 
1513
 
1514
 
1515
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1516
    $added_on = $dt->format('d/m/Y H:i a');
1517
 
1518
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
1519
    $updated_on = $dt->format('d/m/Y H:i a');
1520
 
1521
 
1522
 
1523
    $data = [
1524
    'user_name' => trim($user->first_name . ' ' . $user->last_name),
1525
    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
1526
    'title' => $myCoachQuestion->title,
1527
    'description' => $myCoachQuestion->description,
1528
    'categories' => $bags_categories,
1529
    'views' => $myCoachQuestion->views,
1530
    'answers' => $myCoachQuestion->answers,
1531
    'reactions' => $myCoachQuestion->reactions,
1532
    'added_on' => $added_on,
1533
    'updated_on' => $updated_on,
1534
    'answers' => [],
1535
    ];
1536
 
1537
 
1538
 
1539
    if($allowDelete || $myCoachQuestion->zuser_id == $currentUser->id) {
1540
    $data['link_delete'] = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
1541
    } else {
1542
    $data['ink_delete'] = '';
1543
    }
1544
 
1545
 
1546
    if ($allowAnswer) {
1547
    $data['link_answers'] = $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]);
1548
    } else {
1549
    $data['link_answers'] = '';
1550
    }
1551
 
1552
    $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1553
    $records =  $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
1554
    foreach($records as $record)
1555
    {
1556
 
1557
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1558
    $added_on = $dt->format('d/m/Y H:i a');
1559
 
1560
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
1561
    $updated_on = $dt->format('d/m/Y H:i a');
1562
 
1563
    if(isset($users[$record->user_id])) {
1564
    $user = $users[$record->user_id];
1565
    } else {
1566
    $user = $userMapper->fetchOne( $record->user_id );
1567
    $users[ $record->user_id ] = $user;
1568
    }
1569
 
1570
    array_push($data['answers'], [
1571
    'user_name' => trim($user->first_name . ' ' . $user->last_name),
1572
    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
1573
    'text' => $record->text,
1574
    'added_on' => $added_on,
1575
    'updated_on' => $updated_on,
1576
    'link_delete' => $allowAnswer ? $this->url()->fromRoute('my-coach/questions/answer/delete', ['code' => $myCoachQuestion->uuid, 'answer' => $record->uuid]) : '',
1577
    ]);
1578
 
1579
 
1580
 
1581
    }
1582
 
1583
 
1584
 
1585
 
1586
    return new JsonModel([
1587
    'success' => true,
1588
    'data' => $data
1589
    ]);
1590
 
1591
 
1592
    } else {
1593
    return new JsonModel([
1594
    'success' => false,
1595
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1596
    ]);
1597
    }
1598
 
1599
 
1600
    return new JsonModel($data);
1601
    }
1602
    */
1603
 
1604
 
1605
    public function addCommentAction()
1606
    {
1607
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1608
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1609
 
1610
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1611
        $currentUser        = $currentUserPlugin->getUser();
1612
 
1613
        $request    = $this->getRequest();
1614
        $id    = $this->params()->fromRoute('id');
1615
 
1616
 
1617
        $request = $this->getRequest();
1618
        if ($request->isPost()) {
1619
 
1620
            $message_error = '';
1621
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1622
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1623
                return new JsonModel([
1624
                    'success'   => false,
1625
                    'data'   => $message_error
1626
                ]);
1627
            }
1628
 
1629
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1630
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1631
 
1632
            $dataPost = $request->getPost()->toArray();
1633
            $form = new CommentForm();
1634
            $form->setData($dataPost);
1635
 
1636
            if ($form->isValid()) {
1637
 
1638
 
1639
                $currentUserPlugin = $this->plugin('currentUserPlugin');
1640
                $currentUser = $currentUserPlugin->getUser();
1641
 
1642
                $dataPost = (array) $form->getData();
1643
 
1644
 
1645
 
1646
                $comment = new Comment();
1647
                $comment->network_id = $currentUser->network_id;
1648
                $comment->comment = $dataPost['comment'];
1649
                $comment->user_id = $currentUser->id;
1650
                $comment->my_coach_answer_id = $myCoachAnswer->id;
1651
                $comment->relational = Comment::RELATIONAL_MY_COACH;
1652
 
1653
                $commentMapper = CommentMapper::getInstance($this->adapter);
1654
                if ($commentMapper->insert($comment)) {
1655
                    $now = $commentMapper->getDatebaseNow();
1656
 
1657
                    $response = [
1658
                        'success'           => true,
1659
                        'data'              => [
1660
                            'item'  => $this->renderComment($comment->id, $now),
1661
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1662
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1663
                        ]
1664
                    ];
1665
 
1666
                    return new JsonModel($response);
1667
                } else {
1668
 
1669
                    $response = [
1670
                        'success'   => false,
1671
                        'data'   => $commentMapper->getError()
1672
                    ];
1673
 
1674
                    return new JsonModel($response);
1675
                }
1676
            } else {
1677
                $message = '';;
1678
                $form_messages = (array) $form->getMessages();
1679
                foreach ($form_messages  as $fieldname => $field_messages) {
1680
                    foreach ($field_messages as $key => $value) {
1681
                        $message = $value;
1682
                    }
1683
                }
1684
 
1685
                $response = [
1686
                    'success'   => false,
1687
                    'data'   => $message
1688
                ];
1689
 
1690
                return new JsonModel($response);
1691
            }
1692
        } else {
1693
            $response = [
1694
                'success' => false,
1695
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1696
            ];
1697
 
1698
            return new JsonModel($response);
1699
        }
1700
    }
1701
 
1702
 
1703
 
1704
    public function deleteCommentAction()
1705
    {
1706
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1707
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1708
 
1709
        $currentUserPlugin      = $this->plugin('currentUserPlugin');
1710
        $currentUser            = $currentUserPlugin->getUser();
1711
 
1712
        $request                = $this->getRequest();
1713
        $id                     = $this->params()->fromRoute('id');
1714
        $comment                = $this->params()->fromRoute('comment');
1715
 
1716
 
1717
        $request = $this->getRequest();
1718
        if ($request->isPost()) {
1719
 
1720
 
1721
 
1722
 
1723
            $message_error = '';
1724
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1725
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1726
                return new JsonModel([
1727
                    'success'   => false,
1728
                    'data'   => $message_error
1729
                ]);
1730
            }
1731
 
1732
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1733
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1734
 
1735
            $commentMapper = CommentMapper::getInstance($this->adapter);
1736
            $comment = $commentMapper->fetchOneByUuid($comment);
1737
 
1738
 
1739
            if ($comment && $comment->my_coach_answer_id == $myCoachAnswer->id && $comment->user_id == $currentUser->id) {
1740
 
1741
                $comment->status = Comment::STATUS_DELETED;
1742
 
1743
                if ($commentMapper->update($comment)) {
6388 efrain 1744
 
6521 efrain 1745
                    $response = [
1746
                        'success' => true,
1747
                        'data' => [
1748
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
1749
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1750
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1751
                        ]
1752
                    ];
1753
                } else {
1754
                    $response = [
1755
                        'success' => false,
1756
                        'data' => $commentMapper->getError()
1757
                    ];
1758
 
1759
                }
1760
            } else {
1761
                $response = [
1762
                    'success' => false,
1763
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1764
                ];
1765
            }
1766
        } else {
1767
            $response = [
1768
                'success' => false,
1769
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1770
            ];
1771
        }
1772
 
1773
        return new JsonModel($response);
1774
    }
1775
 
1776
    public function reactionsAction()
1777
    {
1778
        return new JsonModel([
1779
            'success' => false,
1780
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1781
        ]);
6388 efrain 1782
 
6521 efrain 1783
    }
1784
 
1785
 
1786
 
1787
    public function saveReactionAction()
1788
    {
1789
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1790
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1791
 
1792
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1793
        $currentUser        = $currentUserPlugin->getUser();
1794
 
1795
        $request    = $this->getRequest();
1796
 
1797
        $id = $this->params()->fromRoute('id');
1798
        $reaction  = $this->params()->fromPost('reaction');
1799
 
1800
        $request = $this->getRequest();
1801
        if ($request->isPost()) {
1802
 
1803
 
1804
            $message_error = '';
1805
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1806
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1807
                return new JsonModel([
1808
                    'success'   => false,
1809
                    'data'   => $message_error
6388 efrain 1810
                ]);
6521 efrain 1811
            }
1812
 
7108 efrain 1813
            $reactions = [
1814
                ContentReaction::REACTION_RECOMMENDED,
1815
                ContentReaction::REACTION_SUPPORT,
1816
                ContentReaction::REACTION_LOVE,
1817
                ContentReaction::REACTION_INTEREST,
1818
                ContentReaction::REACTION_FUN
1819
 
1820
            ];
1821
            if(!in_array($reaction, $reactions)) {
1822
                $response = [
1823
                    'success' => false,
1824
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1825
                ];
1826
                return new JsonModel($response);
1827
            }
1828
 
6521 efrain 1829
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1830
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1831
 
1832
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1833
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1834
 
1835
            if ($contentReaction) {
1836
                $contentReaction->reaction = $reaction;
1837
 
1838
                $result = $contentReactionMapper->update($contentReaction);
1839
            } else {
1840
                $contentReaction = new ContentReaction();
1841
                $contentReaction->user_id = $currentUser->id;
1842
                $contentReaction->my_coach_answer_id = $myCoachAnswer->id;
1843
                $contentReaction->relational = ContentReaction::RELATIONAL_MY_COACH;
1844
                $contentReaction->reaction = $reaction;
1845
 
1846
                $result = $contentReactionMapper->insert($contentReaction);
1847
            }
1848
 
1849
 
1850
 
1851
            if ($result) {
1852
 
1853
                $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1854
                $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1855
                $response = [
1856
                    'success' => true,
1857
                    'data' => [
1858
                        'reaction' => $reaction,
1859
                        'total_reactions_question' => $total_reactions_question,
1860
                        'total_reactions_answer' => $total_reactions_answer
1861
                    ]
1862
                ];
1863
            } else {
1864
                $response = [
1865
                    'success' => false,
1866
                    'data' => $contentReactionMapper->getError()
1867
                ];
1868
            }
1869
            return new JsonModel($response);
1870
        }
1871
 
1872
        $response = [
1873
            'success' => false,
1874
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1875
        ];
1876
        return new JsonModel($response);
1877
    }
1878
 
1879
    public function deleteReactionAction()
1880
    {
1881
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1882
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1883
 
1884
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1885
        $currentUser        = $currentUserPlugin->getUser();
1886
 
1887
        $request    = $this->getRequest();
1888
 
1889
        $id = $this->params()->fromRoute('id');
1890
 
1891
        $request = $this->getRequest();
1892
        if ($request->isPost()) {
1893
 
1894
            $message_error = '';
1895
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1896
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1897
                return new JsonModel([
1898
                    'success'   => false,
1899
                    'data'   => $message_error
1900
                ]);
1901
            }
1902
 
1903
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1904
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1905
 
1906
 
1907
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1908
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1909
 
1910
            if ($contentReaction) {
1911
                if ($contentReactionMapper->deleteByByMyCoachAnswerId($myCoachAnswer->id, $currentUser->id)) {
1912
                    $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1913
                    $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1914
 
1915
                    $response = [
1916
                        'success' => true,
1917
                        'data' => [
1918
                            'total_reactions_question' => $total_reactions_question,
1919
                            'total_reactions_answer' => $total_reactions_answer
1920
                        ]
1921
                    ];
1922
                } else {
1923
                    $response = [
1924
                        'success' => false,
1925
                        'data' => $contentReactionMapper->getError()
1926
                    ];
1927
                }
1928
            } else {
1929
                $total_reactions_question = $contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id);
1930
                $total_reactions_answer = $contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1931
 
1932
                $response = [
1933
                    'success' => true,
1934
                    'data' => [
1935
                        'total_reactions_question' => $total_reactions_question,
1936
                        'total_reactions_answer' => $total_reactions_answer
1937
                    ]
1938
                ];
1939
 
1940
 
1941
            }
1942
 
1943
 
1944
 
1945
            return new JsonModel($response);
1946
        }
1947
 
1948
        $response = [
1949
            'success' => false,
1950
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1951
        ];
1952
        return new JsonModel($response);
1953
    }
1954
 
1955
    public function commentsAction()
1956
    {
1957
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1958
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1959
 
1960
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1961
        $currentUser        = $currentUserPlugin->getUser();
1962
 
1963
 
1964
        $id = $this->params()->fromRoute('id');
1965
 
1966
        $request = $this->getRequest();
1967
        if ($request->isGet()) {
1968
            $message_error = '';
1969
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1970
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1971
                return new JsonModel([
1972
                    'success'   => false,
1973
                    'data'   => $message_error
1974
                ]);
1975
            }
1976
 
1977
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1978
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1979
            $now = $myCoachAnswerMapper->getDatebaseNow();
1980
 
1981
            $commentMapper = CommentMapper::getInstance($this->adapter);
1982
            $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1983
 
1984
            $comments = [];
1985
            foreach ($records as $record) {
1986
                $comment = $this->renderComment($record->id, $now);
1987
                array_push($comments, $comment);
1988
            }
1989
 
1990
            $response = [
1991
                'success' => true,
1992
                'data' => $comments
1993
            ];
1994
 
1995
            return new JsonModel($response);
5050 efrain 1996
        } else {
6521 efrain 1997
 
1998
 
1999
 
2000
            $response = [
5050 efrain 2001
                'success' => false,
2002
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
6521 efrain 2003
            ];
2004
 
2005
 
2006
            return new JsonModel($response);
5050 efrain 2007
        }
2008
    }
6521 efrain 2009
 
2010
 
2011
    private function renderAnswer($answer_id, $current_user_id, $now)
2012
    {
6547 efrain 2013
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
2014
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
2015
        $message_error = '';
6521 efrain 2016
 
2017
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
2018
        $myCoachAnswer =  $myCoachAnswerMapper->fetchOne($answer_id);
6547 efrain 2019
 
2020
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
2021
        $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachAnswer->question_id);
6521 efrain 2022
 
2023
 
6547 efrain 2024
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
2025
        $hasAccessEditOrDeleteAnswer = $myCoachAccessControl->hasAccessEditOrDeleteAnswer($current_user_id, $answer_id, $currentNetwork->id, $message_error);
2026
        if($hasAccessEditOrDeleteAnswer) {
2027
 
2028
 
2029
            $link_edit = $this->url()->fromRoute('my-coach/questions/answers/edit',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
2030
            $link_delete = $this->url()->fromRoute('my-coach/questions/answers/delete',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
2031
 
2032
        } else {
2033
            $link_edit = '';
2034
            $link_delete = '';
2035
        }
2036
 
6521 efrain 2037
        $userMapper = UserMapper::getInstance($this->adapter);
2038
        $user = $userMapper->fetchOne($myCoachAnswer->user_id);
2039
 
2040
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
2041
        $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $current_user_id);
6547 efrain 2042
        $total_reactions = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
6521 efrain 2043
 
2044
 
2045
 
2046
 
2047
        $comments = [];
2048
        $commentMapper = CommentMapper::getInstance($this->adapter);
2049
        $total_comments = $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
2050
        $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
2051
        foreach($records as $record)
2052
        {
2053
            $comments[] = $this->renderComment($record->id, $now);
2054
        }
2055
 
2056
 
2057
        $item = [
2058
            'unique' => uniqid(),
2059
            'uuid' => $myCoachAnswer->uuid,
6547 efrain 2060
            'question_uuid' => $myCoachQuestion->uuid,
6521 efrain 2061
            'user_image' => $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image]),
2062
            'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
2063
            'user_name' => $user->first_name . ' ' . $user->last_name,
2064
            'time_elapsed' => Functions::timeAgo($myCoachAnswer->added_on, $now),
2065
            'text' => $myCoachAnswer->text,
2066
            'reaction' => $contentReaction ? $contentReaction->reaction : '',
2067
            'total_comments' => $total_comments,
2068
            'total_reactions' => $total_reactions,
2069
            'comments' => $comments,
6547 efrain 2070
            'link_edit' => $link_edit,
2071
            'link_delete' => $link_delete,
6521 efrain 2072
            'link_reaction_delete' => $this->url()->fromRoute('my-coach/questions/reaction/delete', ['id' => $myCoachAnswer->uuid]),
2073
            'link_save_reaction' => $this->url()->fromRoute('my-coach/questions/reaction/save', ['id' => $myCoachAnswer->uuid]),
2074
            'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachAnswer->uuid]),
2075
        ];
6388 efrain 2076
 
6521 efrain 2077
        return $item;
2078
 
2079
 
2080
 
2081
    }
2082
 
2083
 
2084
 
2085
    private function renderComment($comment_id, $now)
2086
    {
2087
        $item = [];
2088
 
2089
        $commentMapper = CommentMapper::getInstance($this->adapter);
2090
        $record = $commentMapper->fetchOne($comment_id);
2091
 
2092
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
2093
        $myCoachAnswer = $myCoachAnswerMapper->fetchOne($record->my_coach_answer_id);
2094
 
2095
 
2096
        if ($record) {
2097
            $userMapper = UserMapper::getInstance($this->adapter);
2098
 
2099
            $user = $userMapper->fetchOne($record->user_id);
2100
 
2101
            $item['unique'] = uniqid();
2102
            $item['answer_uuid'] = $myCoachAnswer->uuid;
2103
            $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image]);
2104
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
2105
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
2106
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
2107
            $item['comment'] = $record->comment;
2108
            $item['link_delete'] = $this->url()->fromRoute('my-coach/questions/comments/delete', ['id' => $myCoachAnswer->uuid, 'comment' => $record->uuid]);
2109
        }
2110
        return $item;
2111
    }
2112
 
5050 efrain 2113
}