request->getPost('chapter_id', 'int', 0); $courseId = $this->request->getPost('course_id', 'int', 0); $user = $this->getLoginUser(); $validator = new UserLimitValidator(); $validator->checkDailyConsultLimit($user); $validator = new UserLimitValidator(); $validator->checkDailyConsultLimit($user); if ($chapterId > 0) { $chapter = $this->checkChapter($chapterId); return $this->handleChapterConsult($chapter, $user); } elseif ($courseId > 0) { $course = $this->checkCourse($courseId); return $this->handleCourseConsult($course, $user); } } protected function handleCourseConsult(CourseModel $course, UserModel $user) { $post = $this->request->getPost(); $validator = new ConsultValidator(); $question = $validator->checkQuestion($post['question']); $private = 0; if (isset($post['private'])) { $private = $validator->checkPrivateStatus($post['private']); } $validator->checkIfDuplicated($course->id, $user->id, $question); $priority = $this->getPriority($course, $user); $consult = new ConsultModel(); $consult->question = $question; $consult->private = $private; $consult->priority = $priority; $consult->course_id = $course->id; $consult->owner_id = $user->id; $consult->client_type = $this->getClientType(); $consult->client_ip = $this->getClientIp(); $consult->published = 1; $consult->create(); $this->recountCourseConsults($course); $this->incrUserDailyConsultCount($user); $this->handleConsultCreateNotice($consult); $this->eventsManager->fire('Consult:afterCreate', $this, $consult); return $consult; } protected function handleChapterConsult(ChapterModel $chapter, UserModel $user) { $course = $this->checkCourse($chapter->course_id); $post = $this->request->getPost(); $validator = new ConsultValidator(); $question = $validator->checkQuestion($post['question']); $private = 0; if (isset($post['private'])) { $private = $validator->checkPrivateStatus($post['private']); } $validator->checkIfDuplicated($course->id, $user->id, $question); $priority = $this->getPriority($course, $user); $consult = new ConsultModel(); $consult->question = $question; $consult->private = $private; $consult->priority = $priority; $consult->course_id = $course->id; $consult->chapter_id = $chapter->id; $consult->owner_id = $user->id; $consult->client_type = $this->getClientType(); $consult->client_ip = $this->getClientIp(); $consult->published = 1; $consult->create(); $this->recountCourseConsults($course); $this->recountChapterConsults($chapter); $this->incrUserDailyConsultCount($user); $this->handleConsultCreateNotice($consult); $this->eventsManager->fire('Consult:afterCreate', $this, $consult); return $consult; } protected function getPriority(CourseModel $course, UserModel $user) { $charge = $course->market_price > 0; $vip = $user->vip == 1; if ($vip && $charge) { $priority = ConsultModel::PRIORITY_HIGH; } elseif ($charge) { $priority = ConsultModel::PRIORITY_MIDDLE; } else { $priority = ConsultModel::PRIORITY_LOW; } return $priority; } protected function recountCourseConsults(CourseModel $course) { $courseRepo = new CourseRepo(); $consultCount = $courseRepo->countConsults($course->id); $course->consult_count = $consultCount; $course->update(); } protected function recountChapterConsults(ChapterModel $chapter) { $chapterRepo = new ChapterRepo(); $consultCount = $chapterRepo->countConsults($chapter->id); $chapter->consult_count = $consultCount; $chapter->update(); } protected function incrUserDailyConsultCount(UserModel $user) { $this->eventsManager->fire('UserDailyCounter:incrConsultCount', $this, $user); } protected function handleConsultCreateNotice(ConsultModel $consult) { $notice = new ConsultCreateNotice(); $notice->createTask($consult); } }