repository = $repository; $this->validator = $validator; } public function index() { $this->repository->pushCriteria(CourseCriteria::class); $courses = $this->repository->paginate(request('per_page', self::PAGE_NUM)); return Response::success($courses); } public function store(Request $request) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE)); try { $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE))); $data['type'] = CourseTypeEnum::RECORDED; $data['admin_id'] = login_admin_id(); $data['slug'] = arr2str(Pinyin::permalink($data['title']), '_'); if (!in_array('published_at', $data) || empty($data['published_at'])) { $data['published_at'] = Carbon::now(); } $course = $this->repository->create($data); return Response::success($course); } catch (\Exception $e) { return $this->errorStore($e); } } public function show($id) { $course = $this->repository->find($id); return Response::success($course); } public function update(Request $request, $id) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE)); try { $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_UPDATE))); if (in_array('title', $data)) { $data['slug'] = arr2str(Pinyin::permalink($data['title']), '_'); } if (!in_array('published_at', $data) || empty($data['published_at'])) { $data['published_at'] = Carbon::now(); } $course = $this->repository->update($data, $id); return Response::success($course); } catch (\Exception $e) { $this->errorStore($e); } } public function destroy($id) { try { $this->repository->delete($id); return Response::success(null, T('successfully delete.')); } catch (\Exception $exception) { return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR); } } public function lists(Request $request) { $this->repository->pushCriteria(CourseCriteria::class); $courses = $this->repository->where('status', ModelStatusEnum::OK)->where('published_at', '<', Carbon::now())->paginate($request->get('per_page', self::PAGE_NUM)); $courses = $this->repository->parserResult($courses); return Response::success($courses); } /** * Author: Mead */ public function viewShow($id) { $course = $this->repository->where('id', $id)->first(); $directory = []; $data = Chapter::query()->where('course_id', $course->id)->where('status', ModelStatusEnum::OK)->orderByDesc('sort')->get(); foreach ($data as $d) { $directory[] = [ 'id' => $d['id'], 'title' => $d['title'], 'children' => $d->videos()->where('status', ModelStatusEnum::OK)->where('published_at', '<', Carbon::now())->orderByDesc('sort')->get(['id', 'title', 'duration', 'short_description'])->append(['duration_text', "progress"]) ]; } $comments = $course->comments()->with(['user'])->limit(self::PAGE_NUM)->orderByDesc('id')->get(); $attaches = $course->attaches()->with(['path_resource'])->where('status', ModelStatusEnum::OK)->get(['name', 'id', 'path', 'download_times']); $subscribe = $course->subscribe()->where('user_id', login_admin_id())->first(); $course = $this->repository->parserResult($course); $watch_record_video_id = UserVideoWatchRecord::query()->where('user_id', login_admin_id())->where('course_id', $id)->orderByDesc('watched_at')->value('video_id'); return Response::success(compact('course', 'directory', 'comments', 'attaches', 'subscribe', 'watch_record_video_id')); } /** * 订阅课程 * @param Request $request * Author: Mead */ public function subscribe(Request $request) { $this->validate($request, ['course_id' => 'required|integer']); $course_id = $request->get('course_id'); $user_id = login_admin_id(); if (UserRecord::query()->where('course_id', $course_id)->where('user_id', $user_id)->exists()) { return Response::success(null); } UserRecord::query()->create(['course_id' => $course_id, 'user_id' => $user_id]); Course::query()->where('id', $course_id)->increment('user_count'); return Response::success(null); } }