Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
12260 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\MyTrainerCategoriesMapper;
15
use LeadersLinked\Mapper\TopicMapper;
16
use LeadersLinked\Mapper\FeedTopicMapper;
17
use LeadersLinked\Mapper\MyTrainerQuestionsMapper;
12652 eleazar 18
use LeadersLinked\Mapper\QueryMapper;
12260 eleazar 19
use LeadersLinked\Mapper\FeedMapper;
20
use LeadersLinked\Form\MyTrainerQuestionForm;
21
use LeadersLinked\Form\CreateFeedForm;
22
use LeadersLinked\Model\MyTrainerQuestions;
23
use LeadersLinked\Model\FeedTopic;
24
use LeadersLinked\Model\Feed;
25
use LeadersLinked\Model\Topic;
26
use LeadersLinked\Mapper\CompanyMapper;
27
use LeadersLinked\Model\Company;
28
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
29
 
12286 eleazar 30
class MyTrainerQuestionViewController extends AbstractActionController {
12260 eleazar 31
 
32
    /**
33
     *
34
     * @var AdapterInterface
35
     */
36
    private $adapter;
37
 
38
    /**
39
     *
40
     * @var AbstractAdapter
41
     */
42
    private $cache;
43
 
44
    /**
45
     *
46
     * @var  LoggerInterface
47
     */
48
    private $logger;
49
 
50
    /**
51
     *
52
     * @var array
53
     */
54
    private $config;
55
 
56
    /**
57
     *
58
     * @param AdapterInterface $adapter
59
     * @param AbstractAdapter $cache
60
     * @param LoggerInterface $logger
61
     * @param array $config
62
     */
63
    public function __construct($adapter, $cache, $logger, $config) {
64
        $this->adapter = $adapter;
65
        $this->cache = $cache;
66
        $this->logger = $logger;
67
        $this->config = $config;
68
    }
69
 
70
    public function indexAction() {
71
        $request = $this->getRequest();
72
        $currentUserPlugin = $this->plugin('currentUserPlugin');
73
        $currentCompany = $currentUserPlugin->getCompany();
74
        $currentUser = $currentUserPlugin->getUser();
75
 
76
        $id =  $this->params()->fromRoute('id');
77
 
78
 
79
        $request = $this->getRequest();
80
 
81
 
82
        if($request->isGet()) {
83
            $headers  = $request->getHeaders();
84
 
85
            $isJson = false;
86
            if($headers->has('Accept')) {
87
                $accept = $headers->get('Accept');
88
 
89
                $prioritized = $accept->getPrioritized();
90
 
91
                foreach($prioritized as $key => $value) {
92
                    $raw = trim($value->getRaw());
93
 
94
                    if(!$isJson) {
95
                        $isJson = strpos($raw, 'json');
96
                    }
97
 
98
                }
99
            }
100
 
12296 eleazar 101
                $topicMapper = TopicMapper::getInstance($this->adapter);
102
                $topic = $topicMapper->fetchOneByUUid($id);
103
 
104
                $topicsMapper = FeedTopicMapper::getInstance($this->adapter);
12299 eleazar 105
                $feedTopics = $topicsMapper->fetchAllByTopicId($topic->id);
12648 eleazar 106
 
12651 eleazar 107
                $queryMapper = QueryMapper::getInstance($this->adapter);
108
                $sql = $queryMapper->getSql();
109
                $select = $sql->select();
110
                $select->columns(['uuid', 'title', 'description', 'added_on']);
111
                $select->from(['i' => FeedMapper::_TABLE]);
112
                $select->join(['c' => FeedTopicMapper::_TABLE], "i.id = c.feed_id");
113
                $select->where->equalTo('i.status', Feed::STATUS_PUBLISHED);
114
                $select->where->equalTo('c.topic_id', $topic->id);
12654 eleazar 115
                $select->getSqlString($this->adapter->platform);
12651 eleazar 116
 
12664 eleazar 117
 
12260 eleazar 118
 
12296 eleazar 119
                foreach ($feedTopics as $feed) {
120
                    $questionsMapper = FeedMapper::getInstance($this->adapter);
12648 eleazar 121
                    $questions [] = $questionsMapper->fetchOne($feed->feed_id);
12296 eleazar 122
                }
12260 eleazar 123
 
12364 eleazar 124
                $topics = [];
125
                foreach ($questions as $question) {
12629 eleazar 126
                    $topicRelationships = $topicsMapper->fetchAllByFeedId($question->id);
12364 eleazar 127
                    $question->topics = [];
12260 eleazar 128
 
12364 eleazar 129
 
130
                    foreach ($topicRelationships as $rel) {
131
                        $topic = $topicMapper->fetchOne($rel->topic_id);
132
                        if ($topic) {
133
                            $question->topics []= $topic;
134
                        }
135
                    }
136
 
137
                }
138
 
12296 eleazar 139
 
12260 eleazar 140
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
141
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/add');
142
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/edit');
143
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/delete');
144
                $allowAnswer = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/answer');
145
                $page = $this->params()->fromQuery('page', 1);
146
                $perpage = $this->params()->fromQuery('perpage', 20);
147
 
148
                $form = new CreateFeedForm($this->adapter);
12296 eleazar 149
 
12260 eleazar 150
 
151
                $viewModel = new ViewModel();
152
                $this->layout()->setTemplate('layout/layout-backend');
12278 eleazar 153
                $viewModel->setTemplate('leaders-linked/my-trainer-question-view/index.phtml');
12260 eleazar 154
                $viewModel->setVariables([
155
                    'form' => $form,
12297 eleazar 156
                    'id' => $id,
12260 eleazar 157
                    'page' => $page,
158
                    'perpage' => $perpage,
159
                    'questions' => $questions,
160
                    // 'categories' => $categories
161
                ]);
162
                return $viewModel;
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
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
175
        $currentCompany     = $currentUserPlugin->getCompany();
176
        $currentUser        = $currentUserPlugin->getUser();
177
 
178
        $request    = $this->getRequest();
179
        try{
180
        if($request->isPost()) {
181
            $form = new  CreateFeedForm($this->adapter);
182
            $dataPost = $request->getPost()->toArray();
183
            $categoriesId = $dataPost['category_id'] ?? [];
184
            // return new JsonModel([
185
            //     'success' => false,
186
            //     'data' => $categoriesId
187
            // ]);
188
            $dataPost['category_id'] = null;
189
            $form->setData($dataPost);
190
 
191
            if($form->isValid()) {
192
 
193
                $dataPost = (array) $form->getData();
194
                $hydrator = new ObjectPropertyHydrator();
195
                $feed = new Feed();
196
                $hydrator->hydrate($dataPost, $feed);
197
 
198
                $feed->user_id = $currentUser->id;
199
                $feed->company_id = $currentCompany->id;
200
                $feed->user_id          = $currentUser->id;
201
                $feed->type             = Feed::TYPE_MYT_QUESTION;
202
                $feed->posted_or_shared = Feed::POSTED;
203
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
204
                $feed->total_comments   = 0;
205
                $feed->total_shared     = 0;
206
 
207
                $feedMapper = FeedMapper::getInstance($this->adapter);
208
 
209
                if($feedMapper->insert($feed)) {
210
                     $feed = $feedMapper->fetchOne($feed->id);
211
 
212
                     $category = new FeedTopic();
213
 
214
                    if(!empty($categoriesId)){
215
                       // print_r($dataPost['job_description_id']);
216
 
217
                        $categoriesMapper = TopicMapper::getInstance($this->adapter);
218
                        $feedTopicMapper = FeedTopicMapper::getInstance($this->adapter);
219
 
220
                        $ok = true;
221
 
222
                        foreach($categoriesId as $category_id) {
223
 
224
                           // echo '$jobDescriptionUuid = ' . $jobDescriptionUuid ;
225
 
226
 
227
                            $category = $categoriesMapper->fetchOneByUuidOrTitle($category_id);
228
                            if(!$category){
229
                                $category = new Topic;
230
                                $category->title = $category_id;
231
                                $category->type='myt';
232
                                $categoriesMapper->insert($category);
233
                            }
234
 
235
                            $record = new FeedTopic();
236
                            $record->topic_id = $category->id;
237
                            $record->feed_id = $feed->id;
238
                            $result = $feedTopicMapper->insert($record);
239
                            $ok = $ok && $result;
240
                        }
241
                    }
242
 
243
                     $feed->related_feed = $feed->id;
244
                     $feedMapper->update($feed);
245
                    $this->logger->info('Se agrego la pregunta ' . $feed->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
246
 
247
                    $data = [
248
                        'success'   => true,
249
                        'data'   => 'LABEL_RECORD_ADDED'
250
                    ];
251
                } else {
252
                    $data = [
253
                        'success'   => false,
254
                        'data'      => $feedMapper->getError()
255
                    ];
256
 
257
                }
258
 
259
                return new JsonModel($data);
260
 
261
            } else {
262
                $messages = [];
263
                $form_messages = (array) $form->getMessages();
264
                foreach($form_messages  as $fieldname => $field_messages)
265
                {
266
 
267
                    $messages[$fieldname] = array_values($field_messages);
268
                }
269
 
270
            }
271
 
272
        } else {
273
            $data = [
274
                'success' => false,
275
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
276
            ];
277
 
278
            return new JsonModel($data);
279
        }
280
 
281
    } catch (\Throwable $e) {
282
        $e->getMessage();
283
        return new JsonModel([
284
            'success' => false,
285
            'data' => $e
286
        ]);
287
    }
288
    }
289
 
290
 
291
 
292
    public function deleteAction() {
293
        $currentUserPlugin = $this->plugin('currentUserPlugin');
294
        $currentUser = $currentUserPlugin->getUser();
295
        $currentCompany = $currentUserPlugin->getCompany();
296
 
297
        $request = $this->getRequest();
298
        if($request->isPost()) {
299
 
300
 
301
            $id =  $this->params()->fromRoute('id');
302
 
303
            $feedMapper = FeedMapper::getInstance($this->adapter);
304
            $feed = $feedMapper->fetchOneByUuid($id);
305
            if(!$feed) {
306
                $response = [
307
                    'success' => false,
308
                    'data' => 'ERROR_POST_NOT_FOUND'
309
                ];
310
                return new JsonModel($response);
311
            }
312
 
313
            if($feed->company_id != $currentCompany->id) {
314
                $response = [
315
                    'success' => false,
316
                    'data' => 'ERROR_UNAUTHORIZED'
317
                ];
318
                return new JsonModel($response);
319
            }
320
 
321
            $feedMapper = FeedMapper::getInstance($this->adapter);
322
            $feed->status = Feed::STATUS_DELETED;
323
            if($feedMapper->update($feed)) {
324
                $response = [
325
                    'success' => true,
326
                    'data' => 'LABEL_FEED_WAS_DELETED'
327
                ];
328
 
329
            } else {
330
                $response = [
331
                    'success' => false,
332
                    'data' => $feedMapper->getError()
333
                ];
334
            }
335
 
336
 
337
            return new JsonModel($response);
338
 
339
        } else {
340
            $response = [
341
                'success' => false,
342
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
343
            ];
344
        }
345
 
346
        return new JsonModel($response);
347
 
348
    }
349
}