diff --git a/src/File/Commands/PruneUnownedFilesCommand.php b/src/File/Commands/PruneUnownedFilesCommand.php new file mode 100644 index 0000000..ecde669 --- /dev/null +++ b/src/File/Commands/PruneUnownedFilesCommand.php @@ -0,0 +1,32 @@ +argument('purpose'); + + $deleted = $files->pruneUnowned($purpose, now()->subHours((int) $this->option('hours'))); + + $this->info("Deleted {$deleted} unowned file(s) of purpose \"{$purpose}\"."); + + return self::SUCCESS; + } +} diff --git a/src/File/Http/Controllers/UploadFileController.php b/src/File/Http/Controllers/UploadFileController.php new file mode 100644 index 0000000..07e1eeb --- /dev/null +++ b/src/File/Http/Controllers/UploadFileController.php @@ -0,0 +1,76 @@ +all() would be. Must include a 'file' rule accepting an + * uploaded file — this class always reads the file from that key. + * + * @return array> + */ + abstract protected function validationRules(Request $request): array; + + public function store(Request $request, FileService $files): JsonResponse + { + $validator = Validator::make( + $request->all(), + $this->validationRules($request), + $this->validationMessages($request), + $this->validationAttributes($request), + ); + + if ($validator->fails()) { + return response()->json(['error' => $validator->errors()->first('file')], 422); + } + + $file = $files->store($request->file('file'), $this->purpose()); + + return response()->json(['file_id' => $file->id]); + } + + /** + * @return array + */ + protected function validationMessages(Request $request): array + { + return []; + } + + /** + * @return array + */ + protected function validationAttributes(Request $request): array + { + return []; + } +} diff --git a/src/Providers/FileServiceProvider.php b/src/Providers/FileServiceProvider.php index 3066924..9aaf45b 100644 --- a/src/Providers/FileServiceProvider.php +++ b/src/Providers/FileServiceProvider.php @@ -9,6 +9,7 @@ use InvalidArgumentException; use Modules\Core\Cart\Events\CartLineAdded; use Modules\Core\Checkout\Events\OrderPlaced; use Modules\Core\File\Adapters\LocalFileAdapter; +use Modules\Core\File\Commands\PruneUnownedFilesCommand; use Modules\Core\File\Contracts\FileAdapterInterface; use Modules\Core\File\Listeners\AttachCustomFieldFileToCartLine; use Modules\Core\File\Listeners\TransferCustomFieldFileOwnership; @@ -42,5 +43,9 @@ class FileServiceProvider extends ServiceProvider Event::listen(CartLineAdded::class, AttachCustomFieldFileToCartLine::class); Event::listen(OrderPlaced::class, TransferCustomFieldFileOwnership::class); + + if ($this->app->runningInConsole()) { + $this->commands([PruneUnownedFilesCommand::class]); + } } }