diff --git a/composer.json b/composer.json index 9fdb3c3..7f45db7 100644 --- a/composer.json +++ b/composer.json @@ -29,6 +29,7 @@ "laravel-enso/core": "^6.0", "laravel-enso/dynamic-methods": "^2.0", "laravel-enso/enums": "^2.0", + "laravel-enso/excel": "^3.0", "laravel-enso/files": "^4.0", "laravel-enso/helpers": "^2.0", "laravel-enso/io": "^2.0", diff --git a/src/Jobs/ChunkImport.php b/src/Jobs/ChunkImport.php index cf2af63..34fd32a 100644 --- a/src/Jobs/ChunkImport.php +++ b/src/Jobs/ChunkImport.php @@ -2,6 +2,7 @@ namespace LaravelEnso\DataImport\Jobs; +use Illuminate\Bus\Batchable; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; @@ -17,7 +18,7 @@ class ChunkImport implements ShouldQueue { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $queue; diff --git a/src/Jobs/Finalize.php b/src/Jobs/Finalize.php deleted file mode 100644 index cc0bcdc..0000000 --- a/src/Jobs/Finalize.php +++ /dev/null @@ -1,43 +0,0 @@ -dataImport = $dataImport; - - $this->queue = config('enso.imports.queues.rejected'); - } - - public function handle() - { - $this->dataImport->refresh() - ->endOperation(); - - $this->notify(); - } - - private function notify() - { - $this->dataImport->file->createdBy->notify( - (new ImportDone($this->dataImport)) - ->onQueue(config('enso.imports.queues.notifications')) - ); - } -} diff --git a/src/Jobs/RejectedExport.php b/src/Jobs/RejectedExport.php deleted file mode 100644 index 057a751..0000000 --- a/src/Jobs/RejectedExport.php +++ /dev/null @@ -1,38 +0,0 @@ -dataImport = $dataImport; - $this->user = $user; - - $this->queue = config('enso.imports.queues.rejected'); - $this->timeout = (new Template($dataImport->type))->timeout(); - } - - public function handle() - { - (new Rejected($this->dataImport, $this->user))->run(); - } -} diff --git a/src/Services/Exporters/Rejected.php b/src/Services/Exporters/Rejected.php index 5e634a4..36fa55e 100644 --- a/src/Services/Exporters/Rejected.php +++ b/src/Services/Exporters/Rejected.php @@ -30,7 +30,7 @@ public function __construct(DataImport $dataImport, User $user) $this->hashFilename = $this->hashFilename(); } - public function run(): void + public function handle(): void { $this->dumps() ->whenNotEmpty(fn ($dumps) => $this->process($dumps)); diff --git a/src/Services/Importers/Chunk.php b/src/Services/Importers/Chunk.php index 20f45b3..553d57d 100644 --- a/src/Services/Importers/Chunk.php +++ b/src/Services/Importers/Chunk.php @@ -8,14 +8,10 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use LaravelEnso\Core\Models\User; -use LaravelEnso\DataImport\Contracts\AfterHook; use LaravelEnso\DataImport\Contracts\Authenticates; use LaravelEnso\DataImport\Contracts\Authorizes; use LaravelEnso\DataImport\Contracts\Importable; -use LaravelEnso\DataImport\Enums\Statuses; use LaravelEnso\DataImport\Exceptions\DataImport as DataImportExcpetion; -use LaravelEnso\DataImport\Jobs\Finalize; -use LaravelEnso\DataImport\Jobs\RejectedExport; use LaravelEnso\DataImport\Models\DataImport; use LaravelEnso\DataImport\Services\Template; use LaravelEnso\DataImport\Services\Validators\Validation; @@ -59,10 +55,6 @@ public function run(): void $this->dumpRejected() ->updateProgress(); - - if ($this->shouldEnd()) { - $this->finalize(); - } } private function authenticate(): void @@ -141,25 +133,8 @@ private function updateProgress(): void }); } - private function finalize(): void - { - if ($this->importer instanceof AfterHook) { - $this->importer->after($this->user, $this->params); - } - - $this->dataImport->setStatus(Statuses::Processed); - - RejectedExport::withChain([new Finalize($this->dataImport)]) - ->dispatch($this->dataImport, $this->user); - } - private function successful(): int { return $this->chunk->count() - $this->rejected->count(); } - - private function shouldEnd(): bool - { - return $this->dataImport->fresh()->isFinalized(); - } } diff --git a/src/Services/Importers/Finalize.php b/src/Services/Importers/Finalize.php new file mode 100644 index 0000000..ac60cae --- /dev/null +++ b/src/Services/Importers/Finalize.php @@ -0,0 +1,52 @@ +dataImport = $dataImport; + $this->user = $user; + $this->params = $params; + $this->template = $template; + } + + public function handle(): void + { + $this->afterHook(); + + $this->dataImport->refresh() + ->endOperation(); + + $this->notify(); + } + + private function afterHook(): void + { + $this->template->sheetNames() + ->map(fn ($sheet) => $this->template->importer($sheet)) + ->filter(fn ($importer) => $importer instanceof AfterHook) + ->each(fn (AfterHook $importer) => $importer->after($this->user, $this->params)); + } + + private function notify() + { + $this->dataImport->file->createdBy->notify( + (new ImportDone($this->dataImport)) + ->onQueue(config('enso.imports.queues.notifications')) + ); + } +} diff --git a/src/Services/Importers/Import.php b/src/Services/Importers/Import.php index 3476d6d..b2000a9 100644 --- a/src/Services/Importers/Import.php +++ b/src/Services/Importers/Import.php @@ -5,7 +5,9 @@ use Box\Spout\Reader\XLSX\RowIterator; use Carbon\Carbon; use DateTime; +use Illuminate\Bus\PendingBatch; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Bus; use LaravelEnso\Core\Models\User; use LaravelEnso\DataImport\Contracts\BeforeHook; use LaravelEnso\DataImport\Enums\Statuses; @@ -13,6 +15,7 @@ use LaravelEnso\DataImport\Models\DataImport; use LaravelEnso\DataImport\Services\DTOs\Row; use LaravelEnso\DataImport\Services\DTOs\Sheets; +use LaravelEnso\DataImport\Services\Exporters\Rejected; use LaravelEnso\DataImport\Services\Readers\XLSX; use LaravelEnso\DataImport\Services\Template; use LaravelEnso\Helpers\Services\Obj; @@ -28,6 +31,7 @@ class Import private RowIterator $rowIterator; private Collection $header; private Collection $chunk; + private PendingBatch $batch; private string $sheetName; public function __construct(DataImport $dataImport, Template $template, Sheets $sheets, User $user, Obj $params) @@ -38,6 +42,7 @@ public function __construct(DataImport $dataImport, Template $template, Sheets $ $this->user = $user; $this->params = $params; $this->xlsx = new XLSX($dataImport->file->path()); + $this->batch = Bus::batch([]); } public function run(): void @@ -49,6 +54,11 @@ public function run(): void ->beforeHook() ->queueChunks()); + $this->rejected() + ->finalize() + ->batch->onQueue($this->template->queue()) + ->dispatch(); + $this->xlsx->close(); } @@ -72,13 +82,37 @@ private function beforeHook(): self return $this; } - private function queueChunks(): void + private function queueChunks(): self { while (! $this->sheetFinalized() && ! $this->wasCanceled()) { - $this->prepareChunk() + $this->batch->jobs->add($this->prepareChunk() ->fileParseStatus() - ->dispatch(); + ->job()); } + + return $this; + } + + private function rejected(): self + { + $rejected = new Rejected($this->dataImport, $this->user); + $this->batch->then(fn () => $rejected->handle()); + + return $this; + } + + private function finalize(): self + { + $finalize = new Finalize( + $this->dataImport, + $this->template, + $this->user, + $this->params + ); + + $this->batch->then(fn () => $finalize->handle()); + + return $this; } private function prepareChunk(): self @@ -123,9 +157,9 @@ private function fileParseStatus(): self return $this; } - private function dispatch(): void + private function job(): ChunkImport { - ChunkImport::dispatch( + return new ChunkImport( $this->dataImport, $this->template, $this->user,
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: