summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKhaled Lela <eng.khaled.lela@gmail.com>2025-08-14 13:10:00 +0300
committerKhaled Lela <eng.khaled.lela@gmail.com>2025-08-14 13:10:00 +0300
commit924c72de0af5fd00ae171189788b8a713472afba (patch)
tree1df34a0f14de0cedd9013d5ee51b7bdd7f35a8b4 /src
parent70f8710355ec0a91d279b12a2c0e74083dc6e7b6 (diff)
Enhance SCORM file handling with improved error logging and validation. Added checks for disk accessibility and file existence in readScormArchive method. Updated uuid assignment logic in uploadScormFromUri and uploadScormArchive methods.
Diffstat (limited to 'src')
-rw-r--r--src/Manager/ScormDisk.php67
-rw-r--r--src/Manager/ScormManager.php20
2 files changed, 69 insertions, 18 deletions
diff --git a/src/Manager/ScormDisk.php b/src/Manager/ScormDisk.php
index 99988af..47fd3eb 100644
--- a/src/Manager/ScormDisk.php
+++ b/src/Manager/ScormDisk.php
@@ -47,16 +47,35 @@ class ScormDisk
public function readScormArchive($file, callable $fn)
{
try {
+ $archiveDisk = $this->getArchiveDisk();
+
+ // Log the file path being processed for debugging
+ Log::info('Processing SCORM archive file: ' . $file);
+
+ // Check if file exists on archive disk
+ if (!$archiveDisk->exists($file)) {
+ Log::error('File not found on archive disk: ' . $file);
+ throw new StorageNotFoundException('scorm_archive_not_found_on_archive_disk: ' . $file);
+ }
+
+ // Get the stream from archive disk
+ $stream = $archiveDisk->readStream($file);
+ if (!is_resource($stream)) {
+ Log::error('Failed to read stream from archive disk for file: ' . $file . '. Stream type: ' . gettype($stream));
+ throw new StorageNotFoundException('failed_to_read_scorm_archive_stream: ' . $file);
+ }
+
if (Storage::exists($file)) {
Storage::delete($file);
}
- Storage::writeStream($file, $this->getArchiveDisk()->readStream($file));
+
+ Storage::writeStream($file, $stream);
$path = Storage::path($file);
call_user_func($fn, $path);
// Clean local resources
$this->clean($file);
} catch (Exception $ex) {
- Log::error($ex->getMessage());
+ Log::error('Error in readScormArchive: ' . $ex->getMessage() . ' for file: ' . $file);
throw new StorageNotFoundException('scorm_archive_not_found');
}
}
@@ -132,10 +151,26 @@ class ScormDisk
*/
private function getDisk()
{
- if (!config()->has('filesystems.disks.' . config('scorm.disk'))) {
- throw new StorageNotFoundException('scorm_disk_not_define');
+ $diskName = config('scorm.disk');
+ if (empty($diskName)) {
+ throw new StorageNotFoundException('scorm_disk_not_configured');
}
- return Storage::disk(config('scorm.disk'));
+
+ if (!config()->has('filesystems.disks.' . $diskName)) {
+ throw new StorageNotFoundException('scorm_disk_not_define: ' . $diskName);
+ }
+
+ $disk = Storage::disk($diskName);
+
+ // Test if the disk is accessible
+ try {
+ $disk->exists('test');
+ } catch (Exception $ex) {
+ Log::error('SCORM disk not accessible: ' . $ex->getMessage());
+ throw new StorageNotFoundException('scorm_disk_not_accessible: ' . $diskName);
+ }
+
+ return $disk;
}
/**
@@ -143,9 +178,25 @@ class ScormDisk
*/
private function getArchiveDisk()
{
- if (!config()->has('filesystems.disks.' . config('scorm.archive'))) {
- throw new StorageNotFoundException('scorm_archive_disk_not_define');
+ $archiveDiskName = config('scorm.archive');
+ if (empty($archiveDiskName)) {
+ throw new StorageNotFoundException('scorm_archive_disk_not_configured');
+ }
+
+ if (!config()->has('filesystems.disks.' . $archiveDiskName)) {
+ throw new StorageNotFoundException('scorm_archive_disk_not_define: ' . $archiveDiskName);
+ }
+
+ $disk = Storage::disk($archiveDiskName);
+
+ // Test if the disk is accessible
+ try {
+ $disk->exists('test');
+ } catch (Exception $ex) {
+ Log::error('Archive disk not accessible: ' . $ex->getMessage());
+ throw new StorageNotFoundException('scorm_archive_disk_not_accessible: ' . $archiveDiskName);
}
- return Storage::disk(config('scorm.archive'));
+
+ return $disk;
}
}
diff --git a/src/Manager/ScormManager.php b/src/Manager/ScormManager.php
index 2dcaa5e..abf1e26 100644
--- a/src/Manager/ScormManager.php
+++ b/src/Manager/ScormManager.php
@@ -42,12 +42,16 @@ class ScormManager
public function uploadScormFromUri($file, $uuid = null)
{
// $uuid is meant for user to update scorm content. Hence, if user want to update content should parse in existing uuid
- if (!empty($uuid)) {
- $this->uuid = $uuid;
- } else {
- $this->uuid = Str::uuid();
+ $this->uuid = $uuid ?? Str::uuid()->toString();
+
+ // Validate that the file parameter is not empty
+ if (empty($file)) {
+ throw new InvalidScormArchiveException('file_parameter_empty');
}
+ // Log the file being processed for debugging
+ \Log::info('Uploading SCORM from URI: ' . $file);
+
$scorm = null;
$this->scormDisk->readScormArchive($file, function ($path) use (&$scorm, $file, $uuid) {
$filename = basename($file);
@@ -65,11 +69,7 @@ class ScormManager
public function uploadScormArchive(UploadedFile $file, $uuid = null)
{
// $uuid is meant for user to update scorm content. Hence, if user want to update content should parse in existing uuid
- if (!empty($uuid)) {
- $this->uuid = $uuid;
- } else {
- $this->uuid = Str::uuid();
- }
+ $this->uuid = $uuid ?? Str::uuid()->toString();
return $this->saveScorm($file, $file->getClientOriginalName(), $uuid);
}
@@ -401,7 +401,7 @@ class ScormManager
'user_id' => $userId,
'sco_id' => $sco->id
], [
- 'uuid' => Str::uuid(),
+ 'uuid' => Str::uuid()->toString(),
'progression' => $scoTracking->getProgression(),
'score_raw' => $scoTracking->getScoreRaw(),
'score_min' => $scoTracking->getScoreMin(),