Proyectos de Subversion LeadersLinked - Services

Rev

Rev 804 | | 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
 
333 www 216
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 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
 
797 stevensc 248
                    array_push($bags_categories, $categories[ $questionCategory->category_id ] );
1 efrain 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' => [
796 stevensc 297
                    'current' => [
298
                        'items' => $items,
299
                        'page' => $paginator->getCurrentPageNumber(),
300
                        'count' => $paginator->getCurrentItemCount(),
301
                    ],
302
                    'total' => [
303
                        'count' => $paginator->getTotalItemCount(),
304
                        'pages' => $paginator->getPages()->pageCount,
305
                    ],
1 efrain 306
                ]
307
            ]);
308
 
309
 
310
        } else {
311
            return new JsonModel([
312
                'success' => false,
313
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
314
            ]);
315
        }
316
    }
317
 
318
    public function addQuestionAction()
319
    {
320
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
321
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
322
 
323
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
324
        $currentUser        = $currentUserPlugin->getUser();
325
 
326
        $request            = $this->getRequest();
327
 
328
        if ($request->isPost()) {
329
 
330
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
331
 
332
 
333
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
334
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
335
 
336
            $form = new MyCoachQuestionForm($categories);
337
            $form->setData($dataPost);
338
 
339
            if ($form->isValid()) {
340
                $dataPost = (array) $form->getData();
341
 
342
                $myCoachQuestion = new MyCoachQuestion();
343
                $myCoachQuestion->network_id    = $currentNetwork ->id;
344
                $myCoachQuestion->user_id       = $currentUser->id;
345
                $myCoachQuestion->title         = $dataPost['title'];
346
                $myCoachQuestion->description   = $dataPost['description'];
347
 
348
 
349
                $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
350
                if ($myCoachQuestionMapper->insert($myCoachQuestion)) {
351
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
352
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
799 stevensc 353
 
354
                    $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachQuestion->id);
1 efrain 355
 
356
                    $category_ids = $dataPost['category_id'];
137 efrain 357
                    if(is_array($category_ids)) {
358
 
359
 
360
                        foreach($category_ids as $category_id)
361
                        {
362
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
363
                            if($myCoachCategory) {
364
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
365
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
366
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
367
 
368
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
369
                            }
370
                        }
371
                    } else {
372
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 373
                        if($myCoachCategory) {
374
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
375
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
376
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
377
 
378
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
379
                        }
380
                    }
381
 
382
 
383
                    $this->logger->info('Se agrego la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
384
 
798 stevensc 385
                    // Obtener datos adicionales para formato consistente con questionsAction
386
                    $userMapper = UserMapper::getInstance($this->adapter);
387
                    $user = $userMapper->fetchOne($currentUser->id);
388
 
389
                    $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
390
                    $commentMapper = CommentMapper::getInstance($this->adapter);
391
                    $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
392
                    $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
393
 
394
                    $storage = Storage::getInstance($this->config, $this->adapter);
395
 
396
                    // Obtener categorías de la pregunta
397
                    $bags_categories = [];
398
                    if(is_array($category_ids)) {
399
                        foreach($category_ids as $category_id) {
400
                            $category = $myCoachCategoryMapper->fetchOneByUuid($category_id);
401
                            if($category) {
402
                                array_push($bags_categories, $category->name);
403
                            }
404
                        }
405
                    } else {
406
                        $category = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
407
                        if($category) {
408
                            array_push($bags_categories, $category->name);
409
                        }
410
                    }
411
 
412
                    // Formatear descripción (limitar a 250 caracteres)
413
                    $description = strip_tags($myCoachQuestion->description);
414
                    if (strlen($description) > 250) {
415
                        $description = substr($description, 0, 250) . '...';
416
                    }
417
 
418
                    // Formatear fechas
419
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
420
                    $added_on = $dt->format('d/m/Y H:i a');
421
 
422
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
423
                    $updated_on = $dt->format('d/m/Y H:i a');
424
 
425
                    // Verificar permisos
426
                    $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
427
                    $message_error = '';
428
                    $allowEdit = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
429
                    $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
430
 
431
                    $questionData = [
432
                        'uuid' => $myCoachQuestion->uuid,
433
                        'user_name' => trim($user->first_name . ' ' . $user->last_name),
434
                        'user_image' => $storage->getUserImage($user),
435
                        'title' => $myCoachQuestion->title,
436
                        'description' => $description,
437
                        'categories' => $bags_categories,
438
                        'views' => 0, // Nueva pregunta, sin vistas aún
439
                        'answers' => 0, // Nueva pregunta, sin respuestas aún
440
                        'reactions' => 0, // Nueva pregunta, sin reacciones aún
441
                        'comments' => 0, // Nueva pregunta, sin comentarios aún
442
                        'added_on' => $added_on,
443
                        'updated_on' => $updated_on,
444
                        'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]),
445
                        'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $myCoachQuestion->uuid]),
446
                        'link_edit' => $allowEdit ? $this->url()->fromRoute('my-coach/questions/edit', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]) : '',
447
                        'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]) : '',
448
                        'link_reactions' => $this->url()->fromRoute('my-coach/questions/reactions', ['id' => $myCoachQuestion->uuid],['force_canonical' => true])
449
                    ];
450
 
1 efrain 451
                    $data = [
452
                        'success'   => true,
798 stevensc 453
                        'data'      => [
454
                            'question' => $questionData,
455
                            'message' => 'LABEL_RECORD_ADDED'
456
                        ]
1 efrain 457
                    ];
458
                } else {
459
                    $data = [
460
                        'success'   => false,
461
                        'data'      => $myCoachQuestionMapper->getError()
462
                    ];
463
                }
464
 
465
                return new JsonModel($data);
466
            } else {
467
                $messages = [];
468
                $form_messages = (array) $form->getMessages();
469
                foreach ($form_messages  as $fieldname => $field_messages)
470
                {
471
                    $messages[$fieldname] = array_values($field_messages);
472
                }
473
 
474
                return new JsonModel([
475
                    'success'   => false,
476
                    'data'   => $messages
477
                ]);
478
            }
479
        } else {
480
            $data = [
481
                'success' => false,
482
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
483
            ];
484
 
485
            return new JsonModel($data);
486
        }
487
 
488
        return new JsonModel($data);
489
    }
490
 
491
 
492
 
493
    public function deleteQuestionAction()
494
    {
495
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
496
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
497
 
498
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
499
        $currentUser        = $currentUserPlugin->getUser();
500
 
501
        $request    = $this->getRequest();
502
        $id         = $this->params()->fromRoute('id');
503
 
504
        $message_error = '';
505
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
506
        if(!$myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
507
            return new JsonModel([
508
                'success'   => false,
509
                'data'   => $message_error
510
            ]);
511
        }
512
 
513
 
514
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
515
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
516
 
517
 
518
        if ($request->isPost()) {
519
 
801 stevensc 520
            // Capturar datos de la pregunta ANTES de eliminarla para formato consistente
521
            $userMapper = UserMapper::getInstance($this->adapter);
522
            $user = $userMapper->fetchOne($myCoachQuestion->user_id);
523
 
524
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
525
            $commentMapper = CommentMapper::getInstance($this->adapter);
526
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
527
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
528
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
529
 
530
            $storage = Storage::getInstance($this->config, $this->adapter);
531
 
532
            // Obtener categorías de la pregunta antes de eliminar
1 efrain 533
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
801 stevensc 534
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
535
 
536
            $bags_categories = [];
537
            foreach($questionCategories as $questionCategory) {
538
                $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
539
                if($category) {
540
                    array_push($bags_categories, $category->name);
541
                }
542
            }
543
 
544
            // Formatear descripción (limitar a 250 caracteres)
545
            $description = strip_tags($myCoachQuestion->description);
546
            if (strlen($description) > 250) {
547
                $description = substr($description, 0, 250) . '...';
548
            }
549
 
550
            // Formatear fechas
551
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
552
            $added_on = $dt->format('d/m/Y H:i a');
553
 
554
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
555
            $updated_on = $dt->format('d/m/Y H:i a');
556
 
557
            // Capturar datos completos antes de eliminar
558
            $questionData = [
559
                'uuid' => $myCoachQuestion->uuid,
560
                'user_name' => trim($user->first_name . ' ' . $user->last_name),
561
                'user_image' => $storage->getUserImage($user),
562
                'title' => $myCoachQuestion->title,
563
                'description' => $description,
564
                'categories' => $bags_categories,
565
                'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id), 10),
566
                'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
567
                'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
568
                'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
569
                'added_on' => $added_on,
570
                'updated_on' => $updated_on,
571
                'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]),
572
                'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $myCoachQuestion->uuid]),
573
                'link_edit' => $this->url()->fromRoute('my-coach/questions/edit', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]),
574
                'link_delete' => $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]),
575
                'link_reactions' => $this->url()->fromRoute('my-coach/questions/reactions', ['id' => $myCoachQuestion->uuid],['force_canonical' => true])
576
            ];
577
 
578
            // Proceder con la eliminación
1 efrain 579
            $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
580
            $myCoachAnswerMapper->deleteAllByQuestionId($myCoachQuestion->id);
581
 
801 stevensc 582
            $result = $myCoachQuestionMapper->delete($myCoachQuestion);
1 efrain 583
            if ($result) {
801 stevensc 584
                $this->logger->info('Se elimino la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
585
 
1 efrain 586
                $data = [
587
                    'success' => true,
801 stevensc 588
                    'data' => [
589
                        'question' => $questionData,
590
                        'message' => 'LABEL_RECORD_DELETED'
591
                    ]
1 efrain 592
                ];
593
            } else {
594
                $data = [
595
                    'success'   => false,
596
                    'data'      => $myCoachQuestionMapper->getError()
597
                ];
598
 
599
                return new JsonModel($data);
600
            }
601
        } else {
602
            $data = [
603
                'success' => false,
604
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
605
            ];
606
 
607
            return new JsonModel($data);
608
        }
609
 
610
        return new JsonModel($data);
611
    }
612
 
613
 
614
    public function editQuestionAction()
615
    {
616
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
617
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
618
 
619
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
620
        $currentUser        = $currentUserPlugin->getUser();
621
 
622
        $request    = $this->getRequest();
623
        $id    = $this->params()->fromRoute('id');
624
 
625
        $message_error = '';
626
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
627
        if(!$myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
628
            return new JsonModel([
629
                'success'   => false,
630
                'data'   => $message_error
631
            ]);
632
        }
633
 
634
 
635
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
636
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
637
 
638
 
639
        if ($request->isGet()) {
640
 
641
            $category_ids = [];
642
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
643
 
644
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
645
            $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
646
            foreach($records as $record)
647
            {
648
                $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
649
                if($myCoachCategory) {
650
                    array_push($category_ids,$myCoachCategory->uuid);
651
                }
652
            }
653
 
654
 
655
 
656
            $data = [
657
                'success' => true,
658
                'data' => [
659
                    'category_id' => $category_ids,
660
                    'title' => $myCoachQuestion->title,
661
                    'description' => $myCoachQuestion->description,
662
                ]
663
            ];
664
 
665
            return new JsonModel($data);
666
        } else if ($request->isPost()) {
667
 
668
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($myCoachQuestion->user_id, $currentNetwork->id);
669
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
670
 
671
            $form = new MyCoachQuestionForm($categories);
672
            $form->setData($dataPost);
673
 
674
            if ($form->isValid()) {
675
                $dataPost = (array) $form->getData();
676
 
677
 
678
 
679
                $myCoachQuestion->title = $dataPost['title'];
680
                $myCoachQuestion->description = $dataPost['description'];
681
 
682
 
683
                if ($myCoachQuestionMapper->update($myCoachQuestion)) {
684
 
685
 
686
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
687
 
688
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
689
                    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
690
 
691
                    $category_ids = $dataPost['category_id'];
137 efrain 692
                    $category_ids = $dataPost['category_id'];
693
                    if(is_array($category_ids)) {
694
 
695
 
696
                        foreach($category_ids as $category_id)
697
                        {
698
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
699
                            if($myCoachCategory) {
700
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
701
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
702
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
703
 
704
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
705
                            }
706
                        }
707
                    } else {
708
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 709
                        if($myCoachCategory) {
710
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
711
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
712
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
713
 
714
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
715
                        }
716
                    }
717
 
718
 
137 efrain 719
 
1 efrain 720
                    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
721
 
800 stevensc 722
                    // Recargar la pregunta actualizada con todos sus datos
723
                    $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachQuestion->id);
724
 
725
                    // Obtener datos adicionales para formato consistente con questionsAction
726
                    $userMapper = UserMapper::getInstance($this->adapter);
727
                    $user = $userMapper->fetchOne($currentUser->id);
728
 
729
                    $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
730
                    $commentMapper = CommentMapper::getInstance($this->adapter);
731
                    $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
732
                    $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
733
 
734
                    $storage = Storage::getInstance($this->config, $this->adapter);
735
 
736
                    // Obtener categorías de la pregunta
737
                    $bags_categories = [];
738
                    if(is_array($category_ids)) {
739
                        foreach($category_ids as $category_id) {
740
                            $category = $myCoachCategoryMapper->fetchOneByUuid($category_id);
741
                            if($category) {
742
                                array_push($bags_categories, $category->name);
743
                            }
744
                        }
745
                    } else {
746
                        $category = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
747
                        if($category) {
748
                            array_push($bags_categories, $category->name);
749
                        }
750
                    }
751
 
752
                    // Formatear descripción (limitar a 250 caracteres)
753
                    $description = strip_tags($myCoachQuestion->description);
754
                    if (strlen($description) > 250) {
755
                        $description = substr($description, 0, 250) . '...';
756
                    }
757
 
758
                    // Formatear fechas
759
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
760
                    $added_on = $dt->format('d/m/Y H:i a');
761
 
762
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
763
                    $updated_on = $dt->format('d/m/Y H:i a');
764
 
765
                    // Verificar permisos
766
                    $message_error = '';
767
                    $allowEdit = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
768
                    $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
769
 
770
                    $questionData = [
771
                        'uuid' => $myCoachQuestion->uuid,
772
                        'user_name' => trim($user->first_name . ' ' . $user->last_name),
773
                        'user_image' => $storage->getUserImage($user),
774
                        'title' => $myCoachQuestion->title,
775
                        'description' => $description,
776
                        'categories' => $bags_categories,
777
                        'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id), 10),
778
                        'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
779
                        'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
780
                        'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
781
                        'added_on' => $added_on,
782
                        'updated_on' => $updated_on,
783
                        'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]),
784
                        'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $myCoachQuestion->uuid]),
785
                        'link_edit' => $allowEdit ? $this->url()->fromRoute('my-coach/questions/edit', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]) : '',
786
                        'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid],['force_canonical' => true]) : '',
787
                        'link_reactions' => $this->url()->fromRoute('my-coach/questions/reactions', ['id' => $myCoachQuestion->uuid],['force_canonical' => true])
788
                    ];
789
 
1 efrain 790
                    $data = [
791
                        'success'   => true,
800 stevensc 792
                        'data'      => [
793
                            'question' => $questionData,
794
                            'message' => 'LABEL_RECORD_UPDATED'
795
                        ]
1 efrain 796
                    ];
797
                } else {
798
                    $data = [
799
                        'success'   => false,
800
                        'data'      => $myCoachQuestionMapper->getError()
801
                    ];
802
                }
803
 
804
                return new JsonModel($data);
805
            } else {
806
                $messages = [];
807
                $form_messages = (array) $form->getMessages();
808
                foreach ($form_messages  as $fieldname => $field_messages) {
809
 
810
                    $messages[$fieldname] = array_values($field_messages);
811
                }
812
 
813
                return new JsonModel([
814
                    'success'   => false,
815
                    'data'   => $messages
816
                ]);
817
            }
818
        } else {
819
            $data = [
820
                'success' => false,
821
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
822
            ];
823
 
824
            return new JsonModel($data);
825
        }
826
 
827
        return new JsonModel($data);
828
    }
829
 
830
 
831
    public function viewQuestionAction()
832
    {
833
        $currentUserPlugin = $this->plugin('currentUserPlugin');
834
        $currentUser = $currentUserPlugin->getUser();
835
 
836
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
837
        $currentNetwork = $currentNetworkPlugin->getNetwork();
838
 
839
        $request    = $this->getRequest();
840
        $id    = $this->params()->fromRoute('id');
841
 
842
        $message_error = '';
843
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
844
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
845
            return new JsonModel([
846
                'success'   => false,
847
                'data'   => $message_error
848
            ]);
849
        }
850
 
851
 
852
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
853
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
854
 
855
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
856
        $commentMapper = CommentMapper::getInstance($this->adapter);
857
        $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
858
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
859
 
860
 
861
        $request = $this->getRequest();
862
        if ($request->isGet()) {
863
 
864
            $categories = [];
865
            $users = [];
866
 
867
 
868
 
869
            $bags_categories = [];
870
 
871
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
872
            $myCoachQuestionView = $myCoachQuestionViewMapper->fetchOneByQuestionIdAndUserId($myCoachQuestion->id, $currentUser->id);
873
            if(!$myCoachQuestionView) {
874
                $myCoachQuestionView = new MyCoachQuestionView();
875
                $myCoachQuestionView->question_id = $myCoachQuestion->id;
876
                $myCoachQuestionView->user_id = $currentUser->id;
877
 
878
                $myCoachQuestionViewMapper->insert($myCoachQuestionView);
879
 
880
            }
881
 
882
 
883
 
884
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
885
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
886
 
887
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
888
            foreach($questionCategories as $questionCategory)
889
            {
890
 
891
                if (!isset($categories[$questionCategory->category_id])) {
892
                    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
893
                    if ($category) {
894
                        $categories[$category->id] = $category->name;
895
                    }
896
                }
897
 
802 stevensc 898
                array_push($bags_categories, $categories[ $questionCategory->category_id ]);
1 efrain 899
            }
900
 
901
            $users = [];
902
            $userMapper = UserMapper::getInstance($this->adapter);
903
            if(isset($users[$myCoachQuestion->user_id])) {
904
                $user = $users[$myCoachQuestion->user_id];
905
            } else {
906
                $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
907
                $users[ $myCoachQuestion->user_id ] = $user;
908
            }
909
 
910
 
911
 
912
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
913
            $added_on = $dt->format('d/m/Y H:i a');
914
 
915
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
916
            $updated_on = $dt->format('d/m/Y H:i a');
917
 
918
 
919
 
920
            $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
921
            if($allowDelete) {
922
                $link_delete = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
923
            } else {
924
                $link_delete = '';
925
            }
926
 
927
            $allowAnswerAdd = $myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
928
            if ($allowAnswerAdd) {
929
                $link_answers_add = $this->url()->fromRoute('my-coach/questions/answers/add', ['id' => $myCoachQuestion->uuid]);
930
            } else {
931
                $link_answers_add = '';
932
            }
933
 
934
 
935
 
936
            $myCoachLastAnswer = $myCoachAnswerMapper->fetchOneLastAnswerByQuestionId($myCoachQuestion->id);
937
 
938
            if( $myCoachLastAnswer) {
939
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachLastAnswer->added_on);
940
                $last_answer_on = $dt->format('d/m/Y H:i a');
941
 
942
 
943
 
944
            } else {
945
                $last_answer_on = '';
946
            }
947
 
333 www 948
            $storage = Storage::getInstance($this->config, $this->adapter);
1 efrain 949
 
950
            return new JsonModel([
951
                'success' => true,
952
                'data' => [
953
                    'uuid' => $myCoachQuestion->uuid,
954
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
283 www 955
                    'user_image' => $storage->getUserImage($user),
1 efrain 956
                    'title' => $myCoachQuestion->title,
957
                    'description' => $myCoachQuestion->description,
958
                    'categories' => $bags_categories,
959
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id) , 10),
960
                    'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id) , 10),
961
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
962
                    'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
963
                    'added_on' => $added_on,
964
                    'updated_on' => $updated_on,
965
                    'last_answer_on' => $last_answer_on,
966
                    'link_answers' => $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]),
967
                    'link_answers_add' => $link_answers_add,
968
                    'link_delete' => $link_delete,
969
                ]
970
 
971
            ]);
972
 
973
 
974
        } else {
975
            return new JsonModel([
976
                'success' => false,
977
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
978
            ]);
979
        }
980
 
981
 
982
 
983
 
984
 
985
    }
986
 
987
    /**
988
     *
989
     * {@inheritDoc}
990
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
991
     */
992
    public function answersAction()
993
    {
994
        $currentUserPlugin = $this->plugin('currentUserPlugin');
995
        $currentUser = $currentUserPlugin->getUser();
996
 
997
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
998
        $currentNetwork = $currentNetworkPlugin->getNetwork();
999
 
1000
        $request    = $this->getRequest();
1001
        $id    = $this->params()->fromRoute('id');
1002
 
1003
        $message_error = '';
1004
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1005
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1006
            return new JsonModel([
1007
                'success'   => false,
1008
                'data'   => $message_error
1009
            ]);
1010
        }
1011
 
1012
 
1013
 
1014
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1015
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1016
 
1017
        $request = $this->getRequest();
1018
        if ($request->isGet()) {
1019
 
1020
 
1021
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1022
            $now = $myCoachAnswerMapper->getDatebaseNow();
1023
 
1024
            $records = $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
1025
 
1026
 
1027
            $items = [];
1028
 
1029
            foreach($records as $record)
1030
            {
1031
                $items[] = $this->renderAnswer($record->id, $currentUser->id, $now);
1032
            }
1033
 
1034
 
1035
 
1036
            return new JsonModel([
1037
                'success' => true,
1038
                'data' => [
1039
                    'items' => $items
1040
                ]
1041
            ]);
1042
 
1043
 
1044
        } else {
1045
            return new JsonModel([
1046
                'success' => false,
1047
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1048
            ]);
1049
        }
1050
    }
1051
 
1052
    public function deleteAnswerAction()
1053
    {
1054
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1055
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1056
 
1057
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1058
        $currentUser        = $currentUserPlugin->getUser();
1059
 
1060
        $request    = $this->getRequest();
1061
        $answer     = $this->params()->fromRoute('answer');
1062
 
1063
        $message_error = '';
1064
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1065
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
1066
            return new JsonModel([
1067
                'success'   => false,
1068
                'data'   => $message_error
1069
            ]);
1070
        }
1071
 
1072
 
1073
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1074
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
1075
 
1076
        if ($request->isPost()) {
1077
 
1078
            if($myCoachAnswerMapper->delete($myCoachAnswer)) {
1079
 
1080
                $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1081
                $commentMapper = CommentMapper::getInstance($this->adapter);
1082
 
1083
 
1084
                $this->logger->info('Se borro la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1085
 
1086
                $data = [
1087
                    'success'   => true,
1088
                    'data'   => [
1089
                        'total_comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1090
                        'total_answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
804 stevensc 1091
                        'total_reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1092
                        'message' => 'LABEL_RECORD_DELETED'
1 efrain 1093
                    ]
1094
                ];
1095
            } else {
1096
                $data = [
1097
                    'success'   => false,
1098
                    'data'      => $myCoachAnswerMapper->getError()
1099
                ];
1100
            }
1101
        } else {
1102
            $data = [
1103
                'success' => false,
1104
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1105
            ];
1106
 
1107
 
1108
        }
1109
        return new JsonModel($data);
1110
 
1111
 
1112
    }
1113
 
1114
 
1115
    public function editAnswerAction()
1116
    {
1117
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1118
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1119
 
1120
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1121
        $currentUser        = $currentUserPlugin->getUser();
1122
 
1123
        $request    = $this->getRequest();
1124
        $answer     = $this->params()->fromRoute('answer');
1125
 
1126
        $message_error = '';
1127
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1128
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
1129
            return new JsonModel([
1130
                'success'   => false,
1131
                'data'   => $message_error
1132
            ]);
1133
        }
1134
 
1135
 
1136
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1137
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
1138
 
1139
        if ($request->isPost()) {
1140
 
1141
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1142
            $form = new MyCoachAnswerForm();
1143
            $form->setData($dataPost);
1144
 
1145
            if ($form->isValid()) {
1146
                $myCoachAnswer->text        = $dataPost['description'];
1147
 
1148
                if($myCoachAnswerMapper->update($myCoachAnswer)) {
1149
 
1150
                    $this->logger->info('Se edito la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1151
 
1152
                    $data = [
1153
                        'success'   => true,
1154
                        'data'   => [
805 stevensc 1155
                            'message' => 'LABEL_RECORD_UPDATED',
1 efrain 1156
                            'description' => $myCoachAnswer->text
1157
                        ]
1158
                    ];
1159
                } else {
1160
                    $data = [
1161
                        'success'   => false,
1162
                        'data'      => $myCoachAnswerMapper->getError()
1163
                    ];
1164
                }
1165
 
1166
                return new JsonModel($data);
1167
            } else {
1168
                $messages = [];
1169
                $form_messages = (array) $form->getMessages();
1170
                foreach ($form_messages  as $fieldname => $field_messages)
1171
                {
1172
                    $messages[$fieldname] = array_values($field_messages);
1173
                }
1174
 
1175
                return new JsonModel([
1176
                    'success'   => false,
1177
                    'data'   => $messages
1178
                ]);
1179
            }
1180
        } else  if ($request->isGet()) {
1181
            return new JsonModel([
1182
                'success'   => true,
1183
                'data'   => [
1184
                    'description' => $myCoachAnswer->text
1185
                ]
1186
            ]);
1187
        } else {
1188
            $data = [
1189
                'success' => false,
1190
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1191
            ];
1192
 
1193
            return new JsonModel($data);
1194
        }
1195
 
1196
 
1197
    }
1198
 
1199
 
1200
 
1201
 
1202
 
1203
    public function addAnswerAction()
1204
    {
1205
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1206
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1207
 
1208
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1209
        $currentUser        = $currentUserPlugin->getUser();
1210
 
1211
        $request    = $this->getRequest();
1212
        $id    = $this->params()->fromRoute('id');
1213
 
1214
        $message_error = '';
1215
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1216
        if(!$myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1217
            return new JsonModel([
1218
                'success'   => false,
1219
                'data'   => $message_error
1220
            ]);
1221
        }
1222
 
1223
 
1224
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1225
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1226
 
1227
        if ($request->isPost()) {
1228
 
1229
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1230
            $form = new MyCoachAnswerForm();
1231
            $form->setData($dataPost);
1232
 
1233
            if ($form->isValid()) {
1234
 
1235
                $myCoachAnswer = new MyCoachAnswer();
1236
                $myCoachAnswer->question_id = $myCoachQuestion->id;
1237
                $myCoachAnswer->text        = $dataPost['description'];
1238
                $myCoachAnswer->user_id     = $currentUser->id;
1239
 
1240
 
1241
                $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1242
                if($myCoachAnswerMapper->insert($myCoachAnswer)) {
1243
                    $now = $myCoachAnswerMapper->getDatebaseNow();
1244
 
1245
                    $this->logger->info('Se agrego la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1246
 
1247
                    $data = [
1248
                        'success'   => true,
1249
                        'data'   => [
803 stevensc 1250
                            'total_answers' => $myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id),
1251
                            'answer' => $this->renderAnswer($myCoachAnswer->id, $currentUser->id, $now),
1252
                            'message' => 'LABEL_RECORD_ADDED'
1 efrain 1253
                        ]
1254
                    ];
1255
                } else {
1256
                    $data = [
1257
                        'success'   => false,
1258
                        'data'      => $myCoachQuestionMapper->getError()
1259
                    ];
1260
                }
1261
 
1262
                return new JsonModel($data);
1263
            } else {
1264
                $messages = [];
1265
                $form_messages = (array) $form->getMessages();
1266
                foreach ($form_messages  as $fieldname => $field_messages)
1267
                {
1268
                    $messages[$fieldname] = array_values($field_messages);
1269
                }
1270
 
1271
                return new JsonModel([
1272
                    'success'   => false,
1273
                    'data'   => $messages
1274
                ]);
1275
            }
1276
 
1277
        } else {
1278
            $data = [
1279
                'success' => false,
1280
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1281
            ];
1282
 
1283
            return new JsonModel($data);
1284
        }
1285
 
1286
 
1287
    }
60 efrain 1288
 
1 efrain 1289
 
1290
 
1291
    public function addCommentAction()
1292
    {
1293
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1294
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1295
 
1296
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1297
        $currentUser        = $currentUserPlugin->getUser();
1298
 
1299
        $request    = $this->getRequest();
1300
        $id    = $this->params()->fromRoute('id');
1301
 
1302
 
1303
        $request = $this->getRequest();
1304
        if ($request->isPost()) {
1305
 
1306
            $message_error = '';
1307
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1308
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1309
                return new JsonModel([
1310
                    'success'   => false,
1311
                    'data'   => $message_error
1312
                ]);
1313
            }
1314
 
1315
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1316
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1317
 
1318
            $dataPost = $request->getPost()->toArray();
1319
            $form = new CommentForm();
1320
            $form->setData($dataPost);
1321
 
1322
            if ($form->isValid()) {
1323
 
1324
 
1325
                $currentUserPlugin = $this->plugin('currentUserPlugin');
1326
                $currentUser = $currentUserPlugin->getUser();
1327
 
1328
                $dataPost = (array) $form->getData();
1329
 
1330
 
1331
 
1332
                $comment = new Comment();
1333
                $comment->network_id = $currentUser->network_id;
1334
                $comment->comment = $dataPost['comment'];
1335
                $comment->user_id = $currentUser->id;
1336
                $comment->my_coach_answer_id = $myCoachAnswer->id;
1337
                $comment->relational = Comment::RELATIONAL_MY_COACH;
1338
 
1339
                $commentMapper = CommentMapper::getInstance($this->adapter);
1340
                if ($commentMapper->insert($comment)) {
1341
                    $now = $commentMapper->getDatebaseNow();
1342
 
1343
                    $response = [
1344
                        'success'           => true,
1345
                        'data'              => [
1346
                            'item'  => $this->renderComment($comment->id, $now),
1347
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1348
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1349
                        ]
1350
                    ];
1351
 
1352
                    return new JsonModel($response);
1353
                } else {
1354
 
1355
                    $response = [
1356
                        'success'   => false,
1357
                        'data'   => $commentMapper->getError()
1358
                    ];
1359
 
1360
                    return new JsonModel($response);
1361
                }
1362
            } else {
1363
                $message = '';;
1364
                $form_messages = (array) $form->getMessages();
1365
                foreach ($form_messages  as $fieldname => $field_messages) {
1366
                    foreach ($field_messages as $key => $value) {
1367
                        $message = $value;
1368
                    }
1369
                }
1370
 
1371
                $response = [
1372
                    'success'   => false,
1373
                    'data'   => $message
1374
                ];
1375
 
1376
                return new JsonModel($response);
1377
            }
1378
        } else {
1379
            $response = [
1380
                'success' => false,
1381
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1382
            ];
1383
 
1384
            return new JsonModel($response);
1385
        }
1386
    }
1387
 
1388
 
1389
 
1390
    public function deleteCommentAction()
1391
    {
1392
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1393
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1394
 
1395
        $currentUserPlugin      = $this->plugin('currentUserPlugin');
1396
        $currentUser            = $currentUserPlugin->getUser();
1397
 
1398
        $request                = $this->getRequest();
1399
        $id                     = $this->params()->fromRoute('id');
1400
        $comment                = $this->params()->fromRoute('comment');
1401
 
1402
 
1403
        $request = $this->getRequest();
1404
        if ($request->isPost()) {
1405
 
1406
 
1407
 
1408
 
1409
            $message_error = '';
1410
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1411
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1412
                return new JsonModel([
1413
                    'success'   => false,
1414
                    'data'   => $message_error
1415
                ]);
1416
            }
1417
 
1418
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1419
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1420
 
1421
            $commentMapper = CommentMapper::getInstance($this->adapter);
1422
            $comment = $commentMapper->fetchOneByUuid($comment);
1423
 
1424
 
1425
            if ($comment && $comment->my_coach_answer_id == $myCoachAnswer->id && $comment->user_id == $currentUser->id) {
1426
 
1427
                $comment->status = Comment::STATUS_DELETED;
1428
 
1429
                if ($commentMapper->update($comment)) {
1430
 
1431
                    $response = [
1432
                        'success' => true,
1433
                        'data' => [
1434
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
1435
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1436
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1437
                        ]
1438
                    ];
1439
                } else {
1440
                    $response = [
1441
                        'success' => false,
1442
                        'data' => $commentMapper->getError()
1443
                    ];
1444
 
1445
                }
1446
            } else {
1447
                $response = [
1448
                    'success' => false,
1449
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1450
                ];
1451
            }
1452
        } else {
1453
            $response = [
1454
                'success' => false,
1455
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1456
            ];
1457
        }
1458
 
1459
        return new JsonModel($response);
1460
    }
1461
 
242 efrain 1462
    public function reactionAction()
1 efrain 1463
    {
1464
        return new JsonModel([
1465
            'success' => false,
1466
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1467
        ]);
1468
 
1469
    }
1470
 
242 efrain 1471
    public function reactionsAction()
1472
    {
1473
        $id = $this->params()->fromRoute('id');
1474
 
1475
        $request = $this->getRequest();
1476
        if ($request->isGet()) {
1477
 
1478
            $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1479
            $currentNetwork        = $currentNetworkPlugin->getNetwork();
1480
 
1481
            $currentUserPlugin  = $this->plugin('currentUserPlugin');
1482
            $currentUser        = $currentUserPlugin->getUser();
1483
 
1484
            $message_error = '';
1485
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1486
            if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1487
                return new JsonModel([
1488
                    'success'   => false,
1489
                    'data'   => $message_error
1490
                ]);
1491
            }
1492
 
1493
            $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1494
            $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1495
 
1496
 
1497
            $userMapper = UserMapper::getInstance($this->adapter);
1498
 
1499
            $items = [];
1500
 
1501
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1502
            $records = $contentReactionMapper->fetchAllByMyCoachQuestionId($myCoachQuestion->id);
1503
 
333 www 1504
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1505
 
1506
 
242 efrain 1507
            foreach($records as $record)
1508
            {
1509
                $user = $userMapper->fetchOne($record->user_id);
1510
                if($user && $user->status == User::STATUS_ACTIVE) {
1511
 
1512
                    array_push($items, [
1513
                        'first_name' => $user->first_name,
1514
                        'last_name' => $user->last_name,
1515
                        'email' => $user->email,
283 www 1516
                        'image' => $storage->getUserImage($user),
242 efrain 1517
                        'reaction' => $record->reaction,
1518
                    ]);
1519
                }
1520
            }
1521
 
1522
            $response = [
1523
                'success' => true,
1524
                'data' => $items
1525
            ];
1526
 
1527
            return new JsonModel($response);
1528
 
1529
 
1530
 
1531
 
1532
        } else {
1533
            $response = [
1534
                'success' => false,
1535
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1536
            ];
1537
 
1538
            return new JsonModel($response);
1539
        }
1540
    }
1 efrain 1541
 
1542
 
242 efrain 1543
 
1 efrain 1544
    public function saveReactionAction()
1545
    {
1546
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1547
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1548
 
1549
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1550
        $currentUser        = $currentUserPlugin->getUser();
1551
 
1552
        $request    = $this->getRequest();
1553
 
1554
        $id = $this->params()->fromRoute('id');
1555
        $reaction  = $this->params()->fromPost('reaction');
1556
 
1557
        $request = $this->getRequest();
1558
        if ($request->isPost()) {
1559
 
1560
 
1561
            $message_error = '';
1562
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1563
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1564
                return new JsonModel([
1565
                    'success'   => false,
1566
                    'data'   => $message_error
1567
                ]);
1568
            }
1569
 
1570
            $reactions = [
1571
                ContentReaction::REACTION_RECOMMENDED,
1572
                ContentReaction::REACTION_SUPPORT,
1573
                ContentReaction::REACTION_LOVE,
1574
                ContentReaction::REACTION_INTEREST,
1575
                ContentReaction::REACTION_FUN
1576
 
1577
            ];
1578
            if(!in_array($reaction, $reactions)) {
1579
                $response = [
1580
                    'success' => false,
1581
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1582
                ];
1583
                return new JsonModel($response);
1584
            }
1585
 
1586
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1587
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1588
 
1589
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1590
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1591
 
1592
            if ($contentReaction) {
1593
                $contentReaction->reaction = $reaction;
1594
 
1595
                $result = $contentReactionMapper->update($contentReaction);
1596
            } else {
1597
                $contentReaction = new ContentReaction();
1598
                $contentReaction->user_id = $currentUser->id;
1599
                $contentReaction->my_coach_answer_id = $myCoachAnswer->id;
1600
                $contentReaction->relational = ContentReaction::RELATIONAL_MY_COACH;
1601
                $contentReaction->reaction = $reaction;
1602
 
1603
                $result = $contentReactionMapper->insert($contentReaction);
1604
            }
1605
 
1606
 
1607
 
1608
            if ($result) {
1609
 
1610
                $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1611
                $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1612
                $response = [
1613
                    'success' => true,
1614
                    'data' => [
1615
                        'reaction' => $reaction,
1616
                        'total_reactions_question' => $total_reactions_question,
1617
                        'total_reactions_answer' => $total_reactions_answer
1618
                    ]
1619
                ];
1620
            } else {
1621
                $response = [
1622
                    'success' => false,
1623
                    'data' => $contentReactionMapper->getError()
1624
                ];
1625
            }
1626
            return new JsonModel($response);
1627
        }
1628
 
1629
        $response = [
1630
            'success' => false,
1631
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1632
        ];
1633
        return new JsonModel($response);
1634
    }
1635
 
1636
    public function deleteReactionAction()
1637
    {
1638
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1639
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1640
 
1641
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1642
        $currentUser        = $currentUserPlugin->getUser();
1643
 
1644
        $request    = $this->getRequest();
1645
 
1646
        $id = $this->params()->fromRoute('id');
1647
 
1648
        $request = $this->getRequest();
1649
        if ($request->isPost()) {
1650
 
1651
            $message_error = '';
1652
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1653
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1654
                return new JsonModel([
1655
                    'success'   => false,
1656
                    'data'   => $message_error
1657
                ]);
1658
            }
1659
 
1660
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1661
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1662
 
1663
 
1664
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1665
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1666
 
1667
            if ($contentReaction) {
1668
                if ($contentReactionMapper->deleteByByMyCoachAnswerId($myCoachAnswer->id, $currentUser->id)) {
1669
                    $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1670
                    $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1671
 
1672
                    $response = [
1673
                        'success' => true,
1674
                        'data' => [
1675
                            'total_reactions_question' => $total_reactions_question,
1676
                            'total_reactions_answer' => $total_reactions_answer
1677
                        ]
1678
                    ];
1679
                } else {
1680
                    $response = [
1681
                        'success' => false,
1682
                        'data' => $contentReactionMapper->getError()
1683
                    ];
1684
                }
1685
            } else {
1686
                $total_reactions_question = $contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id);
1687
                $total_reactions_answer = $contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1688
 
1689
                $response = [
1690
                    'success' => true,
1691
                    'data' => [
1692
                        'total_reactions_question' => $total_reactions_question,
1693
                        'total_reactions_answer' => $total_reactions_answer
1694
                    ]
1695
                ];
1696
 
1697
 
1698
            }
1699
 
1700
 
1701
 
1702
            return new JsonModel($response);
1703
        }
1704
 
1705
        $response = [
1706
            'success' => false,
1707
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1708
        ];
1709
        return new JsonModel($response);
1710
    }
1711
 
1712
    public function commentsAction()
1713
    {
1714
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1715
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1716
 
1717
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1718
        $currentUser        = $currentUserPlugin->getUser();
1719
 
1720
 
1721
        $id = $this->params()->fromRoute('id');
1722
 
1723
        $request = $this->getRequest();
1724
        if ($request->isGet()) {
1725
            $message_error = '';
1726
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1727
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1728
                return new JsonModel([
1729
                    'success'   => false,
1730
                    'data'   => $message_error
1731
                ]);
1732
            }
1733
 
1734
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1735
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1736
            $now = $myCoachAnswerMapper->getDatebaseNow();
1737
 
1738
            $commentMapper = CommentMapper::getInstance($this->adapter);
1739
            $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1740
 
1741
            $comments = [];
1742
            foreach ($records as $record) {
1743
                $comment = $this->renderComment($record->id, $now);
1744
                array_push($comments, $comment);
1745
            }
1746
 
1747
            $response = [
1748
                'success' => true,
1749
                'data' => $comments
1750
            ];
1751
 
1752
            return new JsonModel($response);
1753
        } else {
1754
 
1755
 
1756
 
1757
            $response = [
1758
                'success' => false,
1759
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1760
            ];
1761
 
1762
 
1763
            return new JsonModel($response);
1764
        }
1765
    }
1766
 
1767
 
1768
    private function renderAnswer($answer_id, $current_user_id, $now)
1769
    {
1770
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1771
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1772
        $message_error = '';
1773
 
1774
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1775
        $myCoachAnswer =  $myCoachAnswerMapper->fetchOne($answer_id);
1776
 
1777
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1778
        $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachAnswer->question_id);
1779
 
1780
 
1781
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1782
        $hasAccessEditOrDeleteAnswer = $myCoachAccessControl->hasAccessEditOrDeleteAnswer($current_user_id, $answer_id, $currentNetwork->id, $message_error);
1783
        if($hasAccessEditOrDeleteAnswer) {
1784
 
1785
 
1786
            $link_edit = $this->url()->fromRoute('my-coach/questions/answers/edit',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1787
            $link_delete = $this->url()->fromRoute('my-coach/questions/answers/delete',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1788
 
1789
        } else {
1790
            $link_edit = '';
1791
            $link_delete = '';
1792
        }
1793
 
1794
        $userMapper = UserMapper::getInstance($this->adapter);
1795
        $user = $userMapper->fetchOne($myCoachAnswer->user_id);
1796
 
1797
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1798
        $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $current_user_id);
1799
        $total_reactions = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1800
 
1801
 
1802
 
1803
 
1804
        $comments = [];
1805
        $commentMapper = CommentMapper::getInstance($this->adapter);
1806
        $total_comments = $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1807
        $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
283 www 1808
 
1 efrain 1809
        foreach($records as $record)
1810
        {
1811
            $comments[] = $this->renderComment($record->id, $now);
1812
        }
1813
 
333 www 1814
        $storage = Storage::getInstance($this->config, $this->adapter);
1 efrain 1815
 
1816
        $item = [
1817
            'unique' => uniqid(),
1818
            'uuid' => $myCoachAnswer->uuid,
1819
            'question_uuid' => $myCoachQuestion->uuid,
283 www 1820
            'user_image' => $storage->getUserImage($user),
1 efrain 1821
            'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
1822
            'user_name' => $user->first_name . ' ' . $user->last_name,
1823
            'time_elapsed' => Functions::timeAgo($myCoachAnswer->added_on, $now),
1824
            'text' => $myCoachAnswer->text,
1825
            'reaction' => $contentReaction ? $contentReaction->reaction : '',
1826
            'total_comments' => $total_comments,
1827
            'total_reactions' => $total_reactions,
1828
            'comments' => $comments,
1829
            'link_edit' => $link_edit,
1830
            'link_delete' => $link_delete,
1831
            'link_reaction_delete' => $this->url()->fromRoute('my-coach/questions/reaction/delete', ['id' => $myCoachAnswer->uuid]),
1832
            'link_save_reaction' => $this->url()->fromRoute('my-coach/questions/reaction/save', ['id' => $myCoachAnswer->uuid]),
1833
            'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachAnswer->uuid]),
1834
        ];
1835
 
1836
        return $item;
1837
 
1838
 
1839
 
1840
    }
1841
 
1842
 
1843
 
1844
    private function renderComment($comment_id, $now)
1845
    {
1846
        $item = [];
1847
 
1848
        $commentMapper = CommentMapper::getInstance($this->adapter);
1849
        $record = $commentMapper->fetchOne($comment_id);
1850
 
1851
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1852
        $myCoachAnswer = $myCoachAnswerMapper->fetchOne($record->my_coach_answer_id);
1853
 
1854
 
1855
        if ($record) {
1856
            $userMapper = UserMapper::getInstance($this->adapter);
1857
 
1858
            $user = $userMapper->fetchOne($record->user_id);
1859
 
333 www 1860
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1861
 
1 efrain 1862
            $item['unique'] = uniqid();
1863
            $item['answer_uuid'] = $myCoachAnswer->uuid;
283 www 1864
            $item['user_image'] = $storage->getUserImage($user);
1 efrain 1865
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1866
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1867
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1868
            $item['comment'] = $record->comment;
1869
            $item['link_delete'] = $this->url()->fromRoute('my-coach/questions/comments/delete', ['id' => $myCoachAnswer->uuid, 'comment' => $record->uuid]);
1870
        }
1871
        return $item;
1872
    }
1873
 
1874
}