From c776e7b10266dd165409a886f391466a4f594f08 Mon Sep 17 00:00:00 2001 From: James Collins Date: Wed, 30 Aug 2023 10:52:07 +1000 Subject: [PATCH] media job model --- app/Conductors/MediaJobConductor.php | 135 ++++++++++++++++++ .../Controllers/Api/MediaJobController.php | 10 ++ app/Models/Media.php | 2 +- app/Models/MediaJob.php | 35 +++++ ...3_08_29_211400_create_media_jobs_table.php | 36 +++++ 5 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 app/Conductors/MediaJobConductor.php create mode 100644 app/Http/Controllers/Api/MediaJobController.php create mode 100644 app/Models/MediaJob.php create mode 100644 database/migrations/2023_08_29_211400_create_media_jobs_table.php diff --git a/app/Conductors/MediaJobConductor.php b/app/Conductors/MediaJobConductor.php new file mode 100644 index 0000000..e71eb7d --- /dev/null +++ b/app/Conductors/MediaJobConductor.php @@ -0,0 +1,135 @@ +user(); + if ($user === null || $user->hasPermission('admin/media') === false) { + $fields = arrayRemoveItem($fields, ['permission', 'storage']); + } + + return $fields; + } + + /** + * Run a scope query on the collection before anything else. + * + * @param Builder $builder The builder in use. + * @return void + */ + public function scope(Builder $builder): void + { + $user = auth()->user(); + if ($user === null) { + $builder->where('permission', ''); + } else { + $builder->where('permission', '')->orWhereIn('permission', $user->permissions); + } + } + + /** + * Return if the current model is visible. + * + * @param Model $model The model. + * @return boolean Allow model to be visible. + */ + public static function viewable(Model $model): bool + { + if ($model->permission !== '') { + /** @var \App\Models\User */ + $user = auth()->user(); + if ($user === null || $user->hasPermission($model->permission) === false) { + return false; + } + } + + return true; + } + + /** + * Return if the current model is creatable. + * + * @return boolean Allow creating model. + */ + public static function creatable(): bool + { + $user = auth()->user(); + return ($user !== null); + } + + /** + * Return if the current model is updatable. + * + * @param Model $model The model. + * @return boolean Allow updating model. + */ + public static function updatable(Model $model): bool + { + /** @var \App\Models\User */ + $user = auth()->user(); + return ($user !== null && (strcasecmp($model->user_id, $user->id) === 0 || + $user->hasPermission('admin/media') === true)); + } + + /** + * Return if the current model is destroyable. + * + * @param Model $model The model. + * @return boolean Allow deleting model. + */ + public static function destroyable(Model $model): bool + { + /** @var \App\Models\User */ + $user = auth()->user(); + return ($user !== null && ($model->user_id === $user->id || $user->hasPermission('admin/media') === true)); + } + + /** + * Transform the final model data + * + * @param array $data The model data to transform. + * @return array The transformed model. + */ + public function transformFinal(array $data): array + { + unset($data['user_id']); + return $data; + } +} diff --git a/app/Http/Controllers/Api/MediaJobController.php b/app/Http/Controllers/Api/MediaJobController.php new file mode 100644 index 0000000..8768422 --- /dev/null +++ b/app/Http/Controllers/Api/MediaJobController.php @@ -0,0 +1,10 @@ +open($filePath); $frame = $video->frame(TimeCode::fromSeconds(5)); $frame->save($tempImagePath); - } catch(\Exception $e) { + } catch (\Exception $e) { Log::error($e); } diff --git a/app/Models/MediaJob.php b/app/Models/MediaJob.php new file mode 100644 index 0000000..25395d6 --- /dev/null +++ b/app/Models/MediaJob.php @@ -0,0 +1,35 @@ +belongsTo(User::class); + } + + /** + * Return the media item + * + * @return BelongsTo + */ + public function media(): BelongsTo + { + return $this->belongsTo(Media::class); + } +} diff --git a/database/migrations/2023_08_29_211400_create_media_jobs_table.php b/database/migrations/2023_08_29_211400_create_media_jobs_table.php new file mode 100644 index 0000000..24b9f77 --- /dev/null +++ b/database/migrations/2023_08_29_211400_create_media_jobs_table.php @@ -0,0 +1,36 @@ +uuid()->primary(); + $table->timestamps(); + $table->uuid('user_id'); + $table->uuid('media_id'); // Add a foreign key for the media model + $table->string('status'); + $table->string('status_text'); + $table->text('data'); + $table->integer('progress')->default(0); // Add a column for job progress + + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); + $table->foreign('media_id')->references('id')->on('media')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('media_jobs'); + } +};