Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
17002 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
 
9
 
10
use Laminas\Mvc\Controller\AbstractActionController;
11
use Laminas\Log\LoggerInterface;
12
 
13
use Laminas\View\Model\ViewModel;
14
use Laminas\View\Model\JsonModel;
15
use LeadersLinked\Library\Functions;
16
use LeadersLinked\Mapper\MediaCategoryMapper;
17
use LeadersLinked\Form\Media\CategoryForm;
18
use LeadersLinked\Model\MediaCategory;
19
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
20
 
21
 
22
class MediaCategoryController extends AbstractActionController
23
{
24
    /**
25
     *
26
     * @var \Laminas\Db\Adapter\AdapterInterface
27
     */
28
    private $adapter;
17251 ariadna 29
 
17002 efrain 30
    /**
31
     *
32
     * @var \LeadersLinked\Cache\CacheInterface
33
     */
34
    private $cache;
17251 ariadna 35
 
36
 
17002 efrain 37
    /**
38
     *
39
     * @var \Laminas\Log\LoggerInterface
40
     */
41
    private $logger;
17251 ariadna 42
 
17002 efrain 43
    /**
44
     *
45
     * @var array
46
     */
47
    private $config;
17251 ariadna 48
 
49
 
17002 efrain 50
    /**
51
     *
52
     * @var \Laminas\Mvc\I18n\Translator
53
     */
54
    private $translator;
17251 ariadna 55
 
56
 
17002 efrain 57
    /**
58
     *
59
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
60
     * @param \LeadersLinked\Cache\CacheInterface $cache
61
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
62
     * @param array $config
63
     * @param \Laminas\Mvc\I18n\Translator $translator
64
     */
65
    public function __construct($adapter, $cache, $logger, $config, $translator)
66
    {
67
        $this->adapter      = $adapter;
68
        $this->cache        = $cache;
69
        $this->logger       = $logger;
70
        $this->config       = $config;
71
        $this->translator   = $translator;
72
    }
73
 
74
    public function indexAction()
75
    {
17253 ariadna 76
 
17002 efrain 77
        $currentUserPlugin = $this->plugin('currentUserPlugin');
78
        $currentUser = $currentUserPlugin->getUser();
79
        $currentCompany = $currentUserPlugin->getCompany();
80
 
81
        $request = $this->getRequest();
17253 ariadna 82
 
83
 
17002 efrain 84
        if ($request->isGet()) {
85
            $headers  = $request->getHeaders();
86
 
87
            $isJson = false;
17253 ariadna 88
 
17002 efrain 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
 
17253 ariadna 103
 
17002 efrain 104
            if ($isJson) {
105
                $search = $this->params()->fromQuery('search');
106
                $search = empty($search['value']) ? '' : Functions::sanitizeFilterString($search['value']);
107
 
108
                $page               = intval($this->params()->fromQuery('start', 1), 10);
109
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
110
                $order =  $this->params()->fromQuery('order', []);
111
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
112
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : Functions::sanitizeFilterString(filter_var($order[0]['dir']));
113
 
114
                $fields =  ['name'];
115
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
116
 
117
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
118
                    $order_direction = 'ASC';
119
                }
120
 
121
                $mediaCategoryMapper = MediaCategoryMapper::getInstance($this->adapter);
122
                $paginator = $mediaCategoryMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
123
 
124
                $items = [];
125
                $records = $paginator->getCurrentItems();
126
                foreach ($records as $record) {
127
                    $item = [
128
                        'name' => $record->name,
129
                        'actions' => [
130
                            'link_edit' => $this->url()->fromRoute('media/categories/edit', ['id' => $record->uuid]),
131
                            'link_delete' => $this->url()->fromRoute('media/categories/delete', ['id' => $record->uuid])
132
                        ],
133
                    ];
134
 
135
                    array_push($items, $item);
136
                }
137
 
138
                return new JsonModel([
139
                    'success' => true,
140
                    'data' => [
141
                        'items' => $items,
142
                        'total' => $paginator->getTotalItemCount(),
143
                    ]
144
                ]);
145
            } else {
146
                $form = new CategoryForm();
147
                $this->layout()->setTemplate('layout/layout-backend');
148
                $viewModel = new ViewModel();
149
                $viewModel->setTemplate('leaders-linked/media/categories.phtml');
150
                $viewModel->setVariable('form', $form);
151
                return $viewModel;
152
            }
153
        } else {
154
            return new JsonModel([
155
                'success' => false,
156
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
157
            ]);;
158
        }
159
    }
160
 
161
    public function addAction()
162
    {
163
        $currentUserPlugin = $this->plugin('currentUserPlugin');
164
        $currentUser = $currentUserPlugin->getUser();
165
        $currentCompany = $currentUserPlugin->getCompany();
166
 
167
        $request = $this->getRequest();
168
        if ($request->isPost()) {
169
            $form = new  CategoryForm();
170
            $dataPost = $request->getPost()->toArray();
171
 
172
            $form->setData($dataPost);
173
 
174
            if ($form->isValid()) {
175
                $dataPost = (array) $form->getData();
17251 ariadna 176
 
17002 efrain 177
                $hydrator = new ObjectPropertyHydrator();
178
                $mediaCategory = new MediaCategory();
179
                $mediaCategory->company_id = $currentCompany->id;
180
                $hydrator->hydrate($dataPost, $mediaCategory);
181
 
182
 
183
 
17251 ariadna 184
 
17002 efrain 185
                $mediaCategoryMapper = MediaCategoryMapper::getInstance($this->adapter);
186
                $result = $mediaCategoryMapper->insert($mediaCategory);
187
 
188
                if ($result) {
189
                    $this->logger->info('Se agrego la categoría de media ' . $mediaCategory->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
190
 
191
                    $data = [
192
                        'success'   => true,
193
                        'data'   => 'LABEL_RECORD_ADDED'
194
                    ];
195
                } else {
196
                    $data = [
197
                        'success'   => false,
198
                        'data'      => $mediaCategoryMapper->getError()
199
                    ];
200
                }
201
 
202
                return new JsonModel($data);
203
            } else {
204
                $messages = [];
205
                $form_messages = (array) $form->getMessages();
206
                foreach ($form_messages  as $fieldname => $field_messages) {
207
 
208
                    $messages[$fieldname] = array_values($field_messages);
209
                }
210
 
211
                return new JsonModel([
212
                    'success'   => false,
213
                    'data'   => $messages
214
                ]);
215
            }
216
        } else {
217
            $data = [
218
                'success' => false,
219
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
220
            ];
221
 
222
            return new JsonModel($data);
223
        }
224
 
225
        return new JsonModel($data);
226
    }
227
 
228
    public function editAction()
229
    {
230
        $currentUserPlugin = $this->plugin('currentUserPlugin');
231
        $currentUser = $currentUserPlugin->getUser();
232
        $currentCompany = $currentUserPlugin->getCompany();
233
 
234
        $request = $this->getRequest();
235
        $uuid = $this->params()->fromRoute('id');
236
 
237
 
238
        if (!$uuid) {
239
            $data = [
240
                'success'   => false,
241
                'data'   => 'ERROR_INVALID_PARAMETER'
242
            ];
243
 
244
            return new JsonModel($data);
245
        }
246
 
247
        $mediaCategoryMapper = MediaCategoryMapper::getInstance($this->adapter);
248
        $mediaCategory = $mediaCategoryMapper->fetchOneByUuid($uuid);
249
        if (!$mediaCategory) {
250
            $data = [
251
                'success'   => false,
252
                'data'   => 'ERROR_RECORD_NOT_FOUND'
253
            ];
17251 ariadna 254
 
17002 efrain 255
            return new JsonModel($data);
256
        }
17251 ariadna 257
 
258
        if ($mediaCategory->company_id != $currentCompany->id) {
17002 efrain 259
            return new JsonModel([
260
                'success' => false,
261
                'data' => 'ERROR_UNAUTHORIZED'
262
            ]);
263
        }
264
 
17251 ariadna 265
 
17002 efrain 266
        if ($request->isPost()) {
267
            $form = new  CategoryForm();
268
            $dataPost = $request->getPost()->toArray();
269
 
270
            $form->setData($dataPost);
271
 
272
            if ($form->isValid()) {
273
                $dataPost = (array) $form->getData();
274
 
275
                $hydrator = new ObjectPropertyHydrator();
276
                $hydrator->hydrate($dataPost, $mediaCategory);
277
                $result = $mediaCategoryMapper->update($mediaCategory);
278
 
279
                if ($result) {
280
                    $this->logger->info('Se actualizo la categoría de media ' . $mediaCategory->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
281
 
282
                    $data = [
283
                        'success' => true,
284
                        'data' => 'LABEL_RECORD_UPDATED'
285
                    ];
286
                } else {
287
                    $data = [
288
                        'success'   => false,
289
                        'data'      => $mediaCategoryMapper->getError()
290
                    ];
291
                }
292
 
293
                return new JsonModel($data);
294
            } else {
295
                $messages = [];
296
                $form_messages = (array) $form->getMessages();
297
                foreach ($form_messages  as $fieldname => $field_messages) {
298
                    $messages[$fieldname] = array_values($field_messages);
299
                }
300
 
301
                return new JsonModel([
302
                    'success'   => false,
303
                    'data'   => $messages
304
                ]);
305
            }
306
        } else if ($request->isGet()) {
307
            $hydrator = new ObjectPropertyHydrator();
308
 
309
            $data = [
310
                'success' => true,
311
                'data' => $hydrator->extract($mediaCategory)
312
            ];
313
 
314
            return new JsonModel($data);
315
        } else {
316
            $data = [
317
                'success' => false,
318
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
319
            ];
320
 
321
            return new JsonModel($data);
322
        }
323
 
324
        return new JsonModel($data);
325
    }
326
 
327
    public function deleteAction()
328
    {
329
        $currentUserPlugin = $this->plugin('currentUserPlugin');
330
        $currentUser = $currentUserPlugin->getUser();
331
        $currentCompany = $currentUserPlugin->getCompany();
332
 
333
        $request = $this->getRequest();
334
        $uuid = $this->params()->fromRoute('id');
335
 
336
        if (!$uuid) {
337
            $data = [
338
                'success'   => false,
339
                'data'   => 'ERROR_INVALID_PARAMETER'
340
            ];
341
 
342
            return new JsonModel($data);
343
        }
344
 
345
        $mediaCategoryMapper = MediaCategoryMapper::getInstance($this->adapter);
346
        $mediaCategory = $mediaCategoryMapper->fetchOneByUuid($uuid);
347
        if (!$mediaCategory) {
348
            $data = [
349
                'success'   => false,
350
                'data'   => 'ERROR_RECORD_NOT_FOUND'
351
            ];
352
 
353
            return new JsonModel($data);
354
        }
17251 ariadna 355
 
356
 
357
        if ($mediaCategory->company_id != $currentCompany->id) {
17002 efrain 358
            return new JsonModel([
359
                'success' => false,
360
                'data' => 'ERROR_UNAUTHORIZED'
361
            ]);
362
        }
363
 
17251 ariadna 364
 
17002 efrain 365
        if ($request->isPost()) {
17251 ariadna 366
 
17002 efrain 367
            $mediaFileMapper = \LeadersLinked\Mapper\MediaFileMapper::getInstance($this->adapter);
368
            $total = $mediaFileMapper->fetchTotalCountByCategoryid($mediaCategory->id);
17251 ariadna 369
 
370
            if ($total > 0) {
17002 efrain 371
                return new JsonModel([
372
                    'success' => false,
373
                    'data' => 'ERROR_SQL_CANNOT_DELETE_OR_UPDATE_A_PARENT_ROW'
374
                ]);
375
            }
17251 ariadna 376
 
377
 
378
 
17002 efrain 379
            $result = $mediaCategoryMapper->delete($mediaCategory);
380
            if ($result) {
381
                $this->logger->info('Se borro la categoría de media ' . $mediaCategory->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
382
 
383
                $data = [
384
                    'success' => true,
385
                    'data' => 'LABEL_RECORD_DELETED'
386
                ];
387
            } else {
388
 
389
                $data = [
390
                    'success'   => false,
391
                    'data'      => $mediaCategoryMapper->getError()
392
                ];
393
 
394
                return new JsonModel($data);
395
            }
396
        } else {
397
            $data = [
398
                'success' => false,
399
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
400
            ];
401
 
402
            return new JsonModel($data);
403
        }
404
 
405
        return new JsonModel($data);
406
    }
407
}