diff options
author | Khaled Lela <eng.khaled.lela@gmail.com> | 2022-02-04 00:59:55 +0200 |
---|---|---|
committer | Khaled Lela <eng.khaled.lela@gmail.com> | 2022-02-04 00:59:55 +0200 |
commit | 9e6f0a90b6b99d7a08fbe07ecd9c304b825f3a16 (patch) | |
tree | 96845abb43747c8607a492f68a7002bfc0c35a32 | |
parent | 2e8cf8822305aaea60d12a47d124122ed5e4c145 (diff) |
refactor(manager): fix manager duplicated storage code, make it depend on ScormDist helper
-rw-r--r-- | src/Manager/ScormManager.php | 184 |
1 files changed, 76 insertions, 108 deletions
diff --git a/src/Manager/ScormManager.php b/src/Manager/ScormManager.php index 3b8c683..4e9e9c5 100644 --- a/src/Manager/ScormManager.php +++ b/src/Manager/ScormManager.php @@ -3,31 +3,27 @@ namespace Peopleaps\Scorm\Manager; -use App\Models\User; use Carbon\Carbon; use DOMDocument; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\UploadedFile; -use Illuminate\Support\Facades\File; -use Illuminate\Support\Facades\Storage; -use League\Flysystem\FileNotFoundException; -use Peopleaps\Scorm\Entity\Sco; use Peopleaps\Scorm\Entity\Scorm; use Peopleaps\Scorm\Entity\ScoTracking; use Peopleaps\Scorm\Exception\InvalidScormArchiveException; -use Peopleaps\Scorm\Exception\StorageNotFoundException; use Peopleaps\Scorm\Library\ScormLib; use Peopleaps\Scorm\Model\ScormModel; use Peopleaps\Scorm\Model\ScormScoModel; use Peopleaps\Scorm\Model\ScormScoTrackingModel; -use Ramsey\Uuid\Uuid; +use Illuminate\Support\Str; use ZipArchive; class ScormManager { /** @var ScormLib */ private $scormLib; + /** @var ScormDisk */ + private $scormDisk; /** * Constructor. @@ -38,6 +34,7 @@ class ScormManager public function __construct() { $this->scormLib = new ScormLib(); + $this->scormDisk = new ScormDisk(); } public function uploadScormArchive(UploadedFile $file) @@ -58,18 +55,25 @@ class ScormManager } // save to db - if ($scormData && is_array($scormData)) - // Check if scom package already exists to drop old one. - if (ScormModel::whereOriginFile($scormData['name'])->exists()) { - $this->deleteScormData(ScormModel::whereOriginFile($scormData['name'])->first()); - } + if (is_null($scormData) || !is_array($scormData)) { + throw new InvalidScormArchiveException('invalid_scorm_data'); + } - $scorm = ScormModel::updateOrCreate(['uuid' => $scormData['hashName']], [ - 'version' => $scormData['version'], - 'hash_name' => $scormData['hashName'], - 'origin_file' => $scormData['name'], - 'origin_file_mime' => $scormData['type'] - ]); + $scorm = ScormModel::whereOriginFile($scormData['identifier']); + // Check if scom package already exists to drop old one. + if (!$scorm->exists()) { + $scorm = new ScormModel(); + } else { + $scorm = $scorm->first(); + $this->deleteScormData($scorm); + } + + $scorm->version = $scormData['version']; + $scorm->hash_name = $scormData['hashName']; + $scorm->origin_file = $scormData['identifier']; + $scorm->origin_file_mime = $scormData['type']; + $scorm->uuid = $scormData['hashName']; + $scorm->save(); if (!empty($scormData['scos']) && is_array($scormData['scos'])) { foreach ($scormData['scos'] as $scoData) { @@ -80,25 +84,24 @@ class ScormManager } // Check if scom package already exists update or create when not exists. - $sco = ScormScoModel::updateOrCreate([ - 'scorm_id' => $scorm->id, - 'uuid' => $scoData->uuid - ], [ - 'sco_parent_id' => $scoParent ? $scoParent->id : null, - 'entry_url' => $scoData->entryUrl, - 'identifier' => $scoData->identifier, - 'title' => $scoData->title, - 'visible' => $scoData->visible, - 'sco_parameters' => $scoData->parameters, - 'launch_data' => $scoData->launchData, - 'max_time_allowed' => $scoData->maxTimeAllowed, - 'time_limit_action' => $scoData->timeLimitAction, - 'block' => $scoData->block, - 'score_int' => $scoData->scoreToPassInt, - 'score_decimal' => $scoData->scoreToPassDecimal, - 'completion_threshold' => $scoData->completionThreshold, - 'prerequisites' => $scoData->prerequisites, - ]); + $sco = new ScormScoModel(); + $sco->scorm_id = $scorm->id; + $sco->uuid = $scoData->uuid; + $sco->sco_parent_id = $scoParent ? $scoParent->id : null; + $sco->entry_url = $scoData->entryUrl; + $sco->identifier = $scoData->identifier; + $sco->title = $scoData->title; + $sco->visible = $scoData->visible; + $sco->sco_parameters = $scoData->parameters; + $sco->launch_data = $scoData->launchData; + $sco->max_time_allowed = $scoData->maxTimeAllowed; + $sco->time_limit_action = $scoData->timeLimitAction; + $sco->block = $scoData->block; + $sco->score_int = $scoData->scoreToPassInt; + $sco->score_decimal = $scoData->scoreToPassDecimal; + $sco->completion_threshold = $scoData->completionThreshold; + $sco->prerequisites = $scoData->prerequisites; + $sco->save(); } } @@ -125,8 +128,14 @@ class ScormManager throw new InvalidScormArchiveException('cannot_load_imsmanifest_message'); } - $scormVersionElements = $dom->getElementsByTagName('schemaversion'); + $manifest = $dom->getElementsByTagName('manifest')->item(0); + if (!is_null($manifest->attributes->getNamedItem('identifier'))) { + $data['identifier'] = $manifest->attributes->getNamedItem('identifier')->nodeValue; + } else { + throw new InvalidScormArchiveException('invalid_scorm_manifest_identifier'); + } + $scormVersionElements = $dom->getElementsByTagName('schemaversion'); if ($scormVersionElements->length > 0) { switch ($scormVersionElements->item(0)->textContent) { case '1.2': @@ -153,66 +162,36 @@ class ScormManager return $data; } - public function deleteScormData($model) + public function deleteScorm($model) { // Delete after the previous item is stored if ($model) { - - $oldScos = $model->scos()->get(); - - // Delete all tracking associate with sco - foreach ($oldScos as $oldSco) { - $oldSco->scoTrackings()->delete(); - } - - $model->scos()->delete(); // delete scos + $this->deleteScormData($model); $model->delete(); // delete scorm - - // Delete folder from server - $this->deleteScormFolder($model->hash_name); } } - /** - * @param $folderHashedName - * @return bool - */ - protected function deleteScormFolder($folderHashedName) - { - $response = Storage::disk('scorm')->deleteDirectory($folderHashedName); + private function deleteScormData($model) + { + // Delete after the previous item is stored + $oldScos = $model->scos()->get(); - return $response; + // Delete all tracking associate with sco + foreach ($oldScos as $oldSco) { + $oldSco->scoTrackings()->delete(); + } + $model->scos()->delete(); // delete scos + // Delete folder from server + $this->deleteScormFolder($model->hash_name); } /** - * Unzip a given ZIP file into the web resources directory. - * - * @param string $hashName name of the destination directory + * @param $folderHashedName + * @return bool */ - private function unzipScormArchive(UploadedFile $file, $hashName) + protected function deleteScormFolder($folderHashedName) { - $zip = new \ZipArchive(); - $zip->open($file); - - if (!config()->has('filesystems.disks.' . config('scorm.disk') . '.root')) { - throw new StorageNotFoundException(); - } - - $rootFolder = config('filesystems.disks.' . config('scorm.disk') . '.root'); - - if (substr($rootFolder, -1) != '/') { - // If end with xxx/ - $rootFolder = config('filesystems.disks.' . config('scorm.disk') . '.root') . '/'; - } - - $destinationDir = $rootFolder . $hashName; // file path - - if (!File::isDirectory($destinationDir)) { - File::makeDirectory($destinationDir, 0755, true, true); - } - - $zip->extractTo($destinationDir); - $zip->close(); + return $this->scormDisk->deleteScormFolder($folderHashedName); } /** @@ -222,31 +201,20 @@ class ScormManager */ private function generateScorm(UploadedFile $file) { - $hashName = Uuid::uuid4(); - $hashFileName = $hashName . '.zip'; + $uuid = Str::uuid(); $scormData = $this->parseScormArchive($file); - $this->unzipScormArchive($file, $hashName); - - if (!config()->has('filesystems.disks.' . config('scorm.disk') . '.root')) { - throw new StorageNotFoundException(); - } - - $rootFolder = config('filesystems.disks.' . config('scorm.disk') . '.root'); - - if (substr($rootFolder, -1) != '/') { - // If end with xxx/ - $rootFolder = config('filesystems.disks.' . config('scorm.disk') . '.root') . '/'; - } - - $destinationDir = $rootFolder . $hashName; // file path - - // Move Scorm archive in the files directory - $finalFile = $file->move($destinationDir, $hashName . '.zip'); + /** + * Unzip a given ZIP file into the web resources directory. + * + * @param string $hashName name of the destination directory + */ + $this->scormDisk->unzip($file, $uuid); return [ - 'name' => $hashFileName, // to follow standard file data format - 'hashName' => $hashName, - 'type' => $finalFile->getMimeType(), + 'identifier' => $scormData['identifier'], + // 'name' => $hashFileName, // to follow standard file data format + 'hashName' => $uuid, + 'type' => $file->getMimeType(), 'version' => $scormData['version'], 'scos' => $scormData['scos'], ]; @@ -328,7 +296,7 @@ class ScormManager 'user_id' => $userId, 'sco_id' => $sco->id ], [ - 'uuid' => Uuid::uuid4(), + 'uuid' => Str::uuid(), 'progression' => $scoTracking->getProgression(), 'score_raw' => $scoTracking->getScoreRaw(), 'score_min' => $scoTracking->getScoreMin(), |