Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 15077 | Ir a la última revisión | | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
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\Library\Functions;
13
use LeadersLinked\Mapper\PostMapper;
14
use LeadersLinked\Form\PostCreateForm;
15
use LeadersLinked\Form\PostEditForm;
16
use LeadersLinked\Model\Post;
17
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
18
use LeadersLinked\Library\Image;
19
 
20
class PostController extends AbstractActionController
21
{
22
    /**
23
     *
24
     * @var AdapterInterface
25
     */
26
    private $adapter;
27
 
28
 
29
    /**
30
     *
31
     * @var AbstractAdapter
32
     */
33
    private $cache;
34
 
35
    /**
36
     *
37
     * @var  LoggerInterface
38
     */
39
    private $logger;
40
 
41
 
42
    /**
43
     *
44
     * @var array
45
     */
46
    private $config;
47
 
48
    /**
49
     *
50
     * @param AdapterInterface $adapter
51
     * @param AbstractAdapter $cache
52
     * @param LoggerInterface $logger
53
     * @param array $config
54
     */
55
    public function __construct($adapter, $cache , $logger, $config)
56
    {
57
        $this->adapter      = $adapter;
58
        $this->cache        = $cache;
59
        $this->logger       = $logger;
60
        $this->config       = $config;
61
 
62
    }
63
 
64
    public function indexAction()
65
    {
66
        $request = $this->getRequest();
67
 
68
        $request = $this->getRequest();
69
        if($request->isGet()) {
70
 
71
 
72
            $headers  = $request->getHeaders();
73
 
74
            $isJson = false;
75
            if($headers->has('Accept')) {
76
                $accept = $headers->get('Accept');
77
 
78
                $prioritized = $accept->getPrioritized();
79
 
80
                foreach($prioritized as $key => $value) {
81
                    $raw = trim($value->getRaw());
82
 
83
                    if(!$isJson) {
84
                        $isJson = strpos($raw, 'json');
85
                    }
86
 
87
                }
88
            }
89
 
90
            if($isJson) {
91
 
92
                if($this->config['leaderslinked.runmode.sandbox']) {
93
                    $url_frontend = $this->config['leaderslinked.frontend.sandbox_post'];
94
                } else {
95
                    $url_frontend = $this->config['leaderslinked.frontend.production_post'];
96
                }
97
 
98
 
99
 
100
                $search = $this->params()->fromQuery('search', []);
101
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
102
 
103
                $page               = intval($this->params()->fromQuery('start', 1), 10);
104
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
105
                $order =  $this->params()->fromQuery('order', []);
106
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
107
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var( $order[0]['dir'], FILTER_SANITIZE_STRING));
108
 
109
                $fields =  ['title', 'date'];
110
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
111
 
112
                if(!in_array($order_direction, ['ASC', 'DESC'])) {
113
                    $order_direction = 'ASC';
114
                }
115
 
116
                $postMapper = PostMapper::getInstance($this->adapter);
117
                $paginator = $postMapper->fetchAllDataTable($search, $page, $records_x_page, $order_field, $order_direction);
118
 
119
                $items = [];
120
                $records = $paginator->getCurrentItems();
121
                foreach($records as $record)
122
                {
123
                    $dt = \DateTime::createFromFormat('Y-m-d', $record->date);
124
 
125
                    $item = [
126
                        'title' => $record->title,
127
                        'active' => $record->status ,
128
                        'date' => $dt->format('d/m/Y'),
129
                        'actions' => [
130
                            'link_edit' => $this->url()->fromRoute('publications/posts/edit', ['id' => $record->uuid ]),
131
                            'link_delete' => $this->url()->fromRoute('publications/posts/delete', ['id' => $record->uuid ]),
132
                            'link_view' => str_replace('[uuid]', $record->uuid, $url_frontend),
133
                        ]
134
                    ];
135
 
136
                    array_push($items, $item);
137
                }
138
 
139
                return new JsonModel([
140
                    'success' => true,
141
                    'data' => [
142
                        'items' => $items,
143
                        'total' => $paginator->getTotalItemCount(),
144
                    ]
145
                ]);
146
            } else  {
147
                $image_size = $this->config['leaderslinked.image_sizes.post'];
148
 
149
                $formAdd = new PostCreateForm();
150
                $formEdit = new PostEditForm();
151
 
152
                $this->layout()->setTemplate('layout/layout-backend');
153
                $viewModel = new ViewModel();
154
                $viewModel->setTemplate('leaders-linked/posts/index.phtml');
155
                $viewModel->setVariables([
156
                    'formAdd' => $formAdd,
157
                    'formEdit' => $formEdit,
158
                    'image_size' => $image_size,
159
 
160
                ]);
161
                return $viewModel ;
162
            }
163
        } else {
164
            return new JsonModel([
165
                'success' => false,
166
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
167
            ]);;
168
        }
169
    }
170
 
171
 
172
 
173
    public function addAction()
174
    {
175
 
176
        $currentUserPlugin = $this->plugin('currentUserPlugin');
177
        $currentUser = $currentUserPlugin->getUser();
178
 
179
        $request    = $this->getRequest();
180
        if($request->isPost()) {
181
 
182
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
183
            $dataPost['status'] = empty($dataPost['status']) ? Post::STATUS_INACTIVE : $dataPost['status'];
184
 
185
 
186
            $form = new PostCreateForm();
187
            $form->setData($dataPost);
188
 
189
            if($form->isValid()) {
190
                $dataPost = (array) $form->getData();
191
 
192
                $hydrator = new ObjectPropertyHydrator();
193
                $post = new Post();
194
                $hydrator->hydrate($dataPost, $post);
195
 
196
 
197
                $dt = \DateTime::createFromFormat('d/m/Y', $post->date);
198
                $post->date = $dt->format('Y-m-d');
199
 
200
                $post->image = '';
201
                $post->file  = '';
202
 
203
 
204
                $postMapper = PostMapper::getInstance($this->adapter);
205
                if($postMapper->insert($post)) {
206
                    $post = $postMapper->fetchOne($post->id);
207
 
208
 
209
                    $files = $this->getRequest()->getFiles()->toArray();
210
 
211
                    $target_path = $this->config['leaderslinked.fullpath.post'] .  $post->uuid;
212
                    if(!file_exists($target_path)) {
213
                        mkdir($target_path, 0755, true);
214
                    }
215
 
216
 
217
                    if(isset($files['file']) && empty($files['file']['error'])) {
218
                        $tmp_filename       = $files['file']['tmp_name'];
219
                        $original_filename  = trim(strtolower($files['file']['name']));
220
 
221
                        $original_filename = Functions::normalizeString($original_filename);
222
 
223
                        $parts = explode('.', $original_filename);
224
                        $original_filename = $parts[0] . '.' . $parts[ count($parts) - 1 ];
225
 
226
                        try
227
                        {
228
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR .$original_filename;
229
                            if(move_uploaded_file($tmp_filename, $full_filename)) {
230
                                $post->file = basename($full_filename);
231
                                $post->update($post);
232
                            }
233
                        } catch(\Throwable $e) {
234
                            error_log($e->getTraceAsString());
235
                        }
236
                    }
237
 
238
                    if(isset($files['image']) && empty($files['image']['error'])) {
239
                        $tmp_filename  = $files['image']['tmp_name'];
240
 
241
                        try {
242
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.post']);
243
 
244
                            $filename = 'image-' .uniqid() . '.png';
245
                            $crop_to_dimensions = true;
246
                            if(Image::uploadImage($tmp_filename, $target_path, $filename, $target_width, $target_height, $crop_to_dimensions)) {
247
                                $post->image = $filename;
248
                                $postMapper->update($post);
249
                            }
250
                        } catch(\Throwable $e) {
251
                            error_log($e->getTraceAsString());
252
                        }
253
                    }
254
 
255
                    $this->logger->info('Se agrego la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
256
 
257
                    $data = [
258
                        'success'   => true,
259
                        'data'   => 'LABEL_RECORD_ADDED'
260
                    ];
261
                } else {
262
                    $data = [
263
                        'success'   => false,
264
                        'data'      => $postMapper->getError()
265
                    ];
266
 
267
                }
268
 
269
                return new JsonModel($data);
270
 
271
            } else {
272
                $messages = [];
273
                $form_messages = (array) $form->getMessages();
274
                foreach($form_messages  as $fieldname => $field_messages)
275
                {
276
 
277
                    $messages[$fieldname] = array_values($field_messages);
278
                }
279
 
280
                return new JsonModel([
281
                    'success'   => false,
282
                    'data'   => $messages
283
                ]);
284
            }
285
 
286
        } else {
287
            $data = [
288
                'success' => false,
289
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
290
            ];
291
 
292
            return new JsonModel($data);
293
        }
294
 
295
        return new JsonModel($data);
296
    }
297
 
298
    /**
299
     *
300
     * Borrar un perfil excepto el público
301
     * @return \Laminas\View\Model\JsonModel
302
     */
303
    public function deleteAction()
304
    {
305
        $currentUserPlugin = $this->plugin('currentUserPlugin');
306
        $currentUser = $currentUserPlugin->getUser();
307
 
308
        $request    = $this->getRequest();
309
        $id = $this->params()->fromRoute('id');
310
 
311
 
312
 
313
        $postMapper = PostMapper::getInstance($this->adapter);
314
        $post = $postMapper->fetchOneByUuid($id);
315
 
316
        if(!$post) {
317
            return new JsonModel([
318
                'success' => false,
319
                'data' => 'ERROR_POST_NOT_FOUND'
320
            ]);
321
 
322
        }
323
 
324
 
325
        if($request->isPost()) {
326
 
327
            $post->status = Post::STATUS_DELETE;
328
 
329
            $result =  $postMapper->update($post);
330
            if($result) {
331
                $this->logger->info('Se borro la noticia : ' .  $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
332
 
333
 
334
                $data = [
335
                    'success' => true,
336
                    'data' => 'LABEL_POST_DELETED'
337
                ];
338
            } else {
339
 
340
                $data = [
341
                    'success'   => false,
342
                    'data'      => $postMapper->getError()
343
                ];
344
 
345
                return new JsonModel($data);
346
            }
347
 
348
        } else {
349
            $data = [
350
                'success' => false,
351
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
352
            ];
353
 
354
            return new JsonModel($data);
355
        }
356
 
357
        return new JsonModel($data);
358
    }
359
 
360
 
361
    public function editAction()
362
    {
363
        $currentUserPlugin = $this->plugin('currentUserPlugin');
364
        $currentUser = $currentUserPlugin->getUser();
365
 
366
        $request    = $this->getRequest();
367
        $id = $this->params()->fromRoute('id');
368
 
369
        $postMapper = PostMapper::getInstance($this->adapter);
370
        $post = $postMapper->fetchOneByUuid($id);
371
 
372
        if(!$post) {
373
            return new JsonModel([
374
                'success' => false,
375
                'data' => 'ERROR_POST_NOT_FOUND'
376
            ]);
377
 
378
        }
379
 
380
 
381
        if($request->isGet()) {
382
 
383
            $dt = \DateTime::createFromFormat('Y-m-d', $post->date);
384
 
385
            $data = [
386
                'success' => true,
387
                'data' => [
388
                    'title' => $post->title,
389
                    'status' => $post->status,
390
                    'description' => $post->description,
391
                    'url' => $post->url,
392
                    'date' => $dt->format('d/m/Y'),
393
                ]
394
            ];
395
 
396
            return new JsonModel($data);
397
        }
398
        else if($request->isPost()) {
399
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
400
            $dataPost['status'] = empty($dataPost['status']) ? Post::STATUS_INACTIVE : $dataPost['status'];
401
 
402
            $form = new PostEditForm();
403
            $form->setData($dataPost);
404
 
405
            if($form->isValid()) {
406
                $dataPost = (array) $form->getData();
407
                $hydrator = new ObjectPropertyHydrator();
408
                $hydrator->hydrate($dataPost, $post);
409
 
410
 
411
                $dt = \DateTime::createFromFormat('d/m/Y', $post->date);
412
                $post->date = $dt->format('Y-m-d');
413
 
414
 
415
                $files = $this->getRequest()->getFiles()->toArray();
416
 
417
                $target_path = $this->config['leaderslinked.fullpath.post'] .  $post->uuid;
418
                if(!file_exists($target_path)) {
419
                    mkdir($target_path, 0755, true);
420
                }
421
 
422
 
423
                if(isset($files['file']) && empty($files['file']['error'])) {
424
 
425
                    if($post->file) {
426
                        Functions::deleteFilename($target_path, $post->file);
427
                    }
428
 
429
 
430
                    $tmp_filename       = $files['file']['tmp_name'];
431
                    $original_filename  = trim(strtolower($files['file']['name']));
432
 
433
                    $original_filename = Functions::normalizeString($original_filename);
434
 
435
                    $parts = explode('.', $original_filename);
436
                    $original_filename = $parts[0] . '.' . $parts[ count($parts) - 1 ];
437
 
438
                    try
439
                    {
440
                        $full_filename = $target_path  . DIRECTORY_SEPARATOR .$original_filename;
441
                        if(move_uploaded_file($tmp_filename, $full_filename)) {
442
                            $post->file = basename($full_filename);
443
                            $post->update($post);
444
                        }
445
                    } catch(\Throwable $e) {
446
                        error_log($e->getTraceAsString());
447
                    }
448
                }
449
 
450
                if(isset($files['image']) && empty($files['image']['error'])) {
451
 
452
                    if($post->image) {
453
                        Functions::deleteFilename($target_path, $post->image);
454
                    }
455
 
456
 
457
                    $tmp_filename  = $files['image']['tmp_name'];
458
 
459
                    try {
460
                        list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.post']);
461
 
462
                        $filename = 'image-' .uniqid() . '.png';
463
                        $crop_to_dimensions = true;
464
                        if(Image::uploadImage($tmp_filename, $target_path, $filename, $target_width, $target_height, $crop_to_dimensions)) {
465
                            $post->image = $filename;
466
                            $postMapper->update($post);
467
                        }
468
                    } catch(\Throwable $e) {
469
                        error_log($e->getTraceAsString());
470
                    }
471
                }
472
 
473
 
474
                if($postMapper->update($post)) {
475
                    $this->logger->info('Se edito la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
476
 
477
                    $data = [
478
                        'success'   => true,
479
                        'data'   => 'LABEL_RECORD_UPDATED'
480
                    ];
481
                } else {
482
                    $data = [
483
                        'success'   => false,
484
                        'data'      => $postMapper->getError()
485
                    ];
486
 
487
                }
488
 
489
                return new JsonModel($data);
490
 
491
            } else {
492
                $messages = [];
493
                $form_messages = (array) $form->getMessages();
494
                foreach($form_messages  as $fieldname => $field_messages)
495
                {
496
 
497
                    $messages[$fieldname] = array_values($field_messages);
498
                }
499
 
500
                return new JsonModel([
501
                    'success'   => false,
502
                    'data'   => $messages
503
                ]);
504
            }
505
        } else {
506
            $data = [
507
                'success' => false,
508
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
509
            ];
510
 
511
            return new JsonModel($data);
512
        }
513
 
514
        return new JsonModel($data);
515
    }
516
 
517
 
518
}