Proyectos de Subversion LeadersLinked - Backend

Rev

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