Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16769 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
133 efrain 1
<?php
2
/**
3
 *
4
 * Controlador: Mis Perfiles
5
 *
6
 */
7
declare(strict_types=1);
8
 
9
namespace LeadersLinked\Controller;
10
 
11
use Laminas\Db\Adapter\AdapterInterface;
16768 efrain 12
 
133 efrain 13
use Laminas\Mvc\Controller\AbstractActionController;
14
use Laminas\Log\LoggerInterface;
15
use Laminas\View\Model\ViewModel;
16
use Laminas\View\Model\JsonModel;
17
 
18
use LeadersLinked\Library\Functions;
17002 efrain 19
use LeadersLinked\Mapper\MicrolearningQuizMapper;
133 efrain 20
use LeadersLinked\Form\QuestionCreateOrEditForm;
21
use Laminas\Hydrator\ObjectPropertyHydrator;
17002 efrain 22
use LeadersLinked\Model\MicrolearningQuestion;
23
use LeadersLinked\Mapper\MicrolearningQuestionMapper;
24
use LeadersLinked\Model\MicrolearningQuiz;
133 efrain 25
 
26
class MicrolearningQuestionController extends AbstractActionController
27
{
28
    /**
29
     *
16769 efrain 30
     * @var \Laminas\Db\Adapter\AdapterInterface
133 efrain 31
     */
32
    private $adapter;
33
 
34
    /**
35
     *
16769 efrain 36
     * @var \LeadersLinked\Cache\CacheInterface
133 efrain 37
     */
16769 efrain 38
    private $cache;
39
 
40
 
41
    /**
42
     *
43
     * @var \Laminas\Log\LoggerInterface
44
     */
133 efrain 45
    private $logger;
46
 
47
    /**
48
     *
49
     * @var array
50
     */
51
    private $config;
52
 
16769 efrain 53
 
133 efrain 54
    /**
55
     *
16769 efrain 56
     * @var \Laminas\Mvc\I18n\Translator
57
     */
58
    private $translator;
59
 
60
 
61
    /**
62
     *
63
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
64
     * @param \LeadersLinked\Cache\CacheInterface $cache
65
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
133 efrain 66
     * @param array $config
16769 efrain 67
     * @param \Laminas\Mvc\I18n\Translator $translator
133 efrain 68
     */
16769 efrain 69
    public function __construct($adapter, $cache, $logger, $config, $translator)
133 efrain 70
    {
16769 efrain 71
        $this->adapter      = $adapter;
72
        $this->cache        = $cache;
73
        $this->logger       = $logger;
74
        $this->config       = $config;
75
        $this->translator   = $translator;
133 efrain 76
    }
77
 
78
    public function indexAction()
79
    {
80
        $request            = $this->getRequest();
81
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
82
        $currentUser        = $currentUserPlugin->getUser();
83
        $currentCompany     = $currentUserPlugin->getCompany();
84
        $quiz_id            = $this->params()->fromRoute('quiz_id');
85
 
86
        $flashMessenger     = $this->plugin('FlashMessenger');
87
 
88
 
17002 efrain 89
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
133 efrain 90
        $quiz = $quizMapper->fetchOneByUuid($quiz_id);
91
        if(!$quiz) {
92
            $flashMessenger->addErrorMessage('ERROR_FORM_NOT_FOUND');
93
            return $this->redirect()->toRoute('dashboard');
94
        }
95
 
96
        if($quiz->company_id != $currentCompany->id) {
97
            $flashMessenger->addErrorMessage('ERROR_UNAUTHORIZED');
98
            return $this->redirect()->toRoute('dashboard');
99
        }
100
 
101
        $request = $this->getRequest();
102
        if($request->isGet()) {
103
            $headers  = $request->getHeaders();
104
 
105
            $isJson = false;
106
            if($headers->has('Accept')) {
107
                $accept = $headers->get('Accept');
108
 
109
                $prioritized = $accept->getPrioritized();
110
 
111
                foreach($prioritized as $key => $value) {
112
                    $raw = trim($value->getRaw());
113
 
114
                    if(!$isJson) {
115
                        $isJson = strpos($raw, 'json');
116
                    }
117
 
118
                }
119
            }
120
 
121
            if($isJson) {
122
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
123
                $allowAnswers = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/quizzes/questions/answers');
124
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/quizzes/questions/add');
125
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/quizzes/questions/edit');
126
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'microlearning/content/quizzes/questions/delete');
127
 
128
 
129
 
130
                $search = $this->params()->fromQuery('search', []);
16766 efrain 131
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
133 efrain 132
 
133
                $page               = intval($this->params()->fromQuery('start', 1), 10);
134
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
135
                $order =  $this->params()->fromQuery('order', []);
136
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
16766 efrain 137
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(Functions::sanitizeFilterString($order[0]['dir']));
133 efrain 138
 
139
                $fields =  ['text'];
140
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'text';
141
 
142
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
143
                    $order_direction = 'ASC';
144
                }
145
 
146
 
147
 
17002 efrain 148
                $microlearningQuestionMapper = MicrolearningQuestionMapper::getInstance($this->adapter);
149
                $paginator = $microlearningQuestionMapper->fetchAllDataTableByCompanyIdAndQuizId($quiz->company_id, $quiz->id, $search, $page, $records_x_page, $order_field, $order_direction);
133 efrain 150
 
151
 
152
                $items = [];
153
                foreach($paginator as $record)
154
                {
155
                    $params = [
156
                        'quiz_id' => $quiz->uuid,
157
                        'question_id' => $record->uuid,
158
                    ];
159
 
160
                    $item = [
161
                        'text' => substr(strip_tags($record->text), 0, 50),
162
                        'details' => [
163
                            'points' => $record->points,
164
                            'check' => '',
165
                            'type' => '',
166
                        ],
167
                        'actions' => [
168
                            'link_edit'   => $allowEdit ? $this->url()->fromRoute('microlearning/content/quizzes/questions/edit', $params) : '',
169
                            'link_delete' => $allowDelete ? $this->url()->fromRoute('microlearning/content/quizzes/questions/delete', $params) : '',
170
                        ],
171
                    ];
172
 
173
                    switch($record->check)
174
                    {
17002 efrain 175
                        case MicrolearningQuestion::CHECK_OK :
133 efrain 176
                            $item['details']['check'] = 'LABEL_OK';
177
                            break;
178
 
17002 efrain 179
                        case MicrolearningQuestion::CHECK_WRONG :
133 efrain 180
                            $item['details']['check'] = 'LABEL_WRONG';
181
                            break;
182
 
17002 efrain 183
                        case MicrolearningQuestion::CHECK_PENDING :
133 efrain 184
                            $item['details']['check'] = 'LABEL_PENDING';
185
                            break;
186
 
187
                        default :
188
                            $item['details']['check'] = '';
189
                            break;
190
                    }
191
 
192
 
193
 
194
                    $item['actions']['link_answer'] = '';
195
                    switch($record->type)
196
                    {
17002 efrain 197
                        case MicrolearningQuestion::TYPE_MULTI_LINE :
133 efrain 198
                            $item['details']['type'] = 'LABEL_MULTI_LINE';
199
                            break;
200
 
17002 efrain 201
                        case MicrolearningQuestion::TYPE_SINGLE_LINE :
133 efrain 202
                            $item['details']['type'] = 'LABEL_SINGLE_LINE';
203
                            break;
204
 
17002 efrain 205
                        case MicrolearningQuestion::TYPE_SINGLE_SELECTION :
133 efrain 206
                            $item['details']['type'] = 'LABEL_SINGLE_SELECTION';
207
                            $item['actions']['link_answer'] = $allowAnswers ? $this->url()->fromRoute('microlearning/content/quizzes/questions/answers', $params) : '';
208
                            break;
209
 
17002 efrain 210
                        case MicrolearningQuestion::TYPE_MULTIPLE_SELECTION;
133 efrain 211
                            $item['details']['type'] = 'LABEL_MULTIPLE_SELECTION';
212
                            $item['actions']['link_answer'] = $allowAnswers ? $this->url()->fromRoute('microlearning/content/quizzes/questions/answers', $params) : '';
213
                            break;
214
 
17002 efrain 215
                        case MicrolearningQuestion::TYPE_RANGE_1_5;
133 efrain 216
                            $item['details']['type'] = 'LABEL_RANGE_1_5';
217
                            break;
218
 
17002 efrain 219
                        case MicrolearningQuestion::TYPE_RANGE_1_6;
133 efrain 220
                            $item['details']['type'] = 'LABEL_RANGE_1_6';
221
                            break;
222
 
17002 efrain 223
                        case MicrolearningQuestion::TYPE_RANGE_1_10;
133 efrain 224
                            $item['type'] = 'LABEL_RANGE_1_10';
225
                            break;
226
 
17002 efrain 227
                        case MicrolearningQuestion::TYPE_RANGE_OPEN;
133 efrain 228
                            $item['details']['type'] = 'LABEL_RANGE_OPEN';
229
                            $item['actions']['link_answer'] = $allowAnswers ? $this->url()->fromRoute('microlearning/content/quizzes/questions/answer', $params) : '';
230
                            break;
231
 
232
                        default :
233
                            $item['details']['type'] = '';
234
                            break;
235
                    }
236
 
237
 
238
 
239
 
240
 
241
                    array_push($items, $item);
242
                }
243
 
244
 
245
                $data = [];
246
                $data['items'] = $items;
247
                $data['total'] = $paginator->getTotalItemCount();
248
 
249
                if($allowAdd) {
250
                    $data['actions']['link_add'] = $this->url()->fromRoute('microlearning/content/quizzes/questions/add', ['quiz_id' => $quiz->id]);
251
                }  else {
252
                    $data['actions']['link_add'] = '';
253
                }
254
 
255
                $response = [
256
                    'success' => true,
257
                    'data' => $data
258
                ];
259
 
260
                return new JsonModel($response);
261
 
262
 
263
            } else {
264
                $quizCreateOrEdit = new QuestionCreateOrEditForm();
265
 
266
                $this->layout()->setTemplate('layout/layout-backend.phtml');
267
                $viewModel = new ViewModel();
268
                $viewModel->setTemplate('leaders-linked/microlearning-questions/index.phtml');
269
                $viewModel->setVariables([
270
                    'quiz_uuid' => $quiz->uuid,
271
                    'quiz_name' => $quiz->name,
272
                    'formCreateOrEdit' => $quizCreateOrEdit,
273
                ]);
274
                return $viewModel ;
275
            }
276
 
277
        } else {
278
            return new JsonModel([
279
                'success' => false,
280
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
281
            ]);
282
        }
283
    }
284
 
285
    public function addAction()
286
    {
287
        $request            = $this->getRequest();
288
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
289
        $currentUser        = $currentUserPlugin->getUser();
290
        $currentCompany     = $currentUserPlugin->getCompany();
291
        $quiz_id            = $this->params()->fromRoute('quiz_id');
292
 
293
 
17002 efrain 294
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
133 efrain 295
        $quiz = $quizMapper->fetchOneByUuid($quiz_id);
296
        if(!$quiz) {
297
            return new JsonModel([
298
                'success'   => false,
299
                'data'   => 'ERROR_FORM_NOT_FOUND'
300
            ]);
301
        }
302
 
303
        if($quiz->company_id != $currentCompany->id) {
304
            return new JsonModel([
305
                'success'   => false,
306
                'data'   => 'ERROR_UNAUTHORIZED'
307
            ]);
308
        }
309
 
310
        if($request->isPost()) {
311
            $quizCreateOrEdit = new  QuestionCreateOrEditForm();
312
            $quizCreateOrEdit->setData($request->getPost()->toArray());
313
 
314
            if($quizCreateOrEdit->isValid()) {
315
                $dataPost = (array) $quizCreateOrEdit->getData();
316
 
317
                $hydrator = new ObjectPropertyHydrator();
17002 efrain 318
                $question = new MicrolearningQuestion();
133 efrain 319
                $hydrator->hydrate($dataPost, $question);
320
 
321
                $question->company_id = $quiz->company_id;
322
                $question->quiz_id = $quiz->id;
323
 
324
 
17002 efrain 325
                $questionMapper = MicrolearningQuestionMapper::getInstance($this->adapter);
133 efrain 326
                if($questionMapper->insert($question)) {
327
 
17002 efrain 328
                    $quiz->check = MicrolearningQuiz::CHECK_PENDING;
133 efrain 329
                    $quizMapper->update($quiz);
330
 
331
                    $this->logger->info('Se agrego la pregunta ' . substr(strip_tags($question->text), 0, 50), ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
332
 
333
                    $data = [
334
                        'success'   => true,
335
                        'data'   => 'LABEL_RECORD_ADDED'
336
                    ];
337
                } else {
338
                    $data = [
339
                        'success'   => false,
340
                        'data'      => $questionMapper->getError()
341
                    ];
342
 
343
                }
344
 
345
                return new JsonModel($data);
346
 
347
            } else {
348
                $messages = [];
349
                $quiz_messages = (array) $quizCreateOrEdit->getMessages();
350
                foreach($quiz_messages  as $fieldname => $field_messages)
351
                {
352
 
353
                    $messages[$fieldname] = array_values($field_messages);
354
                }
355
 
356
                return new JsonModel([
357
                    'success'   => false,
358
                    'data'   => $messages
359
                ]);
360
            }
361
 
362
        } else {
363
            $data = [
364
                'success' => false,
365
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
366
            ];
367
 
368
            return new JsonModel($data);
369
        }
370
 
371
        return new JsonModel($data);
372
    }
373
 
374
    /**
375
     *
376
     * Borrar un perfil excepto el público
377
     * @return \Laminas\View\Model\JsonModel
378
     */
379
    public function deleteAction()
380
    {
381
        $request            = $this->getRequest();
382
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
383
        $currentUser        = $currentUserPlugin->getUser();
384
        $currentCompany     = $currentUserPlugin->getCompany();
385
        $quiz_id            = $this->params()->fromRoute('quiz_id');
386
        $question_id        = $this->params()->fromRoute('question_id');
387
 
388
 
17002 efrain 389
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
133 efrain 390
        $quiz = $quizMapper->fetchOneByUuid($quiz_id);
391
        if(!$quiz) {
392
            return new JsonModel([
393
                'success'   => false,
394
                'data'   => 'ERROR_FORM_NOT_FOUND'
395
            ]);
396
        }
397
 
398
        if($quiz->company_id != $currentCompany->id) {
399
            return new JsonModel([
400
                'success'   => false,
401
                'data'   => 'ERROR_UNAUTHORIZED'
402
            ]);
403
        }
404
 
405
 
17002 efrain 406
        $questionMapper = MicrolearningQuestionMapper::getInstance($this->adapter);
133 efrain 407
        $question = $questionMapper->fetchOneByUuid($question_id);
408
        if(!$question) {
409
            return new JsonModel([
410
                'success'   => false,
411
                'data'   => 'ERROR_QUESTION_NOT_FOUND'
412
            ]);
413
        }
414
 
415
        if($question->quiz_id != $quiz->id) {
416
            return new JsonModel([
417
                'success'   => false,
418
                'data'   => 'ERROR_UNAUTHORIZED'
419
            ]);
420
        }
421
 
422
 
423
        if($request->isPost()) {
424
            $result = $questionMapper->delete($question);
425
            if($result) {
426
 
17002 efrain 427
                $quiz->check = MicroLearningQuiz::CHECK_PENDING;
133 efrain 428
                $quizMapper->update($quiz);
429
 
430
 
431
                $this->logger->info('Se borro la pregunta : ' .  substr(strip_tags($question->text), 0, 50), ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
432
 
433
                $data = [
434
                    'success' => true,
435
                    'data' => 'LABEL_RECORD_DELETED'
436
                ];
437
            } else {
438
 
439
                $data = [
440
                    'success'   => false,
441
                    'data'      => $questionMapper->getError()
442
                ];
443
 
444
                return new JsonModel($data);
445
            }
446
 
447
        } else {
448
            $data = [
449
                'success' => false,
450
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
451
            ];
452
 
453
            return new JsonModel($data);
454
        }
455
 
456
        return new JsonModel($data);
457
    }
458
 
459
 
460
    public function editAction()
461
    {
462
        $request            = $this->getRequest();
463
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
464
        $currentUser        = $currentUserPlugin->getUser();
465
        $currentCompany     = $currentUserPlugin->getCompany();
466
        $quiz_id            = $this->params()->fromRoute('quiz_id');
467
        $question_id        = $this->params()->fromRoute('question_id');
468
 
469
 
17002 efrain 470
        $quizMapper = MicrolearningQuizMapper::getInstance($this->adapter);
133 efrain 471
        $quiz = $quizMapper->fetchOneByUuid($quiz_id);
472
        if(!$quiz) {
473
            return new JsonModel([
474
                'success'   => false,
475
                'data'   => 'ERROR_FORM_NOT_FOUND'
476
            ]);
477
        }
478
 
479
        if($quiz->company_id != $currentCompany->id) {
480
            return new JsonModel([
481
                'success'   => false,
482
                'data'   => 'ERROR_UNAUTHORIZED'
483
            ]);
484
        }
485
 
17002 efrain 486
        $questionMapper = MicrolearningQuestionMapper::getInstance($this->adapter);
133 efrain 487
        $question = $questionMapper->fetchOneByUuid($question_id);
488
        if(!$question) {
489
            return new JsonModel([
490
                'success'   => false,
491
                'data'   => 'ERROR_QUESTION_NOT_FOUND'
492
            ]);
493
        }
494
 
495
        if($question->quiz_id != $quiz->id) {
496
            return new JsonModel([
497
                'success'   => false,
498
                'data'   => 'ERROR_UNAUTHORIZED'
499
            ]);
500
        }
501
 
502
        if($request->isGet()) {
503
            $data = [
504
                'success' => true,
505
                'data' => [
506
                    'text' => $question->text,
507
                    'type' => $question->type,
508
                    'maxlength' => $question->maxlength,
509
                    'points' => $question->points,
510
                ]
511
            ];
512
 
513
            return new JsonModel($data);
514
        }
515
        else if($request->isPost()) {
516
            $quizCreateOrEdit = new  QuestionCreateOrEditForm();
517
            $quizCreateOrEdit->setData($request->getPost()->toArray());
518
 
519
            if($quizCreateOrEdit->isValid()) {
520
                $dataPost = (array) $quizCreateOrEdit->getData();
521
 
522
                $hydrator = new ObjectPropertyHydrator();
523
                $hydrator->hydrate($dataPost, $question);
524
 
17002 efrain 525
                $question->check = MicrolearningQuestion::CHECK_PENDING;
133 efrain 526
                if($questionMapper->update($question)) {
17002 efrain 527
                    $quiz->check = MicroLearningQuiz::CHECK_PENDING;
133 efrain 528
                    $quizMapper->update($quiz);
529
 
530
                    $this->logger->info('Se edito la pregunta ' .  substr(strip_tags($question->text), 0, 50), ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
531
 
532
                    $data = [
533
                        'success'   => true,
534
                        'data'   => 'LABEL_RECORD_UPDATED'
535
                    ];
536
                } else {
537
                    $data = [
538
                        'success'   => false,
539
                        'data'      => $questionMapper->getError()
540
                    ];
541
 
542
                }
543
 
544
                return new JsonModel($data);
545
 
546
            } else {
547
                $messages = [];
548
                $quiz_messages = (array) $quizCreateOrEdit->getMessages();
549
                foreach($quiz_messages  as $fieldname => $field_messages)
550
                {
551
 
552
                    $messages[$fieldname] = array_values($field_messages);
553
                }
554
 
555
                return new JsonModel([
556
                    'success'   => false,
557
                    'data'   => $messages
558
                ]);
559
            }
560
        } else {
561
            $data = [
562
                'success' => false,
563
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
564
            ];
565
 
566
            return new JsonModel($data);
567
        }
568
 
569
        return new JsonModel($data);
570
    }
571
 
572
 
573
}