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;
18
use LeadersLinked\Mapper\FeedMapper;
19
use LeadersLinked\Form\MyTrainerQuestionForm;
20
use LeadersLinked\Form\CreateFeedForm;
21
use LeadersLinked\Model\MyTrainerQuestions;
22
use LeadersLinked\Model\FeedTopic;
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 MyTrainerQuestionController 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
        $id =  $this->params()->fromRoute('id');
76
 
77
 
78
        $request = $this->getRequest();
79
 
80
 
81
        if($request->isGet()) {
82
            $headers  = $request->getHeaders();
83
 
84
            $isJson = false;
85
            if($headers->has('Accept')) {
86
                $accept = $headers->get('Accept');
87
 
88
                $prioritized = $accept->getPrioritized();
89
 
90
                foreach($prioritized as $key => $value) {
91
                    $raw = trim($value->getRaw());
92
 
93
                    if(!$isJson) {
94
                        $isJson = strpos($raw, 'json');
95
                    }
96
 
97
                }
98
            }
99
 
100
                if($id){
101
                    $topicMapper = TopicMapper::getInstance($this->adapter);
102
                    $topic = $topicmapper->fetchOneByUUid($id);
103
 
104
                    $topicsMapper = FeedTopicMapper::getInstance($this->adapter);
105
                    $feedTopics = $topicsMapper->fetchAllByTopicid($topic->id);
106
                    return new JsonModel([
107
                        'success' => false,
108
                        'data' => $feedTopics
109
                    ]);
110
                    foreach ($questions as $question) {
111
                        $topicRelationships = $topicsMapper->fetchAllByFeedId($question->id);
112
                        $question->topics = [];
113
 
114
 
115
                        foreach ($topicRelationships as $rel) {
116
                            $topic = $topicMapper->fetchOne($rel->topic_id);
117
                            if ($topic) {
118
                                $question->topics []= $topic;
119
                            }
120
                        }
121
 
122
                    }
123
 
124
 
125
                }else{
126
 
127
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
128
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/add');
129
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/edit');
130
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/delete');
131
                $allowAnswer = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/answer');
132
                $page = $this->params()->fromQuery('page', 1);
133
                $perpage = $this->params()->fromQuery('perpage', 20);
134
 
135
                $form = new CreateFeedForm($this->adapter);
136
                $questionsMapper = FeedMapper::getInstance($this->adapter);
137
                $questions = $questionsMapper->fetchAllByMytQuestion();
138
                $topicMapper = TopicMapper::getInstance($this->adapter);
139
                $topicsMapper = FeedTopicMapper::getInstance($this->adapter);
140
                $topics = [];
141
                foreach ($questions as $question) {
142
                    $topicRelationships = $topicsMapper->fetchAllByFeedId($question->id);
143
                    $question->topics = [];
144
 
145
 
146
                    foreach ($topicRelationships as $rel) {
147
                        $topic = $topicMapper->fetchOne($rel->topic_id);
148
                        if ($topic) {
149
                            $question->topics []= $topic;
150
                        }
151
                    }
152
 
153
                }
154
                $topics [] = $question->topics;
155
 
156
            }
157
 
158
                $viewModel = new ViewModel();
159
                $this->layout()->setTemplate('layout/layout-backend');
160
                $viewModel->setTemplate('leaders-linked/my-trainer-question/index.phtml');
161
                $viewModel->setVariables([
162
                    'form' => $form,
163
                    'page' => $page,
164
                    'perpage' => $perpage,
165
                    'questions' => $questions,
166
                    // 'categories' => $categories
167
                ]);
168
                return $viewModel;
169
        } else {
170
            return new JsonModel([
171
                'success' => false,
172
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
173
            ]);
174
        }
175
 
176
 
177
    }
178
 
179
    public function addAction() {
180
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
181
        $currentCompany     = $currentUserPlugin->getCompany();
182
        $currentUser        = $currentUserPlugin->getUser();
183
 
184
        $request    = $this->getRequest();
185
        try{
186
        if($request->isPost()) {
187
            $form = new  CreateFeedForm($this->adapter);
188
            $dataPost = $request->getPost()->toArray();
189
            $categoriesId = $dataPost['category_id'] ?? [];
190
            // return new JsonModel([
191
            //     'success' => false,
192
            //     'data' => $categoriesId
193
            // ]);
194
            $dataPost['category_id'] = null;
195
            $form->setData($dataPost);
196
 
197
            if($form->isValid()) {
198
 
199
                $dataPost = (array) $form->getData();
200
                $hydrator = new ObjectPropertyHydrator();
201
                $feed = new Feed();
202
                $hydrator->hydrate($dataPost, $feed);
203
 
204
                $feed->user_id = $currentUser->id;
205
                $feed->company_id = $currentCompany->id;
206
                $feed->user_id          = $currentUser->id;
207
                $feed->type             = Feed::TYPE_MYT_QUESTION;
208
                $feed->posted_or_shared = Feed::POSTED;
209
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
210
                $feed->total_comments   = 0;
211
                $feed->total_shared     = 0;
212
 
213
                $feedMapper = FeedMapper::getInstance($this->adapter);
214
 
215
                if($feedMapper->insert($feed)) {
216
                     $feed = $feedMapper->fetchOne($feed->id);
217
 
218
                     $category = new FeedTopic();
219
 
220
                    if(!empty($categoriesId)){
221
                       // print_r($dataPost['job_description_id']);
222
 
223
                        $categoriesMapper = TopicMapper::getInstance($this->adapter);
224
                        $feedTopicMapper = FeedTopicMapper::getInstance($this->adapter);
225
 
226
                        $ok = true;
227
 
228
                        foreach($categoriesId as $category_id) {
229
 
230
                           // echo '$jobDescriptionUuid = ' . $jobDescriptionUuid ;
231
 
232
 
233
                            $category = $categoriesMapper->fetchOneByUuidOrTitle($category_id);
234
                            if(!$category){
235
                                $category = new Topic;
236
                                $category->title = $category_id;
237
                                $category->type='myt';
238
                                $categoriesMapper->insert($category);
239
                            }
240
 
241
                            $record = new FeedTopic();
242
                            $record->topic_id = $category->id;
243
                            $record->feed_id = $feed->id;
244
                            $result = $feedTopicMapper->insert($record);
245
                            $ok = $ok && $result;
246
                        }
247
                    }
248
 
249
                     $feed->related_feed = $feed->id;
250
                     $feedMapper->update($feed);
251
                    $this->logger->info('Se agrego la pregunta ' . $feed->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
252
 
253
                    $data = [
254
                        'success'   => true,
255
                        'data'   => 'LABEL_RECORD_ADDED'
256
                    ];
257
                } else {
258
                    $data = [
259
                        'success'   => false,
260
                        'data'      => $feedMapper->getError()
261
                    ];
262
 
263
                }
264
 
265
                return new JsonModel($data);
266
 
267
            } else {
268
                $messages = [];
269
                $form_messages = (array) $form->getMessages();
270
                foreach($form_messages  as $fieldname => $field_messages)
271
                {
272
 
273
                    $messages[$fieldname] = array_values($field_messages);
274
                }
275
 
276
            }
277
 
278
        } else {
279
            $data = [
280
                'success' => false,
281
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
282
            ];
283
 
284
            return new JsonModel($data);
285
        }
286
 
287
    } catch (\Throwable $e) {
288
        $e->getMessage();
289
        return new JsonModel([
290
            'success' => false,
291
            'data' => $e
292
        ]);
293
    }
294
    }
295
 
296
 
297
 
298
    public function deleteAction() {
299
        $currentUserPlugin = $this->plugin('currentUserPlugin');
300
        $currentUser = $currentUserPlugin->getUser();
301
        $currentCompany = $currentUserPlugin->getCompany();
302
 
303
        $request = $this->getRequest();
304
        if($request->isPost()) {
305
 
306
 
307
            $id =  $this->params()->fromRoute('id');
308
 
309
            $feedMapper = FeedMapper::getInstance($this->adapter);
310
            $feed = $feedMapper->fetchOneByUuid($id);
311
            if(!$feed) {
312
                $response = [
313
                    'success' => false,
314
                    'data' => 'ERROR_POST_NOT_FOUND'
315
                ];
316
                return new JsonModel($response);
317
            }
318
 
319
            if($feed->company_id != $currentCompany->id) {
320
                $response = [
321
                    'success' => false,
322
                    'data' => 'ERROR_UNAUTHORIZED'
323
                ];
324
                return new JsonModel($response);
325
            }
326
 
327
            $feedMapper = FeedMapper::getInstance($this->adapter);
328
            $feed->status = Feed::STATUS_DELETED;
329
            if($feedMapper->update($feed)) {
330
                $response = [
331
                    'success' => true,
332
                    'data' => 'LABEL_FEED_WAS_DELETED'
333
                ];
334
 
335
            } else {
336
                $response = [
337
                    'success' => false,
338
                    'data' => $feedMapper->getError()
339
                ];
340
            }
341
 
342
 
343
            return new JsonModel($response);
344
 
345
        } else {
346
            $response = [
347
                'success' => false,
348
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
349
            ];
350
        }
351
 
352
        return new JsonModel($response);
353
 
354
    }
355
}