Proyectos de Subversion LeadersLinked - Services

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
 
8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Mapper\MyCoachCategoryMapper;
13
 
14
use LeadersLinked\Form\MyCoach\MyCoachQuestionForm;
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;
242 efrain 37
use LeadersLinked\Model\User;
283 www 38
use LeadersLinked\Library\Storage;
1 efrain 39
 
40
 
41
class MyCoachController extends AbstractActionController
42
{
43
    /**
44
     *
45
     * @var \Laminas\Db\Adapter\AdapterInterface
46
     */
47
    private $adapter;
48
 
49
    /**
50
     *
51
     * @var \LeadersLinked\Cache\CacheInterface
52
     */
53
    private $cache;
54
 
55
 
56
    /**
57
     *
58
     * @var \Laminas\Log\LoggerInterface
59
     */
60
    private $logger;
61
 
62
    /**
63
     *
64
     * @var array
65
     */
66
    private $config;
67
 
68
 
69
    /**
70
     *
71
     * @var \Laminas\Mvc\I18n\Translator
72
     */
73
    private $translator;
74
 
75
 
76
    /**
77
     *
78
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
79
     * @param \LeadersLinked\Cache\CacheInterface $cache
80
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
81
     * @param array $config
82
     * @param \Laminas\Mvc\I18n\Translator $translator
83
     */
84
    public function __construct($adapter, $cache, $logger, $config, $translator)
85
    {
86
        $this->adapter      = $adapter;
87
        $this->cache        = $cache;
88
        $this->logger       = $logger;
89
        $this->config       = $config;
90
        $this->translator   = $translator;
91
    }
92
 
93
    /**
94
     *
95
     * Generación del listado de perfiles
96
     * {@inheritDoc}
97
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
98
     */
99
    public function indexAction()
100
    {
101
        $currentUserPlugin = $this->plugin('currentUserPlugin');
102
        $currentUser = $currentUserPlugin->getUser();
103
 
104
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
105
        $currentNetwork = $currentNetworkPlugin->getNetwork();
106
 
107
        $request = $this->getRequest();
108
        if ($request->isGet()) {
109
 
110
                $myCoachAccesControl = MyCoachAccessControl::getInstance($this->adapter);
111
                $categories = $myCoachAccesControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
112
 
113
                return new JsonModel([
114
                    'success' => true,
115
                    'data' => [
116
                        'categories' => $categories,
117
                    ]
118
                ]);
119
 
120
 
121
 
122
        } else {
123
            return new JsonModel([
124
                'success' => false,
125
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
126
            ]);
127
        }
128
    }
129
 
130
    public function questionsAction()
131
    {
132
        $currentUserPlugin = $this->plugin('currentUserPlugin');
133
        $currentUser = $currentUserPlugin->getUser();
134
 
135
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
136
        $currentNetwork = $currentNetworkPlugin->getNetwork();
137
 
138
 
139
        $request = $this->getRequest();
140
        if ($request->isGet()) {
141
            $userMapper                     = UserMapper::getInstance($this->adapter);
142
            $myCoachCategoryMapper          = MyCoachCategoryMapper::getInstance($this->adapter);
143
            $myCoachQuestionCategoryMapper  = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
144
            $myCoachAccessControl           = MyCoachAccessControl::getInstance($this->adapter);
145
 
146
            $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
147
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
148
            $page   = intval($this->params()->fromQuery('start', 1), 10);
149
 
150
            $order_field        = 'added_on';
151
            $order_direction    = 'asc';
152
            $records_x_page     = 12;
153
 
154
 
155
            if ($category_filter_id) {
156
 
157
                $message_error = '';
158
                if(!$myCoachAccessControl->hasAccessForCategory($currentUser->id, $category_filter_id, $currentNetwork->id, $message_error)) {
159
 
160
                    return new JsonModel([
161
                        'success' => true,
162
                        'data' => $message_error,
163
                    ]);
164
 
165
                }
166
 
167
                $categoryFilter = $myCoachCategoryMapper->fetchOneByUuid($category_filter_id);
168
                $category_ids = [$categoryFilter->id];
169
            } else {
170
                $category_ids = $myCoachAccessControl->getCategoryIdsWithAccess($currentUser->id, $currentNetwork->id);
171
            }
172
 
173
            $category_ids_with_edition = $myCoachAccessControl->getCategoryIdsWithEdition($currentUser->id);
174
 
175
            $queryMapper = QueryMapper::getInstance($this->adapter);
176
 
177
            $prototype = new MyCoachQuestion();
178
            $selectIn = $queryMapper->getSql()->select(MyCoachQuestionCategoryMapper::_TABLE);
179
            $selectIn->columns(['question_id']);
180
            $selectIn->where->in('category_id', $category_ids);
181
 
182
 
183
 
184
            $select = $queryMapper->getSql()->select(MyCoachQuestionMapper::_TABLE);
185
            $select->where->in('id', $selectIn);
186
 
187
            if($search) {
188
                $select->where->nest()
189
                -> like('title', '%' . $search . '%')->or->like('description', '%' . $search . '%')
190
                ->unnest();
191
            }
192
            $select->order($order_field . ' ' . $order_direction);
193
 
194
            //echo $select->getSqlString($this->adapter->platform);
195
            //exit;
196
 
197
 
198
            $users = [];
199
            $categories = [];
200
            //echo $select->getSqlString($this->adapter->platform); exit;
201
 
202
            $hydrator   = new ObjectPropertyHydrator();
203
            $resultset  = new HydratingResultSet($hydrator, $prototype);
204
 
205
            $adapter = new DbSelect($select, $queryMapper->getSql(), $resultset);
206
            $paginator = new Paginator($adapter);
207
            $paginator->setItemCountPerPage($records_x_page);
208
            $paginator->setCurrentPageNumber($page);
209
 
210
 
211
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
212
            $commentMapper = CommentMapper::getInstance($this->adapter);
213
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
214
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
215
 
283 www 216
            $storage = Storage::getInstance($this->config);
217
            $path = $storage->getPathMyCoach();
218
 
219
 
1 efrain 220
            $items = [];
221
            $records = $paginator->getCurrentItems();
222
            foreach ($records as $record)
223
            {
224
                $bags_categories = [];
225
 
226
                $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($record->id);
227
 
228
 
229
 
230
 
231
                $allowEdit   = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
232
                $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
233
                foreach($questionCategories as $questionCategory)
234
                {
235
                    if(in_array($questionCategory->category_id, $category_ids_with_edition)) {
236
 
237
                        $allowDelete = true;
238
                    }
239
 
240
                    if (!isset($categories[$questionCategory->category_id])) {
241
                        $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
242
                        if ($category) {
243
                            $categories[$category->id] = $category->name;
244
 
245
                        }
246
                    }
247
 
248
                    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
249
                }
250
 
251
                if(isset($users[$record->user_id])) {
252
                    $user = $users[ $record->user_id ];
253
                } else {
254
                    $user = $userMapper->fetchOne($record->user_id);
255
                    $users[ $record->user_id ] = $user;
256
                }
257
 
258
 
259
                $description = strip_tags($record->description);
260
                if (strlen($description) > 250) {
261
                    $description = substr($description, 0, 250) . '...';
262
                }
263
 
264
 
265
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
266
                $added_on = $dt->format('d/m/Y H:i a');
267
 
268
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
269
                $updated_on = $dt->format('d/m/Y H:i a');
270
 
271
                $item = [
272
                    'uuid' => $record->uuid,
273
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
283 www 274
                    'user_image' => $storage->getUserImage($user),
1 efrain 275
                    'title' => $record->title,
276
                    'description' => $description,
277
                    'categories' => $bags_categories,
278
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($record->id), 10),
279
                    'answers' =>  intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($record->id), 10),
280
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($record->id), 10),
281
                    'comments' =>  intval($commentMapper->fetchCountByMyCoachQuestionId($record->id), 10),
282
                    'added_on' => $added_on,
283
                    'updated_on' => $updated_on,
242 efrain 284
                    'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $record->uuid],['force_canonical' => true]),
1 efrain 285
                    'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $record->uuid]),
242 efrain 286
                    'link_edit' => $allowEdit ?  $this->url()->fromRoute('my-coach/questions/edit', ['id' => $record->uuid],['force_canonical' => true]) : '',
287
                    'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' =>  $record->uuid],['force_canonical' => true]) : '',
288
                    'link_reactions' => $this->url()->fromRoute('my-coach/questions/reactions', ['id' =>  $record->uuid],['force_canonical' => true])
1 efrain 289
                ];
290
 
291
                array_push($items, $item);
292
            }
293
 
294
            return new JsonModel([
295
                'success' => true,
296
                'data' => [
297
                    'items' => $items,
298
                    'total' => $paginator->getTotalItemCount(),
299
                    'page' => $paginator->getCurrentPageNumber(),
143 efrain 300
                    'total_pages' => $paginator->getPages()->pageCount,
1 efrain 301
                ]
302
            ]);
303
 
304
 
305
        } else {
306
            return new JsonModel([
307
                'success' => false,
308
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
309
            ]);
310
        }
311
    }
312
 
313
    public function addQuestionAction()
314
    {
315
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
316
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
317
 
318
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
319
        $currentUser        = $currentUserPlugin->getUser();
320
 
321
        $request            = $this->getRequest();
322
 
323
        if ($request->isPost()) {
324
 
325
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
326
 
327
 
328
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
329
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
330
 
331
            $form = new MyCoachQuestionForm($categories);
332
            $form->setData($dataPost);
333
 
334
            if ($form->isValid()) {
335
                $dataPost = (array) $form->getData();
336
 
337
                $myCoachQuestion = new MyCoachQuestion();
338
                $myCoachQuestion->network_id    = $currentNetwork ->id;
339
                $myCoachQuestion->user_id       = $currentUser->id;
340
                $myCoachQuestion->title         = $dataPost['title'];
341
                $myCoachQuestion->description   = $dataPost['description'];
342
 
343
 
344
                $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
345
                if ($myCoachQuestionMapper->insert($myCoachQuestion)) {
346
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
347
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
348
 
349
                    $category_ids = $dataPost['category_id'];
137 efrain 350
                    if(is_array($category_ids)) {
351
 
352
 
353
                        foreach($category_ids as $category_id)
354
                        {
355
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
356
                            if($myCoachCategory) {
357
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
358
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
359
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
360
 
361
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
362
                            }
363
                        }
364
                    } else {
365
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 366
                        if($myCoachCategory) {
367
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
368
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
369
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
370
 
371
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
372
                        }
373
                    }
374
 
375
 
376
                    $this->logger->info('Se agrego la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
377
 
378
                    $data = [
379
                        'success'   => true,
380
                        'data'   => 'LABEL_RECORD_ADDED'
381
                    ];
382
                } else {
383
                    $data = [
384
                        'success'   => false,
385
                        'data'      => $myCoachQuestionMapper->getError()
386
                    ];
387
                }
388
 
389
                return new JsonModel($data);
390
            } else {
391
                $messages = [];
392
                $form_messages = (array) $form->getMessages();
393
                foreach ($form_messages  as $fieldname => $field_messages)
394
                {
395
                    $messages[$fieldname] = array_values($field_messages);
396
                }
397
 
398
                return new JsonModel([
399
                    'success'   => false,
400
                    'data'   => $messages
401
                ]);
402
            }
403
        } else {
404
            $data = [
405
                'success' => false,
406
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
407
            ];
408
 
409
            return new JsonModel($data);
410
        }
411
 
412
        return new JsonModel($data);
413
    }
414
 
415
 
416
 
417
    public function deleteQuestionAction()
418
    {
419
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
420
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
421
 
422
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
423
        $currentUser        = $currentUserPlugin->getUser();
424
 
425
        $request    = $this->getRequest();
426
        $id         = $this->params()->fromRoute('id');
427
 
428
        $message_error = '';
429
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
430
        if(!$myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
431
            return new JsonModel([
432
                'success'   => false,
433
                'data'   => $message_error
434
            ]);
435
        }
436
 
437
 
438
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
439
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
440
 
441
 
442
        if ($request->isPost()) {
443
 
444
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
445
            $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
446
 
447
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
448
            $myCoachAnswerMapper->deleteAllByQuestionId($myCoachQuestion->id);
449
 
450
            $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
451
            if ($result) {
452
                $data = [
453
                    'success' => true,
454
                    'data' => 'LABEL_RECORD_DELETED'
455
                ];
456
            } else {
457
 
458
                $data = [
459
                    'success'   => false,
460
                    'data'      => $myCoachQuestionMapper->getError()
461
                ];
462
 
463
                return new JsonModel($data);
464
            }
465
        } else {
466
            $data = [
467
                'success' => false,
468
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
469
            ];
470
 
471
            return new JsonModel($data);
472
        }
473
 
474
        return new JsonModel($data);
475
    }
476
 
477
 
478
    public function editQuestionAction()
479
    {
480
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
481
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
482
 
483
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
484
        $currentUser        = $currentUserPlugin->getUser();
485
 
486
        $request    = $this->getRequest();
487
        $id    = $this->params()->fromRoute('id');
488
 
489
        $message_error = '';
490
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
491
        if(!$myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
492
            return new JsonModel([
493
                'success'   => false,
494
                'data'   => $message_error
495
            ]);
496
        }
497
 
498
 
499
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
500
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
501
 
502
 
503
        if ($request->isGet()) {
504
 
505
            $category_ids = [];
506
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
507
 
508
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
509
            $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
510
            foreach($records as $record)
511
            {
512
                $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
513
                if($myCoachCategory) {
514
                    array_push($category_ids,$myCoachCategory->uuid);
515
                }
516
            }
517
 
518
 
519
 
520
            $data = [
521
                'success' => true,
522
                'data' => [
523
                    'category_id' => $category_ids,
524
                    'title' => $myCoachQuestion->title,
525
                    'description' => $myCoachQuestion->description,
526
                ]
527
            ];
528
 
529
            return new JsonModel($data);
530
        } else if ($request->isPost()) {
531
 
532
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($myCoachQuestion->user_id, $currentNetwork->id);
533
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
534
 
535
            $form = new MyCoachQuestionForm($categories);
536
            $form->setData($dataPost);
537
 
538
            if ($form->isValid()) {
539
                $dataPost = (array) $form->getData();
540
 
541
 
542
 
543
                $myCoachQuestion->title = $dataPost['title'];
544
                $myCoachQuestion->description = $dataPost['description'];
545
 
546
 
547
                if ($myCoachQuestionMapper->update($myCoachQuestion)) {
548
 
549
 
550
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
551
 
552
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
553
                    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
554
 
555
                    $category_ids = $dataPost['category_id'];
137 efrain 556
                    $category_ids = $dataPost['category_id'];
557
                    if(is_array($category_ids)) {
558
 
559
 
560
                        foreach($category_ids as $category_id)
561
                        {
562
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
563
                            if($myCoachCategory) {
564
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
565
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
566
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
567
 
568
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
569
                            }
570
                        }
571
                    } else {
572
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 573
                        if($myCoachCategory) {
574
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
575
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
576
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
577
 
578
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
579
                        }
580
                    }
581
 
582
 
137 efrain 583
 
1 efrain 584
                    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
585
 
586
                    $data = [
587
                        'success'   => true,
588
                        'data'   => 'LABEL_RECORD_UPDATED'
589
                    ];
590
                } else {
591
                    $data = [
592
                        'success'   => false,
593
                        'data'      => $myCoachQuestionMapper->getError()
594
                    ];
595
                }
596
 
597
                return new JsonModel($data);
598
            } else {
599
                $messages = [];
600
                $form_messages = (array) $form->getMessages();
601
                foreach ($form_messages  as $fieldname => $field_messages) {
602
 
603
                    $messages[$fieldname] = array_values($field_messages);
604
                }
605
 
606
                return new JsonModel([
607
                    'success'   => false,
608
                    'data'   => $messages
609
                ]);
610
            }
611
        } else {
612
            $data = [
613
                'success' => false,
614
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
615
            ];
616
 
617
            return new JsonModel($data);
618
        }
619
 
620
        return new JsonModel($data);
621
    }
622
 
623
 
624
    public function viewQuestionAction()
625
    {
626
        $currentUserPlugin = $this->plugin('currentUserPlugin');
627
        $currentUser = $currentUserPlugin->getUser();
628
 
629
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
630
        $currentNetwork = $currentNetworkPlugin->getNetwork();
631
 
632
        $request    = $this->getRequest();
633
        $id    = $this->params()->fromRoute('id');
634
 
635
        $message_error = '';
636
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
637
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
638
            return new JsonModel([
639
                'success'   => false,
640
                'data'   => $message_error
641
            ]);
642
        }
643
 
644
 
645
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
646
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
647
 
648
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
649
        $commentMapper = CommentMapper::getInstance($this->adapter);
650
        $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
651
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
652
 
653
 
654
        $request = $this->getRequest();
655
        if ($request->isGet()) {
656
 
657
            $categories = [];
658
            $users = [];
659
 
660
 
661
 
662
            $bags_categories = [];
663
 
664
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
665
            $myCoachQuestionView = $myCoachQuestionViewMapper->fetchOneByQuestionIdAndUserId($myCoachQuestion->id, $currentUser->id);
666
            if(!$myCoachQuestionView) {
667
                $myCoachQuestionView = new MyCoachQuestionView();
668
                $myCoachQuestionView->question_id = $myCoachQuestion->id;
669
                $myCoachQuestionView->user_id = $currentUser->id;
670
 
671
                $myCoachQuestionViewMapper->insert($myCoachQuestionView);
672
 
673
            }
674
 
675
 
676
 
677
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
678
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
679
 
680
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
681
            foreach($questionCategories as $questionCategory)
682
            {
683
 
684
                if (!isset($categories[$questionCategory->category_id])) {
685
                    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
686
                    if ($category) {
687
                        $categories[$category->id] = $category->name;
688
                    }
689
                }
690
 
691
                array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
692
            }
693
 
694
            $users = [];
695
            $userMapper = UserMapper::getInstance($this->adapter);
696
            if(isset($users[$myCoachQuestion->user_id])) {
697
                $user = $users[$myCoachQuestion->user_id];
698
            } else {
699
                $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
700
                $users[ $myCoachQuestion->user_id ] = $user;
701
            }
702
 
703
 
704
 
705
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
706
            $added_on = $dt->format('d/m/Y H:i a');
707
 
708
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
709
            $updated_on = $dt->format('d/m/Y H:i a');
710
 
711
 
712
 
713
            $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
714
            if($allowDelete) {
715
                $link_delete = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
716
            } else {
717
                $link_delete = '';
718
            }
719
 
720
            $allowAnswerAdd = $myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
721
            if ($allowAnswerAdd) {
722
                $link_answers_add = $this->url()->fromRoute('my-coach/questions/answers/add', ['id' => $myCoachQuestion->uuid]);
723
            } else {
724
                $link_answers_add = '';
725
            }
726
 
727
 
728
 
729
            $myCoachLastAnswer = $myCoachAnswerMapper->fetchOneLastAnswerByQuestionId($myCoachQuestion->id);
730
 
731
            if( $myCoachLastAnswer) {
732
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachLastAnswer->added_on);
733
                $last_answer_on = $dt->format('d/m/Y H:i a');
734
 
735
 
736
 
737
            } else {
738
                $last_answer_on = '';
739
            }
740
 
283 www 741
            $storage = Storage::getInstance($this->config);
1 efrain 742
 
743
            return new JsonModel([
744
                'success' => true,
745
                'data' => [
746
                    'uuid' => $myCoachQuestion->uuid,
747
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
283 www 748
                    'user_image' => $storage->getUserImage($user),
1 efrain 749
                    'title' => $myCoachQuestion->title,
750
                    'description' => $myCoachQuestion->description,
751
                    'categories' => $bags_categories,
752
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id) , 10),
753
                    'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id) , 10),
754
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
755
                    'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
756
                    'added_on' => $added_on,
757
                    'updated_on' => $updated_on,
758
                    'last_answer_on' => $last_answer_on,
759
                    'link_answers' => $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]),
760
                    'link_answers_add' => $link_answers_add,
761
                    'link_delete' => $link_delete,
762
                ]
763
 
764
            ]);
765
 
766
 
767
        } else {
768
            return new JsonModel([
769
                'success' => false,
770
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
771
            ]);
772
        }
773
 
774
 
775
 
776
 
777
 
778
    }
779
 
780
    /**
781
     *
782
     * {@inheritDoc}
783
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
784
     */
785
    public function answersAction()
786
    {
787
        $currentUserPlugin = $this->plugin('currentUserPlugin');
788
        $currentUser = $currentUserPlugin->getUser();
789
 
790
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
791
        $currentNetwork = $currentNetworkPlugin->getNetwork();
792
 
793
        $request    = $this->getRequest();
794
        $id    = $this->params()->fromRoute('id');
795
 
796
        $message_error = '';
797
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
798
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
799
            return new JsonModel([
800
                'success'   => false,
801
                'data'   => $message_error
802
            ]);
803
        }
804
 
805
 
806
 
807
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
808
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
809
 
810
        $request = $this->getRequest();
811
        if ($request->isGet()) {
812
 
813
 
814
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
815
            $now = $myCoachAnswerMapper->getDatebaseNow();
816
 
817
            $records = $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
818
 
819
 
820
            $items = [];
821
 
822
            foreach($records as $record)
823
            {
824
                $items[] = $this->renderAnswer($record->id, $currentUser->id, $now);
825
            }
826
 
827
 
828
 
829
            return new JsonModel([
830
                'success' => true,
831
                'data' => [
832
                    'items' => $items
833
                ]
834
            ]);
835
 
836
 
837
        } else {
838
            return new JsonModel([
839
                'success' => false,
840
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
841
            ]);
842
        }
843
    }
844
 
845
    public function deleteAnswerAction()
846
    {
847
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
848
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
849
 
850
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
851
        $currentUser        = $currentUserPlugin->getUser();
852
 
853
        $request    = $this->getRequest();
854
        $answer     = $this->params()->fromRoute('answer');
855
 
856
        $message_error = '';
857
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
858
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
859
            return new JsonModel([
860
                'success'   => false,
861
                'data'   => $message_error
862
            ]);
863
        }
864
 
865
 
866
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
867
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
868
 
869
        if ($request->isPost()) {
870
 
871
            if($myCoachAnswerMapper->delete($myCoachAnswer)) {
872
 
873
                $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
874
                $commentMapper = CommentMapper::getInstance($this->adapter);
875
 
876
 
877
                $this->logger->info('Se borro la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
878
 
879
                $data = [
880
                    'success'   => true,
881
                    'data'   => [
882
                        'total_comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
883
                        'total_answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
884
                        'total_reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10)
885
 
886
                    ]
887
                ];
888
            } else {
889
                $data = [
890
                    'success'   => false,
891
                    'data'      => $myCoachAnswerMapper->getError()
892
                ];
893
            }
894
        } else {
895
            $data = [
896
                'success' => false,
897
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
898
            ];
899
 
900
 
901
        }
902
        return new JsonModel($data);
903
 
904
 
905
    }
906
 
907
 
908
    public function editAnswerAction()
909
    {
910
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
911
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
912
 
913
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
914
        $currentUser        = $currentUserPlugin->getUser();
915
 
916
        $request    = $this->getRequest();
917
        $answer     = $this->params()->fromRoute('answer');
918
 
919
        $message_error = '';
920
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
921
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
922
            return new JsonModel([
923
                'success'   => false,
924
                'data'   => $message_error
925
            ]);
926
        }
927
 
928
 
929
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
930
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
931
 
932
        if ($request->isPost()) {
933
 
934
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
935
            $form = new MyCoachAnswerForm();
936
            $form->setData($dataPost);
937
 
938
            if ($form->isValid()) {
939
                $myCoachAnswer->text        = $dataPost['description'];
940
 
941
                if($myCoachAnswerMapper->update($myCoachAnswer)) {
942
 
943
                    $this->logger->info('Se edito la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
944
 
945
                    $data = [
946
                        'success'   => true,
947
                        'data'   => [
948
                            'description' => $myCoachAnswer->text
949
                        ]
950
                    ];
951
                } else {
952
                    $data = [
953
                        'success'   => false,
954
                        'data'      => $myCoachAnswerMapper->getError()
955
                    ];
956
                }
957
 
958
                return new JsonModel($data);
959
            } else {
960
                $messages = [];
961
                $form_messages = (array) $form->getMessages();
962
                foreach ($form_messages  as $fieldname => $field_messages)
963
                {
964
                    $messages[$fieldname] = array_values($field_messages);
965
                }
966
 
967
                return new JsonModel([
968
                    'success'   => false,
969
                    'data'   => $messages
970
                ]);
971
            }
972
        } else  if ($request->isGet()) {
973
            return new JsonModel([
974
                'success'   => true,
975
                'data'   => [
976
                    'description' => $myCoachAnswer->text
977
                ]
978
            ]);
979
        } else {
980
            $data = [
981
                'success' => false,
982
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
983
            ];
984
 
985
            return new JsonModel($data);
986
        }
987
 
988
 
989
    }
990
 
991
 
992
 
993
 
994
 
995
    public function addAnswerAction()
996
    {
997
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
998
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
999
 
1000
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1001
        $currentUser        = $currentUserPlugin->getUser();
1002
 
1003
        $request    = $this->getRequest();
1004
        $id    = $this->params()->fromRoute('id');
1005
 
1006
        $message_error = '';
1007
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1008
        if(!$myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1009
            return new JsonModel([
1010
                'success'   => false,
1011
                'data'   => $message_error
1012
            ]);
1013
        }
1014
 
1015
 
1016
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1017
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1018
 
1019
        if ($request->isPost()) {
1020
 
1021
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1022
            $form = new MyCoachAnswerForm();
1023
            $form->setData($dataPost);
1024
 
1025
            if ($form->isValid()) {
1026
 
1027
                $myCoachAnswer = new MyCoachAnswer();
1028
                $myCoachAnswer->question_id = $myCoachQuestion->id;
1029
                $myCoachAnswer->text        = $dataPost['description'];
1030
                $myCoachAnswer->user_id     = $currentUser->id;
1031
 
1032
 
1033
                $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1034
                if($myCoachAnswerMapper->insert($myCoachAnswer)) {
1035
                    $now = $myCoachAnswerMapper->getDatebaseNow();
1036
 
1037
                    $this->logger->info('Se agrego la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1038
 
1039
                    $data = [
1040
                        'success'   => true,
1041
                        'data'   => [
1042
                            'answers' => $myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id),
1043
                            'item' => $this->renderAnswer($myCoachAnswer->id, $currentUser->id, $now)
1044
                        ]
1045
                    ];
1046
                } else {
1047
                    $data = [
1048
                        'success'   => false,
1049
                        'data'      => $myCoachQuestionMapper->getError()
1050
                    ];
1051
                }
1052
 
1053
                return new JsonModel($data);
1054
            } else {
1055
                $messages = [];
1056
                $form_messages = (array) $form->getMessages();
1057
                foreach ($form_messages  as $fieldname => $field_messages)
1058
                {
1059
                    $messages[$fieldname] = array_values($field_messages);
1060
                }
1061
 
1062
                return new JsonModel([
1063
                    'success'   => false,
1064
                    'data'   => $messages
1065
                ]);
1066
            }
1067
 
1068
        } else {
1069
            $data = [
1070
                'success' => false,
1071
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1072
            ];
1073
 
1074
            return new JsonModel($data);
1075
        }
1076
 
1077
 
1078
    }
60 efrain 1079
 
1 efrain 1080
 
1081
 
1082
    public function addCommentAction()
1083
    {
1084
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1085
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1086
 
1087
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1088
        $currentUser        = $currentUserPlugin->getUser();
1089
 
1090
        $request    = $this->getRequest();
1091
        $id    = $this->params()->fromRoute('id');
1092
 
1093
 
1094
        $request = $this->getRequest();
1095
        if ($request->isPost()) {
1096
 
1097
            $message_error = '';
1098
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1099
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1100
                return new JsonModel([
1101
                    'success'   => false,
1102
                    'data'   => $message_error
1103
                ]);
1104
            }
1105
 
1106
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1107
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1108
 
1109
            $dataPost = $request->getPost()->toArray();
1110
            $form = new CommentForm();
1111
            $form->setData($dataPost);
1112
 
1113
            if ($form->isValid()) {
1114
 
1115
 
1116
                $currentUserPlugin = $this->plugin('currentUserPlugin');
1117
                $currentUser = $currentUserPlugin->getUser();
1118
 
1119
                $dataPost = (array) $form->getData();
1120
 
1121
 
1122
 
1123
                $comment = new Comment();
1124
                $comment->network_id = $currentUser->network_id;
1125
                $comment->comment = $dataPost['comment'];
1126
                $comment->user_id = $currentUser->id;
1127
                $comment->my_coach_answer_id = $myCoachAnswer->id;
1128
                $comment->relational = Comment::RELATIONAL_MY_COACH;
1129
 
1130
                $commentMapper = CommentMapper::getInstance($this->adapter);
1131
                if ($commentMapper->insert($comment)) {
1132
                    $now = $commentMapper->getDatebaseNow();
1133
 
1134
                    $response = [
1135
                        'success'           => true,
1136
                        'data'              => [
1137
                            'item'  => $this->renderComment($comment->id, $now),
1138
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1139
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1140
                        ]
1141
                    ];
1142
 
1143
                    return new JsonModel($response);
1144
                } else {
1145
 
1146
                    $response = [
1147
                        'success'   => false,
1148
                        'data'   => $commentMapper->getError()
1149
                    ];
1150
 
1151
                    return new JsonModel($response);
1152
                }
1153
            } else {
1154
                $message = '';;
1155
                $form_messages = (array) $form->getMessages();
1156
                foreach ($form_messages  as $fieldname => $field_messages) {
1157
                    foreach ($field_messages as $key => $value) {
1158
                        $message = $value;
1159
                    }
1160
                }
1161
 
1162
                $response = [
1163
                    'success'   => false,
1164
                    'data'   => $message
1165
                ];
1166
 
1167
                return new JsonModel($response);
1168
            }
1169
        } else {
1170
            $response = [
1171
                'success' => false,
1172
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1173
            ];
1174
 
1175
            return new JsonModel($response);
1176
        }
1177
    }
1178
 
1179
 
1180
 
1181
    public function deleteCommentAction()
1182
    {
1183
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1184
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1185
 
1186
        $currentUserPlugin      = $this->plugin('currentUserPlugin');
1187
        $currentUser            = $currentUserPlugin->getUser();
1188
 
1189
        $request                = $this->getRequest();
1190
        $id                     = $this->params()->fromRoute('id');
1191
        $comment                = $this->params()->fromRoute('comment');
1192
 
1193
 
1194
        $request = $this->getRequest();
1195
        if ($request->isPost()) {
1196
 
1197
 
1198
 
1199
 
1200
            $message_error = '';
1201
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1202
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1203
                return new JsonModel([
1204
                    'success'   => false,
1205
                    'data'   => $message_error
1206
                ]);
1207
            }
1208
 
1209
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1210
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1211
 
1212
            $commentMapper = CommentMapper::getInstance($this->adapter);
1213
            $comment = $commentMapper->fetchOneByUuid($comment);
1214
 
1215
 
1216
            if ($comment && $comment->my_coach_answer_id == $myCoachAnswer->id && $comment->user_id == $currentUser->id) {
1217
 
1218
                $comment->status = Comment::STATUS_DELETED;
1219
 
1220
                if ($commentMapper->update($comment)) {
1221
 
1222
                    $response = [
1223
                        'success' => true,
1224
                        'data' => [
1225
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
1226
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1227
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1228
                        ]
1229
                    ];
1230
                } else {
1231
                    $response = [
1232
                        'success' => false,
1233
                        'data' => $commentMapper->getError()
1234
                    ];
1235
 
1236
                }
1237
            } else {
1238
                $response = [
1239
                    'success' => false,
1240
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1241
                ];
1242
            }
1243
        } else {
1244
            $response = [
1245
                'success' => false,
1246
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1247
            ];
1248
        }
1249
 
1250
        return new JsonModel($response);
1251
    }
1252
 
242 efrain 1253
    public function reactionAction()
1 efrain 1254
    {
1255
        return new JsonModel([
1256
            'success' => false,
1257
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1258
        ]);
1259
 
1260
    }
1261
 
242 efrain 1262
    public function reactionsAction()
1263
    {
1264
        $id = $this->params()->fromRoute('id');
1265
 
1266
        $request = $this->getRequest();
1267
        if ($request->isGet()) {
1268
 
1269
            $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1270
            $currentNetwork        = $currentNetworkPlugin->getNetwork();
1271
 
1272
            $currentUserPlugin  = $this->plugin('currentUserPlugin');
1273
            $currentUser        = $currentUserPlugin->getUser();
1274
 
1275
            $message_error = '';
1276
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1277
            if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1278
                return new JsonModel([
1279
                    'success'   => false,
1280
                    'data'   => $message_error
1281
                ]);
1282
            }
1283
 
1284
            $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1285
            $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1286
 
1287
 
1288
            $userMapper = UserMapper::getInstance($this->adapter);
1289
 
1290
            $items = [];
1291
 
1292
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1293
            $records = $contentReactionMapper->fetchAllByMyCoachQuestionId($myCoachQuestion->id);
1294
 
283 www 1295
            $storage = Storage::getInstance($this->config);
1296
 
1297
 
242 efrain 1298
            foreach($records as $record)
1299
            {
1300
                $user = $userMapper->fetchOne($record->user_id);
1301
                if($user && $user->status == User::STATUS_ACTIVE) {
1302
 
1303
                    array_push($items, [
1304
                        'first_name' => $user->first_name,
1305
                        'last_name' => $user->last_name,
1306
                        'email' => $user->email,
283 www 1307
                        'image' => $storage->getUserImage($user),
242 efrain 1308
                        'reaction' => $record->reaction,
1309
                    ]);
1310
                }
1311
            }
1312
 
1313
            $response = [
1314
                'success' => true,
1315
                'data' => $items
1316
            ];
1317
 
1318
            return new JsonModel($response);
1319
 
1320
 
1321
 
1322
 
1323
        } else {
1324
            $response = [
1325
                'success' => false,
1326
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1327
            ];
1328
 
1329
            return new JsonModel($response);
1330
        }
1331
    }
1 efrain 1332
 
1333
 
242 efrain 1334
 
1 efrain 1335
    public function saveReactionAction()
1336
    {
1337
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1338
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1339
 
1340
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1341
        $currentUser        = $currentUserPlugin->getUser();
1342
 
1343
        $request    = $this->getRequest();
1344
 
1345
        $id = $this->params()->fromRoute('id');
1346
        $reaction  = $this->params()->fromPost('reaction');
1347
 
1348
        $request = $this->getRequest();
1349
        if ($request->isPost()) {
1350
 
1351
 
1352
            $message_error = '';
1353
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1354
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1355
                return new JsonModel([
1356
                    'success'   => false,
1357
                    'data'   => $message_error
1358
                ]);
1359
            }
1360
 
1361
            $reactions = [
1362
                ContentReaction::REACTION_RECOMMENDED,
1363
                ContentReaction::REACTION_SUPPORT,
1364
                ContentReaction::REACTION_LOVE,
1365
                ContentReaction::REACTION_INTEREST,
1366
                ContentReaction::REACTION_FUN
1367
 
1368
            ];
1369
            if(!in_array($reaction, $reactions)) {
1370
                $response = [
1371
                    'success' => false,
1372
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1373
                ];
1374
                return new JsonModel($response);
1375
            }
1376
 
1377
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1378
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1379
 
1380
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1381
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1382
 
1383
            if ($contentReaction) {
1384
                $contentReaction->reaction = $reaction;
1385
 
1386
                $result = $contentReactionMapper->update($contentReaction);
1387
            } else {
1388
                $contentReaction = new ContentReaction();
1389
                $contentReaction->user_id = $currentUser->id;
1390
                $contentReaction->my_coach_answer_id = $myCoachAnswer->id;
1391
                $contentReaction->relational = ContentReaction::RELATIONAL_MY_COACH;
1392
                $contentReaction->reaction = $reaction;
1393
 
1394
                $result = $contentReactionMapper->insert($contentReaction);
1395
            }
1396
 
1397
 
1398
 
1399
            if ($result) {
1400
 
1401
                $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1402
                $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1403
                $response = [
1404
                    'success' => true,
1405
                    'data' => [
1406
                        'reaction' => $reaction,
1407
                        'total_reactions_question' => $total_reactions_question,
1408
                        'total_reactions_answer' => $total_reactions_answer
1409
                    ]
1410
                ];
1411
            } else {
1412
                $response = [
1413
                    'success' => false,
1414
                    'data' => $contentReactionMapper->getError()
1415
                ];
1416
            }
1417
            return new JsonModel($response);
1418
        }
1419
 
1420
        $response = [
1421
            'success' => false,
1422
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1423
        ];
1424
        return new JsonModel($response);
1425
    }
1426
 
1427
    public function deleteReactionAction()
1428
    {
1429
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1430
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1431
 
1432
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1433
        $currentUser        = $currentUserPlugin->getUser();
1434
 
1435
        $request    = $this->getRequest();
1436
 
1437
        $id = $this->params()->fromRoute('id');
1438
 
1439
        $request = $this->getRequest();
1440
        if ($request->isPost()) {
1441
 
1442
            $message_error = '';
1443
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1444
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1445
                return new JsonModel([
1446
                    'success'   => false,
1447
                    'data'   => $message_error
1448
                ]);
1449
            }
1450
 
1451
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1452
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1453
 
1454
 
1455
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1456
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1457
 
1458
            if ($contentReaction) {
1459
                if ($contentReactionMapper->deleteByByMyCoachAnswerId($myCoachAnswer->id, $currentUser->id)) {
1460
                    $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1461
                    $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1462
 
1463
                    $response = [
1464
                        'success' => true,
1465
                        'data' => [
1466
                            'total_reactions_question' => $total_reactions_question,
1467
                            'total_reactions_answer' => $total_reactions_answer
1468
                        ]
1469
                    ];
1470
                } else {
1471
                    $response = [
1472
                        'success' => false,
1473
                        'data' => $contentReactionMapper->getError()
1474
                    ];
1475
                }
1476
            } else {
1477
                $total_reactions_question = $contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id);
1478
                $total_reactions_answer = $contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1479
 
1480
                $response = [
1481
                    'success' => true,
1482
                    'data' => [
1483
                        'total_reactions_question' => $total_reactions_question,
1484
                        'total_reactions_answer' => $total_reactions_answer
1485
                    ]
1486
                ];
1487
 
1488
 
1489
            }
1490
 
1491
 
1492
 
1493
            return new JsonModel($response);
1494
        }
1495
 
1496
        $response = [
1497
            'success' => false,
1498
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1499
        ];
1500
        return new JsonModel($response);
1501
    }
1502
 
1503
    public function commentsAction()
1504
    {
1505
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1506
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1507
 
1508
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1509
        $currentUser        = $currentUserPlugin->getUser();
1510
 
1511
 
1512
        $id = $this->params()->fromRoute('id');
1513
 
1514
        $request = $this->getRequest();
1515
        if ($request->isGet()) {
1516
            $message_error = '';
1517
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1518
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1519
                return new JsonModel([
1520
                    'success'   => false,
1521
                    'data'   => $message_error
1522
                ]);
1523
            }
1524
 
1525
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1526
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1527
            $now = $myCoachAnswerMapper->getDatebaseNow();
1528
 
1529
            $commentMapper = CommentMapper::getInstance($this->adapter);
1530
            $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1531
 
1532
            $comments = [];
1533
            foreach ($records as $record) {
1534
                $comment = $this->renderComment($record->id, $now);
1535
                array_push($comments, $comment);
1536
            }
1537
 
1538
            $response = [
1539
                'success' => true,
1540
                'data' => $comments
1541
            ];
1542
 
1543
            return new JsonModel($response);
1544
        } else {
1545
 
1546
 
1547
 
1548
            $response = [
1549
                'success' => false,
1550
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1551
            ];
1552
 
1553
 
1554
            return new JsonModel($response);
1555
        }
1556
    }
1557
 
1558
 
1559
    private function renderAnswer($answer_id, $current_user_id, $now)
1560
    {
1561
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1562
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1563
        $message_error = '';
1564
 
1565
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1566
        $myCoachAnswer =  $myCoachAnswerMapper->fetchOne($answer_id);
1567
 
1568
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1569
        $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachAnswer->question_id);
1570
 
1571
 
1572
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1573
        $hasAccessEditOrDeleteAnswer = $myCoachAccessControl->hasAccessEditOrDeleteAnswer($current_user_id, $answer_id, $currentNetwork->id, $message_error);
1574
        if($hasAccessEditOrDeleteAnswer) {
1575
 
1576
 
1577
            $link_edit = $this->url()->fromRoute('my-coach/questions/answers/edit',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1578
            $link_delete = $this->url()->fromRoute('my-coach/questions/answers/delete',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1579
 
1580
        } else {
1581
            $link_edit = '';
1582
            $link_delete = '';
1583
        }
1584
 
1585
        $userMapper = UserMapper::getInstance($this->adapter);
1586
        $user = $userMapper->fetchOne($myCoachAnswer->user_id);
1587
 
1588
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1589
        $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $current_user_id);
1590
        $total_reactions = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1591
 
1592
 
1593
 
1594
 
1595
        $comments = [];
1596
        $commentMapper = CommentMapper::getInstance($this->adapter);
1597
        $total_comments = $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1598
        $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
283 www 1599
 
1 efrain 1600
        foreach($records as $record)
1601
        {
1602
            $comments[] = $this->renderComment($record->id, $now);
1603
        }
1604
 
283 www 1605
        $storage = Storage::getInstance($this->config);
1 efrain 1606
 
1607
        $item = [
1608
            'unique' => uniqid(),
1609
            'uuid' => $myCoachAnswer->uuid,
1610
            'question_uuid' => $myCoachQuestion->uuid,
283 www 1611
            'user_image' => $storage->getUserImage($user),
1 efrain 1612
            'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
1613
            'user_name' => $user->first_name . ' ' . $user->last_name,
1614
            'time_elapsed' => Functions::timeAgo($myCoachAnswer->added_on, $now),
1615
            'text' => $myCoachAnswer->text,
1616
            'reaction' => $contentReaction ? $contentReaction->reaction : '',
1617
            'total_comments' => $total_comments,
1618
            'total_reactions' => $total_reactions,
1619
            'comments' => $comments,
1620
            'link_edit' => $link_edit,
1621
            'link_delete' => $link_delete,
1622
            'link_reaction_delete' => $this->url()->fromRoute('my-coach/questions/reaction/delete', ['id' => $myCoachAnswer->uuid]),
1623
            'link_save_reaction' => $this->url()->fromRoute('my-coach/questions/reaction/save', ['id' => $myCoachAnswer->uuid]),
1624
            'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachAnswer->uuid]),
1625
        ];
1626
 
1627
        return $item;
1628
 
1629
 
1630
 
1631
    }
1632
 
1633
 
1634
 
1635
    private function renderComment($comment_id, $now)
1636
    {
1637
        $item = [];
1638
 
1639
        $commentMapper = CommentMapper::getInstance($this->adapter);
1640
        $record = $commentMapper->fetchOne($comment_id);
1641
 
1642
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1643
        $myCoachAnswer = $myCoachAnswerMapper->fetchOne($record->my_coach_answer_id);
1644
 
1645
 
1646
        if ($record) {
1647
            $userMapper = UserMapper::getInstance($this->adapter);
1648
 
1649
            $user = $userMapper->fetchOne($record->user_id);
1650
 
283 www 1651
            $storage = Storage::getInstance($this->config);
1652
 
1 efrain 1653
            $item['unique'] = uniqid();
1654
            $item['answer_uuid'] = $myCoachAnswer->uuid;
283 www 1655
            $item['user_image'] = $storage->getUserImage($user);
1 efrain 1656
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1657
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1658
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1659
            $item['comment'] = $record->comment;
1660
            $item['link_delete'] = $this->url()->fromRoute('my-coach/questions/comments/delete', ['id' => $myCoachAnswer->uuid, 'comment' => $record->uuid]);
1661
        }
1662
        return $item;
1663
    }
1664
 
1665
}