request->getPost('course_id', 'int', 0); $user = $this->getLoginUser(); $validator = new UserLimitValidator(); $validator->checkDailyConsultLimit($user); $course = $this->checkCourse($courseId); return $this->handleCourseConsult($course, $user); } protected function handleCourseConsult(CourseModel $course, UserModel $user) { $post = $this->request->getPost(); $data = $this->handlePostData($post); $validator = new ConsultValidator(); $validator->checkIfDuplicated($course->id, $user->id, $data['question']); $consult = new ConsultModel(); $data['priority'] = $this->getPriority($course, $user); $data['published'] = ConsultModel::PUBLISH_PENDING; $data['course_id'] = $course->id; $data['owner_id'] = $user->id; $consult->create($data); $this->recountCourseConsults($course); $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 incrUserDailyConsultCount(UserModel $user) { $this->eventsManager->fire('UserDailyCounter:incrConsultCount', $this, $user); } protected function handleConsultCreateNotice(ConsultModel $consult) { $notice = new ConsultCreateNotice(); $notice->createTask($consult); } }