name : InstructorCourseSettingController.php
<?php

namespace Modules\CourseSetting\Http\Controllers;

use App\Http\Controllers\Controller;
use App\Jobs\SendGeneralEmail;
use App\LessonComplete;
use App\Traits\Filepond;
use App\Traits\Gdrive;
use App\User;
use Brian2694\Toastr\Facades\Toastr;
use Carbon\Carbon;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Session;
use Modules\CourseSetting\Entities\Category;
use Modules\CourseSetting\Entities\Chapter;
use Modules\CourseSetting\Entities\Course;
use Modules\CourseSetting\Entities\CourseExercise;
use Modules\CourseSetting\Entities\CourseLevel;
use Modules\CourseSetting\Entities\Lesson;
use Modules\CourseSetting\Entities\LessonFile;
use Modules\Localization\Entities\Language;
use Modules\Quiz\Entities\OnlineQuiz;
use Modules\Org\Entities\OrgMaterial;
use Modules\Org\Entities\OrgMaterialFile;
use Modules\SCORM\Http\Controllers\SCORMController;
use Modules\VdoCipher\Http\Controllers\VdoCipherController;
use Modules\XAPI\Http\Controllers\XAPIController;

class InstructorCourseSettingController extends Controller
{
    use Filepond, Gdrive;

    public function saveChapter(Request $request)
    {

        if (demoCheck()) {
            return redirect()->back();
        }
        // return $request;
        $this->validate($request, [
            'input_type' => 'required',
        ]);

        if ($request->input_type == 1) {
            $request->validate([
                'chapter_name' => 'required',
            ]);
        } else if ($request->input_type == 2) {
            $request->validate([
                'quiz' => 'required',
                'chapterId' => 'required',
                'lock' => 'required',

            ]);
        } else {
            $request->validate([
                'name' => 'required',
                'chapter_id' => 'required',
                'course_id' => 'required',
//                    'video_url'=>'required',
            ]);
            if (isModuleActive('Org')) {
                if ($request->fileType != 2) {
                    $this->validate($request, [
                        'file_type' => 'required',
                        'file_path' => 'required',
                    ]);
                } else {
                    if ($request->get('host') == "Vimeo") {
                        $request->validate([
                            'vimeo' => 'required',
                        ]);
                    } elseif ($request->get('host') == "VdoCipher") {
                        $request->validate([
                            'vdocipher' => 'required',
                        ]);
                    } elseif ($request->get('host') == "Iframe") {
                        $request->validate([
                            'iframe_url' => 'required',
                        ]);
                    } elseif ($request->get('host') == "Youtube" || $request->get('host') == "URL") {
                        $request->validate([
                            'video_url' => 'required',
                        ]);
                    } elseif ($request->get('host') == "ImagePreview") {
                        //
                    } else {
                        $request->validate([
                            'file' => 'required',
                        ]);
                    }
                }

            } else {
                if ($request->get('host') == "Vimeo") {
                    $request->validate([
                        'vimeo' => 'required',
                    ]);
                } elseif ($request->get('host') == "VdoCipher") {
                    $request->validate([
                        'vdocipher' => 'required',
                    ]);
                } elseif ($request->get('host') == "Iframe") {
                    $request->validate([
                        'iframe_url' => 'required',
                    ]);
                } elseif ($request->get('host') == "Youtube" || $request->get('host') == "URL") {
                    $request->validate([
                        'video_url' => 'required',
                    ]);
                } elseif ($request->get('host') == "ImagePreview") {
                    //
                } else {
                    $request->validate([
                        'file' => 'required',
                    ]);
                }
            }

        }

        if ($request->input_type == 1) {
            try {
                $loginUser = Auth::user();

                if ($loginUser->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }

                if (isset($course)) {

                    $chpter_no = Chapter::where('course_id', $course->course_id)->count();
                    $chapter = new Chapter();
                    $chapter->name = $request->chapter_name;
                    $chapter->course_id = $request->course_id;
                    $chapter->chapter_no = $chpter_no + 1;
                    $chapter->save();

                    if (isset($course->enrollUsers) && !empty($course->enrollUsers)) {
                        foreach ($course->enrollUsers as $user) {
                            if (UserMobileNotificationSetup('Course_Chapter_Added', $user) && !empty($user->device_token)) {
                                send_mobile_notification($user, 'Course_Chapter_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                ]);
                            }
                            if (UserEmailNotificationSetup('Course_Chapter_Added', $user)) {
                                SendGeneralEmail::dispatch($user, 'Course_Chapter_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                ]);
                            }
                            if (UserBrowserNotificationSetup('Course_Chapter_Added', $user)) {
                                send_browser_notification($user, $type = 'Course_Chapter_Added', $shortcodes = [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                ],
                                    trans('common.View'),//actionText
                                    courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                                    'chapter',
                                    $course->id
                                );
                            }
                        }
                    }

                    $courseUser = $course->user;
                    if (UserMobileNotificationSetup('Course_Chapter_Added', $courseUser) && !empty($courseUser->device_token)) {
                        send_mobile_notification($courseUser, 'Course_Chapter_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                        ]);
                    }
                    if (UserEmailNotificationSetup('Course_Chapter_Added', $courseUser)) {
                        SendGeneralEmail::dispatch($courseUser, 'Course_Chapter_Added', [
                            'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                        ]);
                    }
                    if (UserBrowserNotificationSetup('Course_Chapter_Added', $courseUser)) {
                        send_browser_notification($courseUser, $type = 'Course_Chapter_Added', $shortcodes = [
                            'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                        ],
                            trans('common.View'),//actionText
                            courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                            'chapter',
                            $course->id
                        );
                    }

                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->back();
                } else {
                    Toastr::error('Invalid Access !', 'Failed');
                    return redirect()->back();
                }
            } catch (Exception $e) {
                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        } else if ($request->input_type == 2) {
            try {

                $loginUser = Auth::user();
                if ($loginUser->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }
                $chapter = Chapter::find($request->chapterId);

                if (isset($course) && isset($chapter)) {

                    $lesson = new Lesson();
                    $lesson->course_id = $request->course_id;
                    $lesson->chapter_id = $request->chapterId;
                    $lesson->quiz_id = $request->quiz;
                    $lesson->is_quiz = $request->is_quiz;
                    $lesson->is_lock = $request->lock;
                    $lesson->save();

                    $quiz = OnlineQuiz::find($request->quiz);

                    if (isset($course->enrollUsers) && !empty($course->enrollUsers)) {
                        foreach ($course->enrollUsers as $user) {
                            if (UserMobileNotificationSetup('Course_Quiz_Added', $user) && !empty($user->device_token)) {
                                send_mobile_notification($user, 'Course_Quiz_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'quiz' => $quiz->title,
                                ]);
                            }

                            if (UserEmailNotificationSetup('Course_Quiz_Added', $user)) {
                                SendGeneralEmail::dispatch($user, 'Course_Quiz_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'quiz' => $quiz->title,
                                ]);

                            }
                            if (UserBrowserNotificationSetup('Course_Quiz_Added', $user)) {

                                send_browser_notification($user, $type = 'Course_Quiz_Added', $shortcodes = [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'quiz' => $quiz->title,
                                ],
                                    trans('common.View'),//actionText
                                    courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                                    'quiz',
                                    $course->id
                                );
                            }
                        }
                    }

                    $courseUser = $course->user;
                    if (UserMobileNotificationSetup('Course_Quiz_Added', $courseUser) && !empty($courseUser->device_token)) {
                        send_mobile_notification($courseUser, 'Course_Quiz_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'quiz' => $quiz->title,
                        ]);
                    }
                    if (UserEmailNotificationSetup('Course_Quiz_Added', $courseUser)) {
                        SendGeneralEmail::dispatch($courseUser, 'Course_Quiz_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'quiz' => $quiz->title,
                        ]);
                    }
                    if (UserBrowserNotificationSetup('Course_Quiz_Added', $courseUser)) {
                        send_browser_notification($courseUser, $type = 'Course_Quiz_Added', $shortcodes = [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'quiz' => $quiz->title,
                        ],
                            trans('common.View'),//actionText
                            courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                            'quiz',
                            $course->id
                        );
                    }

                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->back();
                }

                Toastr::error('Invalid Access !', 'Failed');
                return redirect()->back();

            } catch (Exception $e) {
                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        } else {
            try {
                $user = Auth::user();

                if ($user->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }

                $chapter = Chapter::find($request->chapter_id);

                if (isset($course) && isset($chapter)) {

                    $lesson = new Lesson();
                    $lesson->course_id = $request->course_id;
                    $lesson->chapter_id = $request->chapter_id;
                    $lesson->name = $request->name;
                    $lesson->description = $request->description;

                    if (isModuleActive('Org') && $request->fileType != 2) {
                        $host = $request->file_type;
                        if ($host == "Video") {
                            $host = "Self";
                        }
                        $lesson->host = $host;
                        $lesson->video_url = $request->file_path;
                        $lesson->scorm_title = $request->scorm_title;
                        $lesson->scorm_version = $request->scorm_version;
                        $lesson->scorm_identifier = $request->scorm_identifier;

                    } else {
                        if ($request->get('host') == "Vimeo") {
                            if (config('vimeo.connections.main.upload_type') == "Direct") {
                                $courseSettingController = new CourseSettingController();
                                $lesson->video_url = $courseSettingController->uploadFileIntoVimeo($request->name, $request->vimeo);
                            } else {
                                $lesson->video_url = $request->vimeo;
                            }
                        } elseif ($request->get('host') == "VdoCipher") {
                            $lesson->video_url = $request->vdocipher;
                        } elseif ($request->get('host') == "Youtube" || $request->get('host') == "URL") {
                            $lesson->video_url = $request->video_url;
                        } elseif ($request->get('host') == "Iframe") {
                            $lesson->video_url = $request->iframe_url;
                        } elseif ($request->get('host') == "Self") {
                            $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 'local');
                        } elseif ($request->get('host') == "AmazonS3") {
                            $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 's3');

                        } elseif ($request->get('host') == "VdoCipher") {
                            $vdoCipher = new VdoCipherController();
                            $lesson->video_url = $vdoCipher->uploadToVdoCipher($request->get('file'));

                        } elseif ($request->get('host') == "SCORM") {
                            $scorm = new SCORMController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $scorm->getScormUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'] ?? "";
                                $lesson->scorm_title = $result['title'] ?? '';
                                $lesson->scorm_version = $result['version'] ?? '';
                                $lesson->scorm_identifier = $result['identifier'] ?? '';
                            }
                        } elseif ($request->get('host') == "SCORM-AwsS3") {
                            $scorm = new SCORMController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $scorm->getScormUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'] ?? '';
                                $lesson->scorm_title = $result['title'] ?? '';
                                $lesson->scorm_version = $result['version'] ?? '';
                                $lesson->scorm_identifier = $result['identifier'] ?? '';
                            }
                        } elseif ($request->get('host') == "XAPI") {
                            $xapi = new XAPIController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $xapi->getXAPIUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'];
                            }
                        } elseif ($request->get('host') == "XAPI-AwsS3") {
                            $xapi = new XAPIController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $xapi->getXAPIUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'] ?? '';
                            }
                        } elseif (
                            $request->get('host') == "Zip"
                            || $request->get('host') == "PowerPoint"
                            || $request->get('host') == "Excel"
                            || $request->get('host') == "Text"
                            || $request->get('host') == "Word"
                            || $request->get('host') == "PDF"
                            || $request->get('host') == "Image"
                        ) {
                            $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 'local');

                        } elseif ($request->get('host') == "GoogleDrive") {
                            if (empty(\auth()->user()->googleToken)) {
                                Toastr::error(trans('setting.Google Drive login is required'), trans('common.Error'));
                                return redirect()->back();
                            }
                            $id = null;
                            $url = $this->getPublicPathFromServerId($request->get('file'), 'local');
                            if ($url) {
                                $file = $this->storeFileInGDrive(base_path($url), null);
                                if (isset($file->id)) {
                                    $id = $file->id;
                                }
                                if (File::exists(base_path($url))) {
                                    File::delete(base_path($url));
                                }
                            }

                            $lesson->video_url = $id;

                        } else {
                            $lesson->video_url = null;
                        }
                        $lesson->host = $request->host;

                    }
                    if ($lesson->video_url != null && saasPlanCheck('upload_limit', $lesson->video_url)) {
                        Toastr::error('You have reached upload limit', trans('common.Failed'));
                        return redirect()->back();
                    }

                    $lesson->duration = $request->duration;
                    $lesson->is_lock = $request->is_lock;
                    $lesson->save();
                    $ignoreHost = ['SCORM', 'SCORM-AwsS3', 'XAPI', 'XAPI-AwsS3'];
                    if (in_array($lesson->host, $ignoreHost)) {
                        $size = $serverFile['size'] ?? 0;
                    } elseif (!empty($lesson->video_url) && selfHosted($lesson->host)) {
                        $size = file_exists(base_path($lesson->video_url)) ? filesize($lesson->video_url) ?? 0 : 0;
                    } else {
                        $size = 0;
                    }
                    if (isModuleActive('Org')) {
                        $lesson->file_id = null;
                        $lesson->org_material_id = $this->getMaterialId($lesson->video_url);
                    } else {
                        $lesson->file_id = $this->addFile([
                            'lesson_id' => $lesson->id,
                            'title' => $lesson->name,
                            'link' => $lesson->video_url,
                            'version' => 1,
                            'size' => $size,
                            'type' => $lesson->host,
                            'scorm_title' => $lesson->scorm_title,
                            'scorm_version' => $lesson->scorm_version,
                            'scorm_identifier' => $lesson->scorm_identifier,
                        ]);
                    }

                    $lesson->save();

                    if (isset($course->enrollUsers) && !empty($course->enrollUsers)) {
                        foreach ($course->enrollUsers as $user) {
                            if (UserMobileNotificationSetup('Course_Lesson_Added', $user) && !empty($user->device_token)) {
                                send_mobile_notification($user, 'Course_Lesson_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'lesson' => $lesson->name,
                                ]);
                            }
                            if (UserEmailNotificationSetup('Course_Lesson_Added', $user)) {
                                SendGeneralEmail::dispatch($user, 'Course_Lesson_Added', [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'lesson' => $lesson->name,
                                ]);

                            }
                            if (UserBrowserNotificationSetup('Course_Lesson_Added', $user)) {

                                send_browser_notification($user, $type = 'Course_Lesson_Added', $shortcodes = [
                                    'time' => Carbon::now()->format('d-M-Y, g:i A'),
                                    'course' => $course->title,
                                    'chapter' => $chapter->name,
                                    'lesson' => $lesson->name,
                                ],
                                    trans('common.View'),//actionText
                                    courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                                    'lesson',
                                    $course->id
                                );
                            }
                        }
                    }
                    $courseUser = $course->user;
                    if (UserMobileNotificationSetup('Course_Lesson_Added', $courseUser) && !empty($courseUser->device_token)) {
                        send_mobile_notification($courseUser, 'Course_Lesson_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'lesson' => $lesson->name,
                        ]);
                    }
                    if (UserEmailNotificationSetup('Course_Lesson_Added', $courseUser)) {
                        SendGeneralEmail::dispatch($courseUser, 'Course_Lesson_Added', [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'lesson' => $lesson->name,
                        ]);
                    }
                    if (UserBrowserNotificationSetup('Course_Lesson_Added', $courseUser)) {
                        send_browser_notification($courseUser, $type = 'Course_Lesson_Added', $shortcodes = [
                            'time' => Carbon::now()->format('d-M-Y, g:i A'),
                            'course' => $course->title,
                            'chapter' => $chapter->name,
                            'lesson' => $lesson->name,
                        ],
                            trans('common.View'),//actionText
                            courseDetailsUrl(@$course->id, @$course->type, @$course->slug),//actionUrl
                            'lesson',
                            $course->id
                        );
                    }

                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->back();
                }

                Toastr::error('Invalid Access !', 'Failed');
                return redirect()->back();

            } catch (Exception $e) {
                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        }

    }

    public function deleteChapter($chapter, $course_id)
    {
        if (demoCheck()) {
            return redirect()->back();
        }
        try {
            $user = Auth::user();
            if ($user->role_id == 2) {
                $course = Course::where('id', $course_id)->where('user_id', Auth::id())->first();
            } else {
                $course = Course::where('id', $course_id)->first();
            }

            // return $course;
            if (isset($course)) {
                $lessons = Lesson::where('chapter_id', $chapter)->where('course_id', $course_id)->get();
                foreach ($lessons as $key => $lesson) {
                    $complete_lessons = LessonComplete::where('lesson_id', $lesson->id)->get();
                    foreach ($complete_lessons as $complete) {
                        $complete->delete();
                    }
                    $lessonController = new LessonController();
                    $lessonController->lessonFileDelete($lesson);
                    $lesson->delete();
                }

                $chapter = Chapter::find($chapter);
                $chapter->delete();

                Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                return redirect()->route('courseDetails', [$course_id]);
            } else {
                Toastr::error('Invalid Access !', 'Failed');
                return redirect()->route('courseDetails', [$course_id]);
            }
        } catch (Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }

    public function updateChapter(Request $request)
    {
        $this->validate($request, [
            'input_type' => 'required',
        ]);

        if ($request->input_type == 1) {
            $request->validate([
                'chapter_name' => 'required',
            ]);
        } else if ($request->input_type == 2) {
            $request->validate([
                'quiz' => 'required',
                'chapterId' => 'required',
                'lock' => 'required',

            ]);
        } else {
            $request->validate([
                'name' => 'required',
                'chapter_id' => 'required',
                'course_id' => 'required',
            ]);

            if ($request->get('host') == "Vimeo") {
                $request->validate([
                    'vimeo' => 'required',
                ]);
            } elseif ($request->get('host') == "VdoCipher") {
                $request->validate([
                    'vdocipher' => 'required',
                ]);
            } elseif ($request->get('host') == "Youtube" || $request->get('host') == "URL") {
                $request->validate([
                    'video_url' => 'required',
                ]);
            } elseif ($request->get('host') == "Iframe") {
                $request->validate([
                    'iframe_url' => 'required',
                ]);
            }
        }
        if ($request->input_type == 1) {
            try {
                $user = Auth::user();
                if ($user->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }

                // return $course;
                if (isset($course)) {
                    $chapter = Chapter::find($request->chapter);
                    $chapter->name = $request->chapter_name;
                    $chapter->save();

                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->route('courseDetails', [$request->course_id]);
                } else {
                    Toastr::error('Invalid Access !', 'Failed');
                    return redirect()->route('courseDetails', [$request->course_id]);
                }
            } catch (Exception $e) {

                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        } else if ($request->input_type == 2) {
            try {
                $user = Auth::user();

                if ($user->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }

                $chapter = Chapter::find($request->chapterId);

                if (isset($course) && isset($chapter)) {

                    $lesson = Lesson::find($request->lesson_id);
                    $lesson->course_id = $request->course_id;
                    $lesson->chapter_id = $request->chapterId;
                    $lesson->quiz_id = $request->quiz;
                    $lesson->is_quiz = $request->is_quiz;
                    $lesson->is_lock = $request->lock;
                    $lesson->save();
                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->route('courseDetails', [$request->course_id]);
                }

                Toastr::error('Invalid Access !', 'Failed');
                return redirect()->route('courseDetails', [$request->course_id]);

            } catch (Exception $e) {
                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        } else {
            try {

                $user = Auth::user();
                if ($user->role_id == 2) {
                    $course = Course::where('id', $request->course_id)->where('user_id', Auth::id())->first();
                } else {
                    $course = Course::where('id', $request->course_id)->first();
                }
                $chapter = Chapter::find($request->chapter_id);

                if (isset($course) && isset($chapter)) {
                    // $success = trans('lang.Lesson').' '.trans('lang.Added').' '.trans('lang.Successfully');

                    $lesson = Lesson::find($request->lesson_id);
                    $lesson->course_id = $request->course_id;
                    $lesson->chapter_id = $request->chapter_id;
                    $lesson->name = $request->name;
                    $lesson->description = $request->description;

                    if (isModuleActive('Org') && $request->fileType != 2) {
                        $host = $request->file_type;
                        if ($host == "Video") {
                            $host = "Self";
                        }
                        $lesson->host = $host;
                        $lesson->video_url = $request->file_path;
                        $lesson->scorm_title = $request->scorm_title;
                        $lesson->scorm_version = $request->scorm_version;
                        $lesson->scorm_identifier = $request->scorm_identifier;

                    } else {
                        $lesson->host = $request->host;
                        if ($request->get('host') == "Vimeo") {
                            if (config('vimeo.connections.main.upload_type') == "Direct") {
                                $courseSettingController = new CourseSettingController();
                                $lesson->video_url = $courseSettingController->uploadFileIntoVimeo($request->name, $request->vimeo);
                            } else {
                                $lesson->video_url = $request->vimeo;
                            }
                        } elseif ($request->get('host') == "VdoCipher") {
                            $lesson->video_url = $request->vdocipher;
                        } elseif ($request->get('host') == "Youtube" || $request->get('host') == "URL") {
                            $lesson->video_url = $request->video_url;
                        } elseif ($request->get('host') == "Iframe") {
                            $lesson->video_url = $request->iframe_url;
                        } elseif ($request->get('host') == "Self") {
//
                            if (!empty($request->get('file'))) {
                                $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 'local');
                            }

                        } elseif ($request->get('host') == "AmazonS3") {
                            if (!empty($request->get('file'))) {
                                $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 's3');
                            }

                        } elseif ($request->get('host') == "SCORM") {
                            if (!empty($request->get('file'))) {
                                $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'), 'local');

                                $scorm = new SCORMController();
                                $result = $scorm->getScormUrl($serverFile['link'], $request->get('host'));
                                if ($result) {
                                    $lesson->video_url = $result['url'];
                                    $lesson->scorm_title = $result['title'];
                                    $lesson->scorm_version = $result['version'];
                                    $lesson->scorm_identifier = $result['identifier'];
                                }
                            }
                        } elseif ($request->get('host') == "SCORM-AwsS3") {
                            if (!empty($request->get('file'))) {
                                $scorm = new SCORMController();
                                $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                                $result = $scorm->getScormUrl($serverFile['link'], $request->get('host'));

                                if ($result) {
                                    $lesson->video_url = $result['url'];
                                    $lesson->scorm_title = $result['title'];
                                    $lesson->scorm_version = $result['version'];
                                    $lesson->scorm_identifier = $result['identifier'];
                                }
                            }
                        } elseif ($request->get('host') == "XAPI") {
                            $xapi = new XAPIController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $xapi->getXAPIUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'];
                            }
                        } elseif ($request->get('host') == "XAPI-AwsS3") {
                            $xapi = new XAPIController();
                            $serverFile = $this->getPublicPathWithFileNameFromServerId($request->get('file'));
                            $result = $xapi->getXAPIUrl($serverFile['link'], $request->get('host'));
                            if ($result) {
                                $lesson->video_url = $result['url'];
                            }
                        } elseif (
                            $request->get('host') == "Zip"
                            || $request->get('host') == "PowerPoint"
                            || $request->get('host') == "Excel"
                            || $request->get('host') == "Text"
                            || $request->get('host') == "Word"
                            || $request->get('host') == "PDF"
                            || $request->get('host') == "Image"
                        ) {
                            $lesson->video_url = $this->getPublicPathFromServerId($request->get('file'), 'local');

                        } elseif ($request->get('host') == "GoogleDrive") {
                            if (empty(\auth()->user()->googleToken)) {
                                Toastr::error(trans('setting.Google Drive login is required'), trans('common.Error'));
                                return redirect()->back();
                            }
                            $id = null;
                            $url = $this->getPublicPathFromServerId($request->get('file'), 'local');
                            if ($url) {
                                $file = $this->storeFileInGDrive(base_path($url));
                                if (isset($file->id)) {
                                    $id = $file->id;
                                }
                                if (File::exists(base_path($url))) {
                                    File::delete(base_path($url));
                                }
                            }

                            $lesson->video_url = $id;

                        } else {
                            $lesson->video_url = null;
                        }
                    }
                    $ignoreHost = ['SCORM', 'SCORM-AwsS3', 'XAPI', 'XAPI-AwsS3'];
                    if (in_array($lesson->host, $ignoreHost)) {
                        $size = $serverFile['size'] ?? 0;
                    } elseif (!empty($lesson->video_url) && selfHosted($lesson->host)) {
                        $size = file_exists(base_path($lesson->video_url)) ? filesize($lesson->video_url) ?? 0 : 0;
                    } else {
                        $size = 0;
                    }
                    if (isModuleActive('Org')) {
                        $lesson->file_id = null;
                        $lesson->org_material_id = $this->getMaterialId($lesson->video_url);
                    } else {
                        $lesson->file_id = $this->addFile([
                            'lesson_id' => $lesson->id,
                            'link' => $lesson->video_url,
                            'title' => $lesson->name,
                            'version' => count($lesson->files) + 1,
                            'size' => $size,
                            'type' => $lesson->host,
                            'scorm_title' => $lesson->scorm_title,
                            'scorm_version' => $lesson->scorm_version,
                            'scorm_identifier' => $lesson->scorm_identifier,
                        ]);
                    }


                    $lesson->duration = $request->duration;
                    $lesson->is_lock = $request->is_lock;
                    $lesson->update();

                    $self_hosts = ['Self', 'Image', 'PDF', 'Word', 'Excel', 'Text', 'Zip', 'PowerPoint'];
                    if (in_array($lesson->host, $self_hosts)) {
                        $filesize = file_exists(base_path($lesson->video_url)) ? filesize($lesson->video_url) ?? 0 : 0;
                        $filesize = round($filesize / 1024, 2); //KB
                        if (isModuleActive('LmsSaas')) {
                            if (in_array($lesson->host, $self_hosts)) {
                                saasPlanManagement('upload_limit', 'create', $filesize);
                            }
                            if (in_array($lesson->host, $self_hosts) && $lesson->old_file_size != null) {
                                saasPlanManagement('upload_limit', 'delete', $lesson->old_file_size);
                            }
                        }

                        $lesson->old_file_size = $filesize;
                        $lesson->file_size = $filesize;
                        $lesson->update();
                    }

                    SendGeneralEmail::dispatch(Auth::user(), 'Course_Lesson_Added ', [
                        'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                        'course' => $course->title,
                        'chapter' => $chapter->name,
                        'lesson' => $lesson->name,
                    ]);

                    Toastr::success(trans('common.Operation successful'), trans('common.Success'));
                    return redirect()->route('courseDetails', [$request->course_id]);
                }

                Toastr::error('Invalid Access !', 'Failed');
                return redirect()->route('courseDetails', [$request->course_id]);

            } catch (Exception $e) {
                GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
            }
        }

    }

    public function editChapter($id, $course_id)
    {

        try {
            $courseSetting = new CourseSettingController();
            $video_list = [];
            $vdocipher_list = [];
            $editChapter = Chapter::where('id', $id)->first();
            $course = Course::find($course_id);
            $chapters = Chapter::where('course_id', $course_id)->with('lessons')->get();
            $categories = Category::get();
            $instructors = User::where('role_id', 2)->get();
            $languages = Language::get();
            $quizzes = OnlineQuiz::where('category_id', $course->category_id)->get();
            $course_exercises = CourseExercise::where('course_id', $course_id)->get();
            $levels = CourseLevel::where('status', 1)->get();
            // return $course;
            return view('coursesetting::course_details', compact('vdocipher_list', 'levels', 'course', 'chapters', 'categories', 'instructors', 'languages', 'course_exercises', 'editChapter', 'quizzes', 'video_list'));

        } catch (Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }

    }

    public function saveFile(Request $request)
    {

        Session::flash('type', 'files');
        $request->validate([
            'status' => 'required',
            'file' => 'required'
        ]);

        try {

            $course_file = new CourseExercise();
            $course_file->course_id = $request->id;
            $course_file->file = $this->getPublicPathFromServerId($request->get('file'), 'local');

            if (saasPlanCheck('upload_limit', $course_file->file)) {
                Toastr::error('You have reached upload limit', trans('common.Failed'));
                return redirect()->back();
            }

            $course_file->lock = $request->lock;
            $course_file->fileName = $request->fileName;
            $course_file->status = $request->status;
            $course_file->save();

            $course = Course::find($request->id);
            if (isset($course->enrollUsers) && !empty($course->enrollUsers)) {
                foreach ($course->enrollUsers as $user) {
                    if (UserEmailNotificationSetup('Course_ExerciseFile_Added', $user)) {
                        SendGeneralEmail::dispatch($user, 'Course_ExerciseFile_Added', [
                            'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                            'course' => Course::find($request->id)->first(['title'])->title,
                            'filename' => $course_file->fileName,
                        ]);

                    }
                    if (UserBrowserNotificationSetup('Course_ExerciseFile_Added', $user)) {

                        send_browser_notification($user, $type = 'Course_ExerciseFile_Added', $shortcodes = [
                            'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                            'course' => Course::find($request->id)->first(['title'])->title,
                            'filename' => $course_file->fileName,
                        ],
                            '', //actionText
                            '' //actionUrl
                        );
                    }
                }
            }
            $courseUser = $course->user;
            if (UserEmailNotificationSetup('Course_ExerciseFile_Added', $courseUser)) {
                SendGeneralEmail::dispatch($courseUser, 'Course_ExerciseFile_Added', [
                    'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                    'course' => $course->title,
                    'filename' => $course_file->fileName,
                ]);
            }
            if (UserBrowserNotificationSetup('Course_ExerciseFile_Added', $courseUser)) {
                send_browser_notification($courseUser, $type = 'Course_ExerciseFile_Added', $shortcodes = [
                    'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                    'course' => $course->title,
                    'filename' => $course_file->fileName,
                ],
                    '', //actionText
                    '' //actionUrl
                );
            }

            Toastr::success(trans('common.Operation successful'), trans('common.Success'));
            return redirect()->back();
        } catch (Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }

    public function updateFile(Request $request)
    {
        Session::flash('type', 'files');
        $request->validate([
            'status' => 'required',
            // 'exercise_file'=>'required'
        ]);

        try {

            $course_file = CourseExercise::find($request->id);

            $filesize = 0;
            if ($request->get('file') != "") {
                $course_file->file = $this->getPublicPathFromServerId($request->get('file'), 'local');


                $filesize = file_exists(base_path($course_file->file)) ? filesize($course_file->file) ?? 0 : 0;
                // $filesize = round($filesize / 1024 / 1024, 1); //MB
                $filesize = round($filesize / 1024, 2); //KB
                if (saasPlanCheck('upload_limit', $filesize)) {
                    Toastr::error('You have reached upload limit', trans('common.Failed'));
                    return redirect()->back();
                }
                if (isModuleActive('LmsSaas')) {
                    saasPlanManagement('upload_limit', 'create', $filesize);
                    if ($course_file->old_file_size != null) {
                        saasPlanManagement('upload_limit', 'delete', $course_file->old_file_size);
                    }
                }
            }

            $course_file->old_file_size = $filesize;
            $course_file->file_size = $filesize;

            $course_file->lock = $request->lock;
            $course_file->fileName = $request->fileName;
            $course_file->status = $request->status;
            $course_file->save();
            $course = Course::find($course_file->course_id);
            if ($course) {
                if (isset($course->enrollUsers) && !empty($course->enrollUsers)) {
                    foreach ($course->enrollUsers as $user) {
                        if (UserEmailNotificationSetup('Course_ExerciseFile_Added', $user)) {
                            SendGeneralEmail::dispatch($user, 'Course_ExerciseFile_Added', [
                                'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                                'course' => $course->title,
                                'filename' => $course_file->fileName,
                            ]);

                        }
                        if (UserBrowserNotificationSetup('Course_ExerciseFile_Added', $user)) {

                            send_browser_notification($user, $type = 'Course_ExerciseFile_Added', $shortcodes = [
                                'time' => Carbon::now()->format('d-M-Y ,g:i A'),
                                'course' => $course->title,
                                'filename' => $course_file->fileName,
                            ],
                                '', //actionText
                                '' //actionUrl
                            );
                        }
                    }
                }
            }

            Toastr::success(trans('common.Operation successful'), trans('common.Success'));
            return redirect()->back();
        } catch (Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }

    public function deleteFile(Request $request)
    {
        Session::flash('type', 'files');
        try {
            $course_file = CourseExercise::find($request->id);
            if (file_exists($course_file->file)) {
                unlink($course_file->file);
            }
            $course_file->delete();
            Toastr::success(trans('common.Operation successful'), trans('common.Success'));
            return redirect()->back();
        } catch (Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }

    public function download_course_file($id)
    {
        try {
            $course_file = CourseExercise::find($id);
            // return base_path();
            $file_path = base_path('/' . $course_file->file);
            return response()->download($file_path);
        } catch (\Exception $e) {
            GettingError($e->getMessage(), url()->current(), request()->ip(), request()->userAgent());
        }
    }

    public function addFile($data)
    {
        if (selfHosted($data['type'])) {
            $file = new LessonFile();
            $file->lesson_id = $data['lesson_id'];
            $file->link = $data['link'];
            $file->title = $data['title'];
            $file->version = $data['version'];
            $file->updated_by = Auth::id();
            $file->size = $data['size'] ?? '';
            $file->type = $data['type'];
            $file->scorm_title = $data['scorm_title'] ?? '';
            $file->scorm_version = $data['scorm_version'] ?? '';
            $file->scorm_identifier = $data['scorm_identifier'] ?? '';
            $file->save();
            return $file->id;
        } else {
            return null;
        }
    }

    public function getMaterialId($link)
    {
        $id = null;
        if (isModuleActive('Org')) {
            $file = OrgMaterialFile::where('link', $link)->first();
            if ($file) {
                $id = $file->material_id;
            }
        }
        return $id;
    }

    public function addSyncFile($data)
    {
        return null;

        $file_id = null;
        $link = $data['link'] ?? '';
        $material = OrgMaterial::where('link', $link)->first();
        if ($material) {
            $files = $material->files;
            foreach ($files as $f) {
                $file = new LessonFile();
                $file->lesson_id = $data['lesson_id'];
                $file->link = $f->link;
                $file->title = $f->title;
                $file->version = $f->version;
                $file->updated_by = $f->updated_by;
                $file->size = $f->size;
                $file->type = $f->type;
                $file->scorm_title = $f->scorm_title;
                $file->scorm_version = $f->scorm_version;
                $file->scorm_identifier = $f->scorm_identifier;
                $file->save();

                if ($file->link == $link) {
                    $file_id = $file->id;
                }
            }
        }

        return $file_id;
    }

    public function restore($id)
    {
        $file = LessonFile::findOrFail($id);
        $lesson = $file->lesson;
        $lesson->file_id = $file->id;
        $lesson->host = $file->type;
        $lesson->scorm_title = $file->scorm_title;
        $lesson->scorm_version = $file->scorm_version;
        $lesson->scorm_identifier = $file->scorm_identifier;
        $lesson->save();

        Toastr::success(trans('common.Operation successful'), trans('common.Success'));
        return redirect()->back();
    }

    public function fileDelete(Request $request)
    {
        $file = LessonFile::findOrfail($request->id);

        if ($file->type == 'SCORM' || $file->type == 'XAPI') {
            $path = explode('/', $file->link);

            if (isset($path[4])) {
                $this->delete_directory(base_path('/public/uploads/scorm/' . $path[4]));
            }
        } else {
            if (File::exists(base_path($file->link))) {
                File::delete(base_path($file->link));
            }
        }
        $file->delete();
        Toastr::success(trans('common.Operation successful'), trans('common.Success'));
        return redirect()->back();
    }
}

© 2025 UnknownSec
afwwrfwafr45458465
Password