PluginProbe
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses / 1.0.93
FluentCommunity – Ultra-Fast High-Performance Social Network, Community, LMS & Online Courses v1.0.93
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.93, at Modules/Course/Http/Controllers/CourseController.php

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