PluginProbe
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses / 1.0.98
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses v1.0.98
2.10.0 2.10.01 2.9.1 2.9.0 2.8.1 2.8.0 2.7.7 2.7.5 2.7.0 2.6.01 2.6.0 2.5.0 2.4.01 trunk 1.0.90 1.0.91 1.0.92 1.0.93 1.0.94 1.0.95 1.0.96 1.0.97 1.0.98 1.0.99 1.1.0 All 77 releases
fluent-community / Modules / Course / Http / Controllers / CourseController.php

CourseController.php in FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses 1.0.98, at Modules/Course/Http/Controllers/CourseController.php

278 lines 9.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace FluentCommunity\Modules\Course\Http\Controllers;
4
5 use FluentCommunity\App\Http\Controllers\Controller;
6 use FluentCommunity\App\Models\SpaceUserPivot;
7 use FluentCommunity\App\Services\LockscreenService;
8 use FluentCommunity\Framework\Http\Request\Request;
9 use FluentCommunity\Modules\Course\Model\Course;
10 use FluentCommunity\Modules\Course\Model\CourseLesson;
11 use FluentCommunity\Modules\Course\Model\CourseTopic;
12 use FluentCommunity\Modules\Course\Services\CourseHelper;
13
14 class CourseController extends Controller
15 {
16 public function getCourses(Request $request)
17 {
18 $user = $this->getUser();
19 $isCourseCreator = $user && $user->hasCourseCreatorAccess();
20
21 if ($request->get('type') == 'enrolled') {
22 $courses = Course::searchBy($request->get('search'))
23 ->where('status', 'published')
24 ->orderBy('title', 'ASC')
25 ->byPostTopic($request->get('topic_slug'))
26 ->whereIn('id', CourseHelper::getEnrolledCourseIds())
27 ->paginate();
28 } else {
29 $courses = Course::searchBy($request->get('search'))
30 ->when(!$isCourseCreator, function ($q) {
31 $q->where('status', 'published');
32 })
33 ->byPostTopic($request->get('topic_slug'))
34 ->orderBy('title', 'ASC')
35 ->where(function ($q) {
36 $q->whereIn('privacy', ['public', 'private']);
37 if ($enrolledIds = CourseHelper::getEnrolledCourseIds()) {
38 $q->orWhereIn('id', $enrolledIds);
39 }
40 })
41 ->paginate();
42 }
43
44
45 foreach ($courses as $course) {
46 $course->isEnrolled = CourseHelper::isEnrolled($course->id);
47 if ($course->isEnrolled) {
48 $course->progress = CourseHelper::getCourseProgress($course->id);
49 }
50
51 if (!$course->cover_photo) {
52 $course->cover_photo = FLUENT_COMMUNITY_PLUGIN_URL . 'assets/images/course-placeholder.jpg';
53 }
54
55 $course->sectionsCount = CourseTopic::where('space_id', $course->id)->count();
56 $course->lessonsCount = CourseLesson::where('space_id', $course->id)->count();
57 $course->studentsCount = SpaceUserPivot::where('space_id', $course->id)->count();
58 }
59
60 return [
61 'courses' => $courses,
62 'course_categories' => $request->get('with_categories') ? CourseHelper::getCourseCategories() : []
63 ];
64 }
65
66 public function getCourse(Request $request, $courseId)
67 {
68 $user = $this->getUser();
69 $isCourseCreator = $user && $user->hasCourseCreatorAccess();
70
71 $course = Course::when(!$isCourseCreator, function ($q) {
72 $q->where('status', 'published');
73 })->find($courseId);
74
75 if (!$course) {
76 return $this->sendError([
77 'message' => 'Course not found. maybe the course is not published yet!'
78 ]);
79 }
80
81 return $this->processCourse($course, $isCourseCreator);
82 }
83
84 public function getCourseBySlug(Request $request, $slug)
85 {
86 $user = $this->getUser();
87 $isCourseCreator = $user && $user->hasCourseCreatorAccess();
88
89 $course = Course::when(!$isCourseCreator, function ($q) {
90 $q->where('status', 'published');
91 })->where('slug', $slug)->firstOrFail();
92
93 if (!$course) {
94 return $this->sendError([
95 'message' => 'Course not found. maybe the course is not published yet!'
96 ]);
97 }
98
99 return $this->processCourse($course, $isCourseCreator);
100 }
101
102 private function processCourse($course, $isCourseCreator)
103 {
104 $sections = CourseTopic::where('space_id', $course->id)
105 ->orderBy('priority', 'ASC')
106 ->with(['lessons' => function ($query) use ($isCourseCreator) {
107 if (!$isCourseCreator) {
108 $query->where('status', 'published');
109 }
110 }])
111 ->get();
112
113 $enrollment = CourseHelper::getCourseEnrollment($course->id);
114 $formattedSections = [];
115
116 if ($course->privacy == 'private' && !$enrollment) {
117 $course->lockscreen_config = LockscreenService::getLockscreenConfig($course);
118 }
119
120 if ($course->privacy == 'secret' && !$enrollment && !$isCourseCreator) {
121 return $this->sendError([
122 'message' => 'You must need to be invited to view this course'
123 ]);
124 }
125
126 $courseType = $course->getCourseType();
127
128 foreach ($sections as $section) {
129 if ($section->lessons->isEmpty()) {
130 continue;
131 }
132
133 $hasAcessSectionAcess = !!$enrollment;
134 $unlockDate = '';
135
136 if ($hasAcessSectionAcess) {
137 $unlockDate = CourseHelper::getSectionAccessDate($section, $courseType, $enrollment);
138 if (!$unlockDate || strtotime($unlockDate) > current_time('timestamp')) {
139 $hasAcessSectionAcess = false;
140 } else {
141 $unlockDate = null;
142 }
143 }
144
145 $formattedLessons = [];
146 foreach ($section->lessons as $lesson) {
147 if ($hasAcessSectionAcess || $isCourseCreator) {
148 $content = $lesson->message_rendered;
149 if (!$content && $lesson->message) {
150 $content = apply_filters('widget_block_content', do_blocks($lesson->message));
151 }
152 } else {
153 $content = '';
154 }
155
156 $formattedLessons[] = [
157 'id' => $lesson->id,
158 'title' => $lesson->title,
159 'content' => $content,
160 'slug' => $lesson->slug,
161 'course_id' => $lesson->space_id,
162 'section_id' => $lesson->parent_id,
163 'created_at' => $lesson->created_at,
164 'meta' => $lesson->meta,
165 'comments_count' => $lesson->comments_count,
166 'is_locked' => !$hasAcessSectionAcess && !$isCourseCreator,
167 'unclock_date' => $unlockDate
168 ];
169 }
170
171 $formattedSections[] = [
172 'id' => $section->id,
173 'title' => $section->title,
174 'lessons' => $formattedLessons,
175 'created_at' => $section->created_at,
176 'slug' => $section->slug,
177 'type' => 'section',
178 'is_locked' => !$hasAcessSectionAcess && !$isCourseCreator,
179 'unlock_date' => $unlockDate
180 ];
181 }
182
183 return [
184 'course' => $course,
185 'sections' => $formattedSections,
186 'track' => CourseHelper::getCourseProgressTrack($course->id)
187 ];
188 }
189
190 public function enrollCourse(Request $request, $courseId)
191 {
192 $user = $this->getUser();
193
194 if (!$user) {
195 return $this->sendError([
196 'message' => __('You need to login to enroll in this course.', 'fluent-community')
197 ]);
198 }
199
200 $isCourseCreator = $user->hasCourseCreatorAccess();
201 $course = Course::when(!$isCourseCreator, function ($q) {
202 $q->where('status', 'published');
203 })->findOrFail($courseId);
204
205
206 if (!$isCourseCreator && $course->privacy != 'public') {
207 return $this->sendError([
208 'message' => __('You are not allowed to enroll in this course.', 'fluent-community')
209 ]);
210 }
211
212 $enrolled = CourseHelper::enrollCourse($course, get_current_user_id());
213
214 if (!$enrolled) {
215 return [
216 'message' => __('You are already enrolled in this course.', 'fluent-community'),
217 'track' => CourseHelper::getCourseProgressTrack($courseId)
218 ];
219 }
220
221 return [
222 'message' => __('You have been enrolled in this course.', 'fluent-community'),
223 'track' => CourseHelper::getCourseProgressTrack($courseId)
224 ];
225 }
226
227 public function updateCompletionLesson(Request $request, $courseId, $lessonId)
228 {
229 $course = Course::findOrFail($courseId);
230
231 if ($course->status != 'published') {
232 return $this->sendError([
233 'message' => __('Course is not in published state.', 'fluent-community')
234 ]);
235 }
236
237
238 if (!CourseHelper::isEnrolled($courseId)) {
239 return $this->sendError([
240 'message' => 'You are not enrolled in this action.'
241 ]);
242 }
243
244 $lesson = CourseLesson::where('space_id', $courseId)
245 ->where('status', 'published')
246 ->where('id', $lessonId)
247 ->first();
248
249 if (!$lesson) {
250 return $this->sendError([
251 'message' => 'Lesson is not on published state.'
252 ]);
253 }
254
255 $state = $request->get('state');
256
257 if (!in_array($state, ['completed', 'incomplete'])) {
258 return $this->sendError([
259 'message' => 'Invalid state.'
260 ]);
261 }
262
263 CourseHelper::updateLessonCompletion($lesson, get_current_user_id(), $state);
264 $track = CourseHelper::getCourseProgressTrack($courseId);
265 $isCompleted = $track['progress'] == 100;
266
267 if ($isCompleted) {
268 CourseHelper::completeCourse($course, get_current_user_id());
269 }
270
271 return [
272 'message' => 'Lesson completion state updated.',
273 'track' => $track,
274 'is_completed' => $isCompleted
275 ];
276 }
277 }
278