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', +        ]); +    } + +}  | 
