validateQAQuestionCreate($request))) { $response->set('qa_question_create', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } $question = $this->createQAQuestionFromRequest($request, $response, $data); $this->createModel($request->header->account, $question, QAQuestionMapper::class, 'question', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Question', 'Question successfully created.', $question); } /** * Method to create question from request. * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return QAQuestion Returns the created question from the request * * @since 1.0.0 */ public function createQAQuestionFromRequest(RequestAbstract $request, ResponseAbstract $response, $data = null) : QAQuestion { $question = new QAQuestion(); $question->name = (string) $request->getData('title'); $question->questionRaw = (string) $request->getData('plain'); $question->question = Markdown::parse((string) ($request->getData('plain') ?? '')); $question->app = new NullQAApp((int) ($request->getData('app') ?? 1)); $question->setLanguage((string) $request->getData('language')); $question->setStatus((int) $request->getData('status')); $question->createdBy = new Profile(new NullAccount($request->header->account)); if (!empty($tags = $request->getDataJson('tags'))) { foreach ($tags as $tag) { if (!isset($tag['id'])) { $request->setData('title', $tag['title'], true); $request->setData('color', $tag['color'], true); $request->setData('icon', $tag['icon'] ?? null, true); $request->setData('language', $tag['language'], true); $internalResponse = new HttpResponse(); $this->app->moduleManager->get('Tag')->apiTagCreate($request, $internalResponse, $data); $question->addTag($internalResponse->get($request->uri->__toString())['response']); } else { $question->addTag(new NullTag((int) $tag['id'])); } } } if (!empty($uploadedFiles = $request->getFiles())) { $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( [], [], $uploadedFiles, $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/QA', '/Modules/QA', ); foreach ($uploaded as $media) { $question->addMedia($media); } } if (!empty($mediaFiles = $request->getDataJson('media'))) { foreach ($mediaFiles as $media) { $question->addMedia(new NullMedia($media)); } } return $question; } /** * Validate question create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateQAQuestionCreate(RequestAbstract $request) : array { $val = []; if (($val['title'] = empty($request->getData('title'))) || ($val['plain'] = empty($request->getData('plain'))) || ($val['language'] = empty($request->getData('language'))) || ($val['status'] = ( $request->getData('status') !== null && !QAQuestionStatus::isValidValue((int) $request->getData('status')) )) ) { return $val; } return []; } /** * Api method to create a answer * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiQAAnswerCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { if (!empty($val = $this->validateQAAnswerCreate($request))) { $response->set('qa_answer_create', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } $answer = $this->createQAAnswerFromRequest($request); $this->createModel($request->header->account, $answer, QAAnswerMapper::class, 'answer', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Answer', 'Answer successfully created.', $answer); } /** * Method to create answer from request. * * @param RequestAbstract $request Request * * @return QAAnswer Returns the created answer from the request * * @since 1.0.0 */ public function createQAAnswerFromRequest(RequestAbstract $request) : QAAnswer { $mardkownParser = new Markdown(); $answer = new QAAnswer(); $answer->answerRaw = (string) $request->getData('plain'); $answer->answer = Markdown::parse((string) ($request->getData('plain') ?? '')); $answer->question = new NullQAQuestion((int) $request->getData('question')); $answer->isAccepted = false; $answer->setStatus((int) $request->getData('status')); $answer->createdBy = new Profile(new NullAccount($request->header->account)); if (!empty($uploadedFiles = $request->getFiles())) { $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( [], [], $uploadedFiles, $request->header->account, __DIR__ . '/../../../Modules/Media/Files/Modules/QA', '/Modules/QA', ); foreach ($uploaded as $media) { $answer->addMedia($media); } } if (!empty($mediaFiles = $request->getDataJson('media'))) { foreach ($mediaFiles as $media) { $answer->addMedia(new NullMedia($media)); } } return $answer; } /** * Validate answer create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateQAAnswerCreate(RequestAbstract $request) : array { $val = []; if (($val['plain'] = empty($request->getData('plain'))) || ($val['question'] = empty($request->getData('question'))) || ($val['status'] = ( $request->getData('status') !== null && !QAAnswerStatus::isValidValue((int) $request->getData('status')) )) ) { return $val; } return []; } /** * Api method to create a answer * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiChangeAnsweredStatus(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { // @todo: check if is allowed to change $old = clone QAAnswerMapper::get()->where('id', (int) $request->getData('id'))->execute(); $oldAccepted = QAAnswerMapper::get() ->where('question', $old->question->getId()) ->where('isAccepted', true) ->execute(); if ($old->getId() !== $oldAccepted->getId()) { $oldUnaccepted = clone $oldAccepted; $oldUnaccepted->isAccepted = !$oldUnaccepted->isAccepted; $this->updateModel($request->header->account, $oldAccepted, $oldUnaccepted, QAAnswerMapper::class, 'answer', $request->getOrigin()); } $new = $this->updateAnsweredStatusFromRequest($request); $this->updateModel($request->header->account, $old, $new, QAAnswerMapper::class, 'answer', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Answer', 'Answer successfully updated.', $new); } /** * Method to create category from request. * * @param RequestAbstract $request Request * * @return QAAnswer * * @since 1.0.0 */ public function updateAnsweredStatusFromRequest(RequestAbstract $request) : QAAnswer { $answer = QAAnswerMapper::get()->where('id', (int) $request->getData('id'))->execute(); $answer->isAccepted = !$answer->isAccepted; return $answer; } /** * Api method to create a category * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiQAAppCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { if (!empty($val = $this->validateQAAppCreate($request))) { $response->set('qa_app_create', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } $app = $this->createQAAppFromRequest($request); $this->createModel($request->header->account, $app, QAAppMapper::class, 'app', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'App', 'App successfully created.', $app); } /** * Method to create app from request. * * @param RequestAbstract $request Request * * @return QAApp Returns the created app from the request * * @since 1.0.0 */ public function createQAAppFromRequest(RequestAbstract $request) : QAApp { $app = new QAApp(); $app->name = $request->getData('name') ?? ''; return $app; } /** * Validate app create request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateQAAppCreate(RequestAbstract $request) : array { $val = []; if (($val['name'] = empty($request->getData('name')))) { return $val; } return []; } /** * Api method to change question vote * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiChangeQAQuestionVote(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { if (!empty($val = $this->validateQuestionVote($request))) { $response->set('qa_question_vote', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } // @todo: check if is allowed to change $questionVote = QAQuestionVoteMapper::get() ->where('question', (int) $request->getData('id')) ->where('createdBy', $request->header->account) ->execute(); if ($questionVote === false || $questionVote instanceof NullQAQuestionVote || $questionVote === null) { $question = QAQuestionMapper::get()->where('id', (int) $request->getData('id'))->execute(); $new = new QAQuestionVote(); $new->score = (int) $request->getData('type'); $new->question = (int) $request->getData('id'); $new->createdBy = new NullAccount($request->header->account); $new->createdFor = $question->createdBy->getId(); $this->createModel($request->header->account, $new, QAQuestionVoteMapper::class, 'qa_question_vote', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Sucessfully voted.', $new); } else { /** @var QAQuestionVote $questionVote */ $new = clone $questionVote; $new->score = ((int) $request->getData('type')) === $new->score ? 0 : (int) $request->getData('type'); $this->updateModel($request->header->account, $questionVote, $new, QAQuestionVoteMapper::class, 'qa_question_vote', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Vote successfully changed.', $new); } } /** * Validate question vote request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateQuestionVote(RequestAbstract $request) : array { $val = []; if (($val['id'] = ($request->getData('id') === null)) || ($val['type'] = ($request->getData('type', 'int') < -1 || $request->getData('type') > 1)) ) { return $val; } return []; } /** * Api method to change answer vote * * @param RequestAbstract $request Request * @param ResponseAbstract $response Response * @param mixed $data Generic data * * @return void * * @api * * @since 1.0.0 */ public function apiChangeQAAnswerVote(RequestAbstract $request, ResponseAbstract $response, $data = null) : void { if (!empty($val = $this->validateAnswerVote($request))) { $response->set('qa_answer_vote', new FormValidation($val)); $response->header->status = RequestStatusCode::R_400; return; } // @todo: check if is allowed to change $answerVote = QAAnswerVoteMapper::get() ->where('answer', (int) $request->getData('id')) ->where('createdBy', $request->header->account) ->execute(); if ($answerVote === false || $answerVote instanceof NullQAAnswerVote || $answerVote === null) { $answer = QAAnswerMapper::get()->where('id', (int) $request->getData('id'))->execute(); $new = new QAAnswerVote(); $new->score = (int) $request->getData('type'); $new->answer = (int) $request->getData('id'); $new->createdBy = new NullAccount($request->header->account); $new->createdFor = $answer->createdBy->getId(); $this->createModel($request->header->account, $new, QAAnswerVoteMapper::class, 'qa_answer_vote', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Sucessfully voted.', $new); } else { /** @var QAAnswerVote $answerVote */ $new = clone $answerVote; $new->score = ((int) $request->getData('type')) === $new->score ? 0 : (int) $request->getData('type'); $this->updateModel($request->header->account, $answerVote, $new, QAAnswerVoteMapper::class, 'qa_answer_vote', $request->getOrigin()); $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'Vote', 'Vote successfully changed.', $new); } } /** * Validate answer vote request * * @param RequestAbstract $request Request * * @return array Returns the validation array of the request * * @since 1.0.0 */ private function validateAnswerVote(RequestAbstract $request) : array { $val = []; if (($val['id'] = ($request->getData('id') === null)) || ($val['type'] = ($request->getData('type', 'int') < -1 || $request->getData('type') > 1)) ) { return $val; } return []; } }