Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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