Skip to content

Commit 834f835

Browse files
authored
Merge pull request #14 from atfromhome/refactoring-impoter
Make abstract class import
2 parents 24fab9d + 0fb516a commit 834f835

File tree

7 files changed

+135
-106
lines changed

7 files changed

+135
-106
lines changed

src/AbstractModelRecordImport.php

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FromHome\ModelUpload;
6+
7+
use Webmozart\Assert\Assert;
8+
use Maatwebsite\Excel\Events\AfterImport;
9+
use Maatwebsite\Excel\Concerns\Importable;
10+
use Maatwebsite\Excel\Concerns\WithEvents;
11+
use Illuminate\Contracts\Queue\ShouldQueue;
12+
use Illuminate\Foundation\Bus\PendingDispatch;
13+
use Maatwebsite\Excel\Concerns\WithHeadingRow;
14+
use FromHome\ModelUpload\Models\ModelUploadFile;
15+
use Maatwebsite\Excel\Concerns\WithBatchInserts;
16+
use Maatwebsite\Excel\Concerns\WithChunkReading;
17+
use Maatwebsite\Excel\Concerns\SkipsUnknownSheets;
18+
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
19+
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
20+
use FromHome\ModelUpload\Jobs\ProcessModelRecordJob;
21+
22+
abstract class AbstractModelRecordImport implements ShouldQueue, SkipsUnknownSheets, WithBatchInserts, WithChunkReading, WithCustomStartCell, WithEvents, WithHeadingRow, WithMultipleSheets
23+
{
24+
use Importable;
25+
26+
protected ?ModelUploadFile $uploadFile = null;
27+
28+
protected array $meta = [];
29+
30+
public function forFile(ModelUploadFile $uploadFile): self
31+
{
32+
$this->uploadFile = $uploadFile;
33+
34+
return $this;
35+
}
36+
37+
public function withMeta(array $meta): self
38+
{
39+
$this->meta = $meta;
40+
41+
return $this;
42+
}
43+
44+
public function process(): PendingDispatch
45+
{
46+
Assert::notNull($this->uploadFile);
47+
48+
return $this->queue(
49+
$this->uploadFile->getAttribute('file_path'),
50+
$this->uploadFile->getAttribute('storage_disk'),
51+
);
52+
}
53+
54+
public function batchSize(): int
55+
{
56+
return 500;
57+
}
58+
59+
public function chunkSize(): int
60+
{
61+
return 500;
62+
}
63+
64+
public function registerEvents(): array
65+
{
66+
return [
67+
AfterImport::class => function (): void {
68+
Assert::notNull($this->uploadFile);
69+
70+
dispatch(new ProcessModelRecordJob($this->uploadFile));
71+
},
72+
];
73+
}
74+
75+
public function sheets(): array
76+
{
77+
return [
78+
'DATA' => $this,
79+
];
80+
}
81+
82+
public function onUnknownSheet($sheetName): void
83+
{
84+
}
85+
86+
public function startCell(): string
87+
{
88+
return ModelUpload::importStartCell();
89+
}
90+
}

src/Actions/StoreModelUploadFile.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,19 @@
55
namespace FromHome\ModelUpload\Actions;
66

77
use Illuminate\Http\UploadedFile;
8-
use FromHome\ModelUpload\ModelRecordImport;
98
use Illuminate\Contracts\Auth\Authenticatable;
109
use FromHome\ModelUpload\Enums\UploadFileState;
1110
use FromHome\ModelUpload\Models\ModelUploadFile;
11+
use FromHome\ModelUpload\AbstractModelRecordImport;
1212
use Illuminate\Database\Eloquent\Relations\Relation;
1313

1414
final class StoreModelUploadFile
1515
{
16+
public function __construct(
17+
private readonly AbstractModelRecordImport $modelRecordImport)
18+
{
19+
}
20+
1621
public function handle(Authenticatable $user, UploadedFile $uploadedFile, string $modelType, array $meta): ModelUploadFile
1722
{
1823
if (! \array_key_exists($modelType, Relation::morphMap())) {
@@ -31,7 +36,7 @@ public function handle(Authenticatable $user, UploadedFile $uploadedFile, string
3136
'state' => UploadFileState::upload,
3237
]);
3338

34-
ModelRecordImport::new()->forFile($file)->withMeta($meta)->process();
39+
$this->modelRecordImport->forFile($file)->withMeta($meta)->process();
3540

3641
return $file;
3742
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace FromHome\ModelUpload\Events;
6+
7+
use FromHome\ModelUpload\Models\ModelUploadFile;
8+
9+
final class ModelUploadFileWasProcessed
10+
{
11+
public function __construct(
12+
public readonly ModelUploadFile $modelUploadFile
13+
) {
14+
}
15+
}

src/Jobs/ProcessModelRecordJob.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use FromHome\ModelUpload\Models\ModelUploadFile;
1515
use FromHome\ModelUpload\Models\ModelUploadRecord;
1616
use FromHome\ModelUpload\Processor\RecordProcessorManager;
17+
use FromHome\ModelUpload\Events\ModelUploadFileWasProcessed;
1718

1819
final class ProcessModelRecordJob implements ShouldQueue
1920
{
@@ -45,6 +46,8 @@ public function handle(RecordProcessorManager $manager): void
4546
),
4647
]);
4748

49+
event(new ModelUploadFileWasProcessed($this->modelUploadFile));
50+
4851
return;
4952
}
5053

@@ -74,5 +77,7 @@ public function handle(RecordProcessorManager $manager): void
7477
$this->modelUploadFile->update([
7578
'state' => $errorCount === 0 ? UploadFileState::done : $errorState,
7679
]);
80+
81+
event(new ModelUploadFileWasProcessed($this->modelUploadFile));
7782
}
7883
}

src/ModelRecordImport.php

Lines changed: 1 addition & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -7,58 +7,10 @@
77
use Illuminate\Support\Str;
88
use Webmozart\Assert\Assert;
99
use Maatwebsite\Excel\Concerns\ToModel;
10-
use Maatwebsite\Excel\Events\AfterImport;
11-
use Maatwebsite\Excel\Concerns\Importable;
12-
use Maatwebsite\Excel\Concerns\WithEvents;
13-
use Illuminate\Contracts\Queue\ShouldQueue;
14-
use Illuminate\Foundation\Bus\PendingDispatch;
15-
use Maatwebsite\Excel\Concerns\WithHeadingRow;
16-
use FromHome\ModelUpload\Models\ModelUploadFile;
17-
use Maatwebsite\Excel\Concerns\WithBatchInserts;
18-
use Maatwebsite\Excel\Concerns\WithChunkReading;
1910
use FromHome\ModelUpload\Models\ModelUploadRecord;
20-
use Maatwebsite\Excel\Concerns\SkipsUnknownSheets;
21-
use Maatwebsite\Excel\Concerns\WithMultipleSheets;
22-
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
23-
use FromHome\ModelUpload\Jobs\ProcessModelRecordJob;
2411

25-
final class ModelRecordImport implements ShouldQueue, SkipsUnknownSheets, ToModel, WithBatchInserts, WithChunkReading, WithCustomStartCell, WithEvents, WithHeadingRow, WithMultipleSheets
12+
final class ModelRecordImport extends AbstractModelRecordImport implements ToModel
2613
{
27-
use Importable;
28-
29-
private ?ModelUploadFile $uploadFile = null;
30-
31-
private array $meta = [];
32-
33-
public static function new(): self
34-
{
35-
return new self();
36-
}
37-
38-
public function forFile(ModelUploadFile $uploadFile): self
39-
{
40-
$this->uploadFile = $uploadFile;
41-
42-
return $this;
43-
}
44-
45-
public function withMeta(array $meta): self
46-
{
47-
$this->meta = $meta;
48-
49-
return $this;
50-
}
51-
52-
public function process(): PendingDispatch
53-
{
54-
Assert::notNull($this->uploadFile);
55-
56-
return $this->queue(
57-
$this->uploadFile->getAttribute('file_path'),
58-
$this->uploadFile->getAttribute('storage_disk'),
59-
);
60-
}
61-
6214
public function model(array $row): ModelUploadRecord
6315
{
6416
Assert::notNull($this->uploadFile);
@@ -70,41 +22,4 @@ public function model(array $row): ModelUploadRecord
7022
'meta' => $this->meta,
7123
]);
7224
}
73-
74-
public function batchSize(): int
75-
{
76-
return 500;
77-
}
78-
79-
public function chunkSize(): int
80-
{
81-
return 500;
82-
}
83-
84-
public function registerEvents(): array
85-
{
86-
return [
87-
AfterImport::class => function (): void {
88-
Assert::notNull($this->uploadFile);
89-
90-
dispatch(new ProcessModelRecordJob($this->uploadFile));
91-
},
92-
];
93-
}
94-
95-
public function sheets(): array
96-
{
97-
return [
98-
'DATA' => $this,
99-
];
100-
}
101-
102-
public function onUnknownSheet($sheetName): void
103-
{
104-
}
105-
106-
public function startCell(): string
107-
{
108-
return ModelUpload::importStartCell();
109-
}
11025
}

src/ModelUpload.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace FromHome\ModelUpload;
66

7+
use Throwable;
78
use Illuminate\Http\Request;
89
use Illuminate\Http\UploadedFile;
910
use FromHome\ModelUpload\Models\ModelUploadFile;
@@ -24,6 +25,19 @@ public static function useImportStartCell(string $importStartCell): void
2425
self::$importStartCell = $importStartCell;
2526
}
2627

28+
/**
29+
* @throws Throwable
30+
*/
31+
public static function useModelRecordImporter(string $importerClass): void
32+
{
33+
\throw_if(
34+
\class_exists($importerClass),
35+
new \InvalidArgumentException('Invalid concrete class')
36+
);
37+
38+
app()->bind(AbstractModelRecordImport::class, $importerClass);
39+
}
40+
2741
public static function registerRecordProcessors(array $processors): void
2842
{
2943
/** @var RecordProcessorManager $manager */
@@ -32,7 +46,7 @@ public static function registerRecordProcessors(array $processors): void
3246
$manager->registerRecordProcessors($processors);
3347
}
3448

35-
public static function storeModelUploadFile(Request $request, array $meta = []): ModelUploadFile
49+
public static function storeModelUploadFile(Request $request, array $meta = [], ?string $modelType = null): ModelUploadFile
3650
{
3751
/** @var StoreModelUploadFile $action */
3852
$action = app(StoreModelUploadFile::class);
@@ -41,7 +55,7 @@ public static function storeModelUploadFile(Request $request, array $meta = []):
4155
$file = $request->file('file');
4256

4357
return $action->handle(
44-
$request->user(), $file, $request->input('model_type'), $meta
58+
$request->user(), $file, $modelType ?? $request->input('model_type'), $meta
4559
);
4660
}
4761
}

src/ModelUploadServiceProvider.php

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,6 @@
88
use FromHome\ModelUpload\Actions\StoreModelUploadFile;
99
use Spatie\LaravelPackageTools\PackageServiceProvider;
1010
use FromHome\ModelUpload\Processor\RecordProcessorManager;
11-
use FromHome\ModelUpload\Http\Responses\FetchUserFileUploadView;
12-
use FromHome\ModelUpload\Http\Responses\StoreUserFileUploadView;
13-
use FromHome\ModelUpload\Http\Responses\CreateUserFileUploadView;
14-
use FromHome\ModelUpload\Http\Responses\ShowFileUploadRecordView;
15-
use FromHome\ModelUpload\Http\Responses\FetchFileUploadRecordView;
16-
use FromHome\ModelUpload\Http\Responses\FetchUserFileUploadResponse;
17-
use FromHome\ModelUpload\Http\Responses\StoreUserFileUploadResponse;
18-
use FromHome\ModelUpload\Http\Responses\CreateUserFileUploadResponse;
19-
use FromHome\ModelUpload\Http\Responses\ShowFileUploadRecordResponse;
20-
use FromHome\ModelUpload\Http\Responses\FetchFileUploadRecordResponse;
2111

2212
final class ModelUploadServiceProvider extends PackageServiceProvider
2313
{
@@ -26,12 +16,7 @@ public function registeringPackage(): void
2616
$this->app->singleton(StoreModelUploadFile::class);
2717
$this->app->singleton(RecordProcessorManager::class);
2818

29-
$this->app->bind(FetchUserFileUploadResponse::class, FetchUserFileUploadView::class);
30-
$this->app->bind(CreateUserFileUploadResponse::class, CreateUserFileUploadView::class);
31-
$this->app->bind(StoreUserFileUploadResponse::class, StoreUserFileUploadView::class);
32-
33-
$this->app->bind(FetchFileUploadRecordResponse::class, FetchFileUploadRecordView::class);
34-
$this->app->bind(ShowFileUploadRecordResponse::class, ShowFileUploadRecordView::class);
19+
$this->app->bind(AbstractModelRecordImport::class, ModelRecordImport::class);
3520
}
3621

3722
public function configurePackage(Package $package): void

0 commit comments

Comments
 (0)