Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
13304 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\FeedMapper;
15
use LeadersLinked\Mapper\TopicMapper;
16
use LeadersLinked\Mapper\QueryMapper;
17
use Laminas\Paginator\Adapter\DbSelect;
18
use Laminas\Paginator\Paginator;
19
use LeadersLinked\Form\CreateFeedForm;
20
use LeadersLinked\Form\TopicForm;
21
use Laminas\Hydrator\ArraySerializableHydrator;
22
use Laminas\Db\ResultSet\HydratingResultSet;
23
use LeadersLinked\Model\Feed;
24
use LeadersLinked\Model\Topic;
25
use LeadersLinked\Mapper\CompanyMapper;
26
use LeadersLinked\Model\Company;
27
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
28
 
29
class DevelopmentContentController extends AbstractActionController {
30
 
31
    /**
32
     *
33
     * @var AdapterInterface
34
     */
35
    private $adapter;
36
 
37
    /**
38
     *
39
     * @var AbstractAdapter
40
     */
41
    private $cache;
42
 
43
    /**
44
     *
45
     * @var  LoggerInterface
46
     */
47
    private $logger;
48
 
49
    /**
50
     *
51
     * @var array
52
     */
53
    private $config;
54
 
55
    /**
56
     *
57
     * @param AdapterInterface $adapter
58
     * @param AbstractAdapter $cache
59
     * @param LoggerInterface $logger
60
     * @param array $config
61
     */
62
    public function __construct($adapter, $cache, $logger, $config) {
63
        $this->adapter = $adapter;
64
        $this->cache = $cache;
65
        $this->logger = $logger;
66
        $this->config = $config;
67
    }
68
 
69
    public function indexAction() {
70
        $request = $this->getRequest();
71
        $currentUserPlugin = $this->plugin('currentUserPlugin');
72
        $currentCompany = $currentUserPlugin->getCompany();
73
        $currentUser = $currentUserPlugin->getUser();
74
 
75
        try{
76
        $request = $this->getRequest();
77
        if ($request->isGet()) {
78
 
79
            $headers = $request->getHeaders();
80
 
81
            $isJson = false;
82
            if ($headers->has('Accept')) {
83
                $accept = $headers->get('Accept');
84
 
85
                $prioritized = $accept->getPrioritized();
86
 
87
                foreach ($prioritized as $key => $value) {
88
                    $raw = trim($value->getRaw());
89
 
90
                    if (!$isJson) {
91
                        $isJson = strpos($raw, 'json');
92
                    }
93
                }
94
            }
95
 
96
            if ($isJson) {
97
                $search = $this->params()->fromQuery('search', []);
98
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
99
 
100
                $page = intval($this->params()->fromQuery('start', 1), 10);
101
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
102
                $order = $this->params()->fromQuery('order', []);
103
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
104
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
105
 
106
                $fields = ['title'];
107
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
108
 
109
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
110
                    $order_direction = 'ASC';
111
                }
112
 
113
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
13472 eleazar 114
 
13304 eleazar 115
                $items = [];
116
                $feedMapper = FeedMapper::getInstance($this->adapter);
117
 
118
                $paginator = $feedMapper->fetchAllByDevelop();
119
 
120
 
121
                foreach ($paginator as $record) {
122
 
123
                    $item = [
124
                        'id' => $record->id,
125
                        'title' => $record->title,
126
                        'description' => $record->description,
127
                        'status' => $record->status,
13472 eleazar 128
 
13304 eleazar 129
                    ];
130
 
131
                    array_push($items, $item);
132
                }
133
 
134
                return new JsonModel([
135
                    'success' => true,
136
                    'data' => [
137
                        'items' => $items,
138
                    ]
139
                ]);
140
            } else {
141
 
142
                $form = new CreateFeedForm($this->adapter, $currentCompany->id);
143
 
144
                $this->layout()->setTemplate('layout/layout-backend');
145
                $viewModel = new ViewModel();
13309 eleazar 146
                $viewModel->setTemplate('leaders-linked/development-content/index.phtml');
13304 eleazar 147
                $viewModel->setVariable('form', $form);
148
                return $viewModel;
149
            }
150
        } else {
151
            return new JsonModel([
152
                'success' => false,
153
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
154
            ]);
155
        }
156
    } catch (\Throwable $e) {
157
            $e->getMessage();
158
            return new JsonModel([
159
                'success' => false,
160
                'data' => $e
161
            ]);
162
        }
163
    }
164
 
165
    public function addAction() {
166
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
167
        $currentCompany     = $currentUserPlugin->getCompany();
168
        $currentUser        = $currentUserPlugin->getUser();
169
 
170
        $id =  $this->params()->fromRoute('id');
171
        $uncuratedMapper = FeedMapper::getInstance($this->adapter);
172
        $uncurated = $uncuratedMapper->fetchOneByUuid($id);
173
        $request    = $this->getRequest();
174
        try{
175
        if($request->isPost()) {
176
            $form = new  CreateFeedForm($this->adapter);
177
 
178
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
179
            $categoriesId = $dataPost['category_id'] ?? [];
180
            $dataPost['category_id'] = null;
181
            $form->setData($dataPost);
182
 
183
            if($form->isValid()) {
184
 
185
                $dataPost = (array) $form->getData();
186
                $hydrator = new ObjectPropertyHydrator();
187
                $feed = new Feed();
188
                $hydrator->hydrate($dataPost, $feed);
189
 
190
                $feed->user_id = $currentUser->id;
191
                $feed->company_id = $currentCompany->id;
192
                $feed->user_id          = $currentUser->id;
193
                $feed->status        = Feed::STATUS_SAVED;
194
                $feed->type             = Feed::TYPE_DC;
195
                $feed->posted_or_shared = Feed::POSTED;
196
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
197
                $feed->related_feed = $uncurated->id;
198
 
199
                $feed->total_comments   = 0;
200
                $feed->total_shared     = 0;
201
 
202
 
203
                $files = $this->getRequest()->getFiles()->toArray();
204
                $file_type = '';
205
                if(isset($files['file']) && empty($files['file']['error'])) {
206
                    $feed_tmp_filename  = $files['file']['tmp_name'];
207
                    $feed_filename      = $this->normalizeString($files['file']['name']);
208
 
209
                    $mime_type = mime_content_type($feed_tmp_filename);
210
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
211
                        $file_type = Feed::FILE_TYPE_IMAGE;
212
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
213
                        $file_type = Feed::FILE_TYPE_VIDEO;
214
                    } else if($mime_type == 'application/pdf') {
215
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
216
                    }
217
                }
218
 
219
                $feedMapper = FeedMapper::getInstance($this->adapter);
220
 
221
                if($feedMapper->insert($feed)) {
222
                    $feed = $feedMapper->fetchOne($feed->id);
223
                    $category = new FeedTopic();
224
                    $feedMapper->update($feed);
225
 
226
 
227
                        $feed = $feedMapper->fetchOne($feed->id);
228
 
229
                        if(!empty($categoriesId)){
230
                            // print_r($dataPost['job_description_id']);
231
 
232
                             $categoriesMapper = TopicMapper::getInstance($this->adapter);
233
                             $feedTopicMapper = FeedTopicMapper::getInstance($this->adapter);
234
 
235
                             $ok = true;
236
 
237
                             foreach($categoriesId as $category_id) {
238
 
239
                                // echo '$jobDescriptionUuid = ' . $jobDescriptionUuid ;
240
 
241
 
242
                                 $category = $categoriesMapper->fetchOneByUuidOrTitle($category_id);
243
                                 if(!$category){
244
                                     $category = new Topic;
245
                                     $category->title = $category_id;
246
                                     $category->type='dc';
247
                                     $categoriesMapper->insert($category);
248
                                 }
249
 
250
                                 $record = new FeedTopic();
251
                                 $record->topic_id = $category->id;
252
                                 $record->feed_id = $feed->id;
253
                                 $result = $feedTopicMapper->insert($record);
254
                                 $ok = $ok && $result;
255
                             }
256
                        }
257
 
258
                        if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
259
                            try {
260
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
261
                                if(!file_exists($target_path)) {
262
                                    mkdir($target_path, 0755);
263
                                }
264
 
265
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
266
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
267
                                if($result) {
268
 
269
                                    $feed->file_type = $file_type;
270
                                    $feed->file_name = basename($feed_filename);
271
                                    $feedMapper->update($feed);
272
                                } else {
273
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
274
                                }
275
                            } catch(\Throwable $e) {
276
                                error_log($e->getTraceAsString());
277
                            }
278
                        }
279
                        if( $file_type == Feed::FILE_TYPE_IMAGE) {
280
                            try {
281
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
282
                                if(!file_exists($target_path)) {
283
                                    mkdir($target_path, 0755);
284
                                }
285
 
286
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
287
 
288
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
289
                                $crop_to_dimensions = false;
290
                                if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
291
                                    $feed->file_type = $file_type;
292
                                    $feed->file_name = basename($feed_filename);
293
                                    $feedMapper->update($feed);
294
                                }
295
                            } catch(\Throwable $e) {
296
                                error_log($e->getTraceAsString());
297
                            }
298
                        }
299
                        if( $file_type == Feed::FILE_TYPE_VIDEO) {
300
                            try {
301
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
302
                                if(!file_exists($target_path)) {
303
                                    mkdir($target_path, 0755);
304
                                }
305
 
306
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
307
 
308
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
309
                                if($result) {
310
 
311
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
312
                                    $getFromSecound = 2;
313
 
314
                                    //extracción del cover
315
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
316
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
317
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
318
                                    exec($cmd);
319
 
320
 
321
                                    $feed->file_type = $file_type;
322
                                    $feed->file_name = basename($feed_filename);
323
                                    $feed->file_image_preview = basename($generateFile);
324
                                    $feedMapper->update($feed);
325
 
326
                                    $videoConvert = new VideoConvert();
327
                                    $videoConvert->filename = $full_filename;
328
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
329
 
330
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
331
                                    $videoConvertMapper->insert($videoConvert);
332
                                } else {
333
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
334
                                }
335
                            } catch(\Throwable $e) {
336
                                error_log($e->getTraceAsString());
337
                            }
338
                        }
339
 
340
 
341
                        $response = [
342
                            'success'   => true,
343
                            'data'   => 'success'
344
                        ];
345
                } else {
346
                    $messages = [];
347
                    $form_messages = (array) $form->getMessages();
348
                    foreach($form_messages  as $fieldname => $field_messages)
349
                    {
350
                        $messages[$fieldname] = array_values($field_messages);
351
                    }
352
 
353
                }
354
 
355
            } else {
356
                $response = [
357
                    'success' => false,
358
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
359
                ];
360
            }
361
 
362
            return new JsonModel($response);
363
        }
364
 
365
    } catch (\Throwable $e) {
366
        $e->getMessage();
367
        return new JsonModel([
368
            'success' => false,
369
            'data' => $e
370
        ]);
371
    }
372
}
373
 
374
    public function deleteAction() {
375
        $currentUserPlugin = $this->plugin('currentUserPlugin');
376
        $currentUser = $currentUserPlugin->getUser();
377
        $currentCompany = $currentUserPlugin->getCompany();
378
 
379
        $request = $this->getRequest();
380
        if($request->isPost()) {
381
 
382
 
383
            $id =  $this->params()->fromRoute('id');
384
 
385
            $feedMapper = FeedMapper::getInstance($this->adapter);
386
            $feed = $feedMapper->fetchOneByUuid($id);
387
            if(!$feed) {
388
                $response = [
389
                    'success' => false,
390
                    'data' => 'ERROR_POST_NOT_FOUND'
391
                ];
392
                return new JsonModel($response);
393
            }
394
 
395
            if($feed->company_id != $currentCompany->id) {
396
                $response = [
397
                    'success' => false,
398
                    'data' => 'ERROR_UNAUTHORIZED'
399
                ];
400
                return new JsonModel($response);
401
            }
402
 
403
            $feedMapper = FeedMapper::getInstance($this->adapter);
404
            $feed->status = Feed::STATUS_DELETED;
405
            if($feedMapper->update($feed)) {
406
                $response = [
407
                    'success' => true,
408
                    'data' => 'LABEL_FEED_WAS_DELETED'
409
                ];
410
 
411
            } else {
412
                $response = [
413
                    'success' => false,
414
                    'data' => $feedMapper->getError()
415
                ];
416
            }
417
 
418
 
419
            return new JsonModel($response);
420
 
421
        } else {
422
            $response = [
423
                'success' => false,
424
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
425
            ];
426
        }
427
 
428
        return new JsonModel($response);
429
 
430
    }
431
}