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

281 lines 9.6 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
148 foreach ($section->lessons as $lesson) {
149
150 if ($hasAcessSectionAcess || $isModerator) {
151 $content = $lesson->message_rendered;
152 if (!$content && $lesson->message) {
153 $content = do_blocks($lesson->message);
154 }
155 } else {
156 $content = '';
157 }
158
159 $formattedLessons[] = [
160 'id' => $lesson->id,
161 'title' => $lesson->title,
162 'content' => $content,
163 'slug' => $lesson->slug,
164 'course_id' => $lesson->space_id,
165 'section_id' => $lesson->parent_id,
166 'created_at' => $lesson->created_at,
167 'meta' => $lesson->meta,
168 'comments_count' => $lesson->comments_count,
169 'is_locked' => !$hasAcessSectionAcess && !$isModerator,
170 'unclock_date' => $unlockDate
171 ];
172 }
173
174 $formattedSections[] = [
175 'id' => $section->id,
176 'title' => $section->title,
177 'lessons' => $formattedLessons,
178 'created_at' => $section->created_at,
179 'slug' => $section->slug,
180 'type' => 'section',
181 'is_locked' => !$hasAcessSectionAcess && !$isModerator,
182 'unlock_date' => $unlockDate
183 ];
184 }
185
186 return [
187 'course' => $course,
188 'sections' => $formattedSections,
189 'track' => CourseHelper::getCourseProgressTrack($course->id)
190 ];
191 }
192
193 public function enrollCourse(Request $request, $courseId)
194 {
195 $user = $this->getUser();
196
197 if (!$user) {
198 return $this->sendError([
199 'message' => __('You need to login to enroll in this course.', 'fluent-community')
200 ]);
201 }
202
203 $isModerator = $user->isCommunityModerator();
204 $course = Course::when(!$isModerator, function ($q) {
205 $q->where('status', 'published');
206 })->findOrFail($courseId);
207
208
209 if (!$isModerator && $course->privacy != 'public') {
210 return $this->sendError([
211 'message' => __('You are not allowed to enroll in this course.', 'fluent-community')
212 ]);
213 }
214
215 $enrolled = CourseHelper::enrollCourse($course, get_current_user_id());
216
217 if (!$enrolled) {
218 return [
219 'message' => __('You are already enrolled in this course.', 'fluent-community'),
220 'track' => CourseHelper::getCourseProgressTrack($courseId)
221 ];
222 }
223
224 return [
225 'message' => __('You have been enrolled in this course.', 'fluent-community'),
226 'track' => CourseHelper::getCourseProgressTrack($courseId)
227 ];
228 }
229
230 public function updateCompletionLesson(Request $request, $courseId, $lessonId)
231 {
232 $course = Course::findOrFail($courseId);
233
234 if ($course->status != 'published') {
235 return $this->sendError([
236 'message' => __('Course is not on published state.', 'fluent-community')
237 ]);
238 }
239
240
241 if (!CourseHelper::isEnrolled($courseId)) {
242 return $this->sendError([
243 'message' => 'You are not enrolled in this action.'
244 ]);
245 }
246
247 $lesson = CourseLesson::where('space_id', $courseId)
248 ->where('status', 'published')
249 ->where('id', $lessonId)
250 ->first();
251
252 if (!$lesson) {
253 return $this->sendError([
254 'message' => 'Lesson is not on published state.'
255 ]);
256 }
257
258 $state = $request->get('state');
259
260 if (!in_array($state, ['completed', 'incomplete'])) {
261 return $this->sendError([
262 'message' => 'Invalid state.'
263 ]);
264 }
265
266 CourseHelper::updateLessonCompletion($lesson, get_current_user_id(), $state);
267 $track = CourseHelper::getCourseProgressTrack($courseId);
268 $isCompleted = $track['progress'] == 100;
269
270 if ($isCompleted) {
271 CourseHelper::completeCourse($course, get_current_user_id());
272 }
273
274 return [
275 'message' => 'Lesson completion state updated.',
276 'track' => $track,
277 'is_completed' => $isCompleted
278 ];
279 }
280 }
281