From 0fb516a04c0454fdda243b038a5343e55db49aec Mon Sep 17 00:00:00 2001 From: Nuradiyana Date: Tue, 23 Jan 2024 09:15:42 +0700 Subject: [PATCH] Make abstract class import --- src/AbstractModelRecordImport.php | 90 ++++++++++++++++++++++ src/Actions/StoreModelUploadFile.php | 9 ++- src/Events/ModelUploadFileWasProcessed.php | 15 ++++ src/Jobs/ProcessModelRecordJob.php | 5 ++ src/ModelRecordImport.php | 87 +-------------------- src/ModelUpload.php | 18 ++++- src/ModelUploadServiceProvider.php | 17 +--- 7 files changed, 135 insertions(+), 106 deletions(-) create mode 100644 src/AbstractModelRecordImport.php create mode 100644 src/Events/ModelUploadFileWasProcessed.php diff --git a/src/AbstractModelRecordImport.php b/src/AbstractModelRecordImport.php new file mode 100644 index 0000000..4a95146 --- /dev/null +++ b/src/AbstractModelRecordImport.php @@ -0,0 +1,90 @@ +uploadFile = $uploadFile; + + return $this; + } + + public function withMeta(array $meta): self + { + $this->meta = $meta; + + return $this; + } + + public function process(): PendingDispatch + { + Assert::notNull($this->uploadFile); + + return $this->queue( + $this->uploadFile->getAttribute('file_path'), + $this->uploadFile->getAttribute('storage_disk'), + ); + } + + public function batchSize(): int + { + return 500; + } + + public function chunkSize(): int + { + return 500; + } + + public function registerEvents(): array + { + return [ + AfterImport::class => function (): void { + Assert::notNull($this->uploadFile); + + dispatch(new ProcessModelRecordJob($this->uploadFile)); + }, + ]; + } + + public function sheets(): array + { + return [ + 'DATA' => $this, + ]; + } + + public function onUnknownSheet($sheetName): void + { + } + + public function startCell(): string + { + return ModelUpload::importStartCell(); + } +} diff --git a/src/Actions/StoreModelUploadFile.php b/src/Actions/StoreModelUploadFile.php index 63fe3cb..ec510e6 100644 --- a/src/Actions/StoreModelUploadFile.php +++ b/src/Actions/StoreModelUploadFile.php @@ -5,14 +5,19 @@ namespace FromHome\ModelUpload\Actions; use Illuminate\Http\UploadedFile; -use FromHome\ModelUpload\ModelRecordImport; use Illuminate\Contracts\Auth\Authenticatable; use FromHome\ModelUpload\Enums\UploadFileState; use FromHome\ModelUpload\Models\ModelUploadFile; +use FromHome\ModelUpload\AbstractModelRecordImport; use Illuminate\Database\Eloquent\Relations\Relation; final class StoreModelUploadFile { + public function __construct( + private readonly AbstractModelRecordImport $modelRecordImport) + { + } + public function handle(Authenticatable $user, UploadedFile $uploadedFile, string $modelType, array $meta): ModelUploadFile { if (! \array_key_exists($modelType, Relation::morphMap())) { @@ -31,7 +36,7 @@ public function handle(Authenticatable $user, UploadedFile $uploadedFile, string 'state' => UploadFileState::upload, ]); - ModelRecordImport::new()->forFile($file)->withMeta($meta)->process(); + $this->modelRecordImport->forFile($file)->withMeta($meta)->process(); return $file; } diff --git a/src/Events/ModelUploadFileWasProcessed.php b/src/Events/ModelUploadFileWasProcessed.php new file mode 100644 index 0000000..5ce2f5c --- /dev/null +++ b/src/Events/ModelUploadFileWasProcessed.php @@ -0,0 +1,15 @@ +modelUploadFile)); + return; } @@ -74,5 +77,7 @@ public function handle(RecordProcessorManager $manager): void $this->modelUploadFile->update([ 'state' => $errorCount === 0 ? UploadFileState::done : $errorState, ]); + + event(new ModelUploadFileWasProcessed($this->modelUploadFile)); } } diff --git a/src/ModelRecordImport.php b/src/ModelRecordImport.php index c9a3f08..f6d87d6 100644 --- a/src/ModelRecordImport.php +++ b/src/ModelRecordImport.php @@ -7,58 +7,10 @@ use Illuminate\Support\Str; use Webmozart\Assert\Assert; use Maatwebsite\Excel\Concerns\ToModel; -use Maatwebsite\Excel\Events\AfterImport; -use Maatwebsite\Excel\Concerns\Importable; -use Maatwebsite\Excel\Concerns\WithEvents; -use Illuminate\Contracts\Queue\ShouldQueue; -use Illuminate\Foundation\Bus\PendingDispatch; -use Maatwebsite\Excel\Concerns\WithHeadingRow; -use FromHome\ModelUpload\Models\ModelUploadFile; -use Maatwebsite\Excel\Concerns\WithBatchInserts; -use Maatwebsite\Excel\Concerns\WithChunkReading; use FromHome\ModelUpload\Models\ModelUploadRecord; -use Maatwebsite\Excel\Concerns\SkipsUnknownSheets; -use Maatwebsite\Excel\Concerns\WithMultipleSheets; -use Maatwebsite\Excel\Concerns\WithCustomStartCell; -use FromHome\ModelUpload\Jobs\ProcessModelRecordJob; -final class ModelRecordImport implements ShouldQueue, SkipsUnknownSheets, ToModel, WithBatchInserts, WithChunkReading, WithCustomStartCell, WithEvents, WithHeadingRow, WithMultipleSheets +final class ModelRecordImport extends AbstractModelRecordImport implements ToModel { - use Importable; - - private ?ModelUploadFile $uploadFile = null; - - private array $meta = []; - - public static function new(): self - { - return new self(); - } - - public function forFile(ModelUploadFile $uploadFile): self - { - $this->uploadFile = $uploadFile; - - return $this; - } - - public function withMeta(array $meta): self - { - $this->meta = $meta; - - return $this; - } - - public function process(): PendingDispatch - { - Assert::notNull($this->uploadFile); - - return $this->queue( - $this->uploadFile->getAttribute('file_path'), - $this->uploadFile->getAttribute('storage_disk'), - ); - } - public function model(array $row): ModelUploadRecord { Assert::notNull($this->uploadFile); @@ -70,41 +22,4 @@ public function model(array $row): ModelUploadRecord 'meta' => $this->meta, ]); } - - public function batchSize(): int - { - return 500; - } - - public function chunkSize(): int - { - return 500; - } - - public function registerEvents(): array - { - return [ - AfterImport::class => function (): void { - Assert::notNull($this->uploadFile); - - dispatch(new ProcessModelRecordJob($this->uploadFile)); - }, - ]; - } - - public function sheets(): array - { - return [ - 'DATA' => $this, - ]; - } - - public function onUnknownSheet($sheetName): void - { - } - - public function startCell(): string - { - return ModelUpload::importStartCell(); - } } diff --git a/src/ModelUpload.php b/src/ModelUpload.php index 7952ee6..a40f953 100755 --- a/src/ModelUpload.php +++ b/src/ModelUpload.php @@ -4,6 +4,7 @@ namespace FromHome\ModelUpload; +use Throwable; use Illuminate\Http\Request; use Illuminate\Http\UploadedFile; use FromHome\ModelUpload\Models\ModelUploadFile; @@ -24,6 +25,19 @@ public static function useImportStartCell(string $importStartCell): void self::$importStartCell = $importStartCell; } + /** + * @throws Throwable + */ + public static function useModelRecordImporter(string $importerClass): void + { + \throw_if( + \class_exists($importerClass), + new \InvalidArgumentException('Invalid concrete class') + ); + + app()->bind(AbstractModelRecordImport::class, $importerClass); + } + public static function registerRecordProcessors(array $processors): void { /** @var RecordProcessorManager $manager */ @@ -32,7 +46,7 @@ public static function registerRecordProcessors(array $processors): void $manager->registerRecordProcessors($processors); } - public static function storeModelUploadFile(Request $request, array $meta = []): ModelUploadFile + public static function storeModelUploadFile(Request $request, array $meta = [], ?string $modelType = null): ModelUploadFile { /** @var StoreModelUploadFile $action */ $action = app(StoreModelUploadFile::class); @@ -41,7 +55,7 @@ public static function storeModelUploadFile(Request $request, array $meta = []): $file = $request->file('file'); return $action->handle( - $request->user(), $file, $request->input('model_type'), $meta + $request->user(), $file, $modelType ?? $request->input('model_type'), $meta ); } } diff --git a/src/ModelUploadServiceProvider.php b/src/ModelUploadServiceProvider.php index 0bb5fd9..ca96920 100644 --- a/src/ModelUploadServiceProvider.php +++ b/src/ModelUploadServiceProvider.php @@ -8,16 +8,6 @@ use FromHome\ModelUpload\Actions\StoreModelUploadFile; use Spatie\LaravelPackageTools\PackageServiceProvider; use FromHome\ModelUpload\Processor\RecordProcessorManager; -use FromHome\ModelUpload\Http\Responses\FetchUserFileUploadView; -use FromHome\ModelUpload\Http\Responses\StoreUserFileUploadView; -use FromHome\ModelUpload\Http\Responses\CreateUserFileUploadView; -use FromHome\ModelUpload\Http\Responses\ShowFileUploadRecordView; -use FromHome\ModelUpload\Http\Responses\FetchFileUploadRecordView; -use FromHome\ModelUpload\Http\Responses\FetchUserFileUploadResponse; -use FromHome\ModelUpload\Http\Responses\StoreUserFileUploadResponse; -use FromHome\ModelUpload\Http\Responses\CreateUserFileUploadResponse; -use FromHome\ModelUpload\Http\Responses\ShowFileUploadRecordResponse; -use FromHome\ModelUpload\Http\Responses\FetchFileUploadRecordResponse; final class ModelUploadServiceProvider extends PackageServiceProvider { @@ -26,12 +16,7 @@ public function registeringPackage(): void $this->app->singleton(StoreModelUploadFile::class); $this->app->singleton(RecordProcessorManager::class); - $this->app->bind(FetchUserFileUploadResponse::class, FetchUserFileUploadView::class); - $this->app->bind(CreateUserFileUploadResponse::class, CreateUserFileUploadView::class); - $this->app->bind(StoreUserFileUploadResponse::class, StoreUserFileUploadView::class); - - $this->app->bind(FetchFileUploadRecordResponse::class, FetchFileUploadRecordView::class); - $this->app->bind(ShowFileUploadRecordResponse::class, ShowFileUploadRecordView::class); + $this->app->bind(AbstractModelRecordImport::class, ModelRecordImport::class); } public function configurePackage(Package $package): void