Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions src/AbstractModelRecordImport.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
<?php

declare(strict_types=1);

namespace FromHome\ModelUpload;

use Webmozart\Assert\Assert;
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 Maatwebsite\Excel\Concerns\SkipsUnknownSheets;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
use FromHome\ModelUpload\Jobs\ProcessModelRecordJob;

abstract class AbstractModelRecordImport implements ShouldQueue, SkipsUnknownSheets, WithBatchInserts, WithChunkReading, WithCustomStartCell, WithEvents, WithHeadingRow, WithMultipleSheets
{
use Importable;

protected ?ModelUploadFile $uploadFile = null;

protected array $meta = [];

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 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();
}
}
9 changes: 7 additions & 2 deletions src/Actions/StoreModelUploadFile.php
Original file line number Diff line number Diff line change
Expand Up @@ -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())) {
Expand All @@ -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;
}
Expand Down
15 changes: 15 additions & 0 deletions src/Events/ModelUploadFileWasProcessed.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace FromHome\ModelUpload\Events;

use FromHome\ModelUpload\Models\ModelUploadFile;

final class ModelUploadFileWasProcessed
{
public function __construct(
public readonly ModelUploadFile $modelUploadFile
) {
}
}
5 changes: 5 additions & 0 deletions src/Jobs/ProcessModelRecordJob.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use FromHome\ModelUpload\Models\ModelUploadFile;
use FromHome\ModelUpload\Models\ModelUploadRecord;
use FromHome\ModelUpload\Processor\RecordProcessorManager;
use FromHome\ModelUpload\Events\ModelUploadFileWasProcessed;

final class ProcessModelRecordJob implements ShouldQueue
{
Expand Down Expand Up @@ -45,6 +46,8 @@ public function handle(RecordProcessorManager $manager): void
),
]);

event(new ModelUploadFileWasProcessed($this->modelUploadFile));

return;
}

Expand Down Expand Up @@ -74,5 +77,7 @@ public function handle(RecordProcessorManager $manager): void
$this->modelUploadFile->update([
'state' => $errorCount === 0 ? UploadFileState::done : $errorState,
]);

event(new ModelUploadFileWasProcessed($this->modelUploadFile));
}
}
87 changes: 1 addition & 86 deletions src/ModelRecordImport.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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();
}
}
18 changes: 16 additions & 2 deletions src/ModelUpload.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace FromHome\ModelUpload;

use Throwable;
use Illuminate\Http\Request;
use Illuminate\Http\UploadedFile;
use FromHome\ModelUpload\Models\ModelUploadFile;
Expand All @@ -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 */
Expand All @@ -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);
Expand All @@ -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
);
}
}
17 changes: 1 addition & 16 deletions src/ModelUploadServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand All @@ -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
Expand Down