diff options
author | Sam Light <samlight1994@gmail.com> | 2022-09-09 15:28:41 +0100 |
---|---|---|
committer | Sam Light <samlight1994@gmail.com> | 2022-09-09 15:28:41 +0100 |
commit | 157d77625644a97742f6953df6a42476c5387e2c (patch) | |
tree | a66cd826b013006e55b0d96f98546b848ef0858a /src/Controllers/ScormPlayerController.php | |
parent | 615ae1005ace5c2645c7f6aa53045619fcbd1499 (diff) |
Moved controller out of http folder. No need to nest!
Diffstat (limited to 'src/Controllers/ScormPlayerController.php')
-rw-r--r-- | src/Controllers/ScormPlayerController.php | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/Controllers/ScormPlayerController.php b/src/Controllers/ScormPlayerController.php new file mode 100644 index 0000000..e7f3971 --- /dev/null +++ b/src/Controllers/ScormPlayerController.php @@ -0,0 +1,119 @@ +<?php + +namespace Lightscale\ScormPlayer\Controllers; + +use Lightscale\ScormPlayer\Models\{ + Scorm, + ScormSco, + ScormScoTracking, +}; + +use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Storage; +use Illuminate\Support\Facades\File; +use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Str; +use Illuminate\Http\Request; +use Illuminate\Http\Testing\MimeType; + +use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException; + + +class ScormPlayerController extends Controller +{ + + private const JS_PATH = __DIR__ . '/../../dist/js/scorm_player.js'; + + public function player(Request $request, Scorm $module) + { + $sco = $request->query('sco'); + $sco = $module->scos()->findOrFail($sco); + + $route_data = ['sco' => $sco]; + $scorm_api_data = [ + 'routes' => [ + 'load' => route('scorm-player.scorm.load', $route_data), + ], + ]; + + $js_uri = route('scorm-player.javascript', [ + 'version' => substr(md5(filemtime(self::JS_PATH)), 10, 8) + ]); + + return view('scorm-player::player', compact( + 'sco', + 'scorm_api_data', + 'js_uri' + )); + } + + public function serveModule(string $uuid, string $path) + { + $path = Storage::disk(config('scorm.disk'))->path("{$uuid}/{$path}"); + $mime = MimeType::from($path); + + try { + return response()->file($path, [ + 'content-type' => $mime, + ]); + } + catch(FileNotFoundException $e) { + abort(404); + } + } + + public function scormLoad(ScormSco $sco) + { + $user = Auth::user(); + + $tracking = ScormScoTracking::where([ + 'sco_id' => $sco->id, + 'user_id' => $user->id, + ])->first(); + + if(!$tracking) { + $tracking = new ScormScoTracking([ + 'uuid' => Str::uuid(), + 'progression' => 0, + ]); + $tracking->user()->associate($user); + $tracking->sco_id = $sco->id; + $tracking->save(); + } + + $commit_url = route('scorm-player.scorm.commit', [ + 'tracking' => $tracking->id, + ]); + + $scorm_entry = route('scorm-player.serve', [ + 'uuid' => $sco->scorm->uuid, + 'path' => $sco->entry_url, + ]); + + return [ + 'tracking_id' => $tracking->id, + 'tracking' => $tracking->getCMIData(), + 'entry_url' => $scorm_entry, + 'commit_url' => $commit_url, + ]; + } + + public function scormCommit(Request $request, ScormScoTracking $tracking) + { + $data = $request->all(); + + $tracking->setCMIData($data); + + return [ + 'result' => true, + ]; + } + + public function jsSource(Request $request) + { + return response()->file(self::JS_PATH, [ + 'Content-Type' => 'application/javascript', + ]); + } + +} |