Skip to content

Commit 0d7a343

Browse files
committed
WIP
1 parent 3125dca commit 0d7a343

File tree

5 files changed

+65
-26
lines changed

5 files changed

+65
-26
lines changed

config/services.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
<argument type="service" id="sylius_import_export.repository.process_import" />
5858
<argument type="service" id="sylius_import_export.denormalizer.registry" />
5959
<argument type="service" id="doctrine.orm.entity_manager" />
60+
<argument type="service" id="sylius.resource_registry" />
6061

6162
<tag name="messenger.message_handler" bus="sylius.command_bus" />
6263
</service>
@@ -100,11 +101,15 @@
100101
<tag name="controller.service_arguments" />
101102
</service>
102103

104+
<service id="sylius_import_export.uploader.import_file" class="Sylius\ImportExport\Uploader\ImportFileUploader">
105+
<argument>%sylius_import_export.import_files_directory%</argument>
106+
</service>
107+
103108
<service id="sylius_import_export.controller.import_action" class="Sylius\ImportExport\Controller\ImportAction" public="true">
104109
<argument type="service" id="form.factory" />
105110
<argument type="service" id="sylius.command_bus" />
106111
<argument>%sylius_import_export.import.form_class%</argument>
107-
<argument>%sylius_import_export.import_files_directory%</argument>
112+
<argument type="service" id="sylius_import_export.uploader.import_file" />
108113
<argument type="service" id="sylius.resource_registry" />
109114

110115
<tag name="controller.service_arguments" />

src/Controller/ImportAction.php

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
namespace Sylius\ImportExport\Controller;
1515

1616
use Sylius\ImportExport\Messenger\Command\CreateImportProcess;
17+
use Sylius\ImportExport\Uploader\ImportFileUploader;
1718
use Sylius\Resource\Metadata\RegistryInterface;
1819
use Symfony\Component\Form\FormFactoryInterface;
1920
use Symfony\Component\HttpFoundation\File\UploadedFile;
@@ -29,7 +30,7 @@ public function __construct(
2930
private FormFactoryInterface $formFactory,
3031
private MessageBusInterface $commandBus,
3132
private string $importForm,
32-
private string $importFilesDirectory,
33+
private ImportFileUploader $importFileUploader,
3334
private RegistryInterface $metadataRegistry,
3435
) {
3536
}
@@ -59,23 +60,14 @@ public function __invoke(Request $request, string $grid): Response
5960

6061
$data = $form->getData();
6162
$resourceClass = $data['resourceClass'];
62-
63+
6364
/** @var UploadedFile $file */
6465
$file = $data['file'];
6566

6667
try {
67-
if (!is_dir($this->importFilesDirectory)) {
68-
mkdir($this->importFilesDirectory, 0755, true);
69-
}
70-
71-
$fileName = uniqid() . '_' . $file->getClientOriginalName();
72-
$filePath = $this->importFilesDirectory . '/' . $fileName;
73-
74-
$file->move($this->importFilesDirectory, $fileName);
75-
76-
$format = $this->getFormatFromMimeType($file->getMimeType());
68+
$format = $this->importFileUploader->getFormatFromMimeType($file->getMimeType());
69+
$filePath = $this->importFileUploader->upload($file);
7770

78-
// Convert FQCN to resource alias (like sylius.product)
7971
$metadata = $this->metadataRegistry->getByClass($resourceClass);
8072
$resourceAlias = $metadata->getAlias();
8173

@@ -87,19 +79,10 @@ public function __invoke(Request $request, string $grid): Response
8779
));
8880

8981
$session->getFlashBag()->add('success', 'sylius_import_export.import_started');
90-
} catch (\Throwable) {
91-
$session->getFlashBag()->add('error', 'sylius_import_export.import_failed');
82+
} catch (\Throwable $e) {
83+
$session->getFlashBag()->add('error', 'sylius_import_export.upload_failed');
9284
}
9385

9486
return new RedirectResponse($request->headers->get('referer') ?? '/');
9587
}
96-
97-
private function getFormatFromMimeType(?string $mimeType): string
98-
{
99-
return match ($mimeType) {
100-
'application/json' => 'json',
101-
'text/csv', 'text/plain' => 'csv',
102-
default => 'json', // Default fallback
103-
};
104-
}
10588
}

src/Messenger/Handler/ImportCommandHandler.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Sylius\ImportExport\Exception\ImportFailedException;
2020
use Sylius\ImportExport\Messenger\Command\ImportCommand;
2121
use Sylius\Resource\Doctrine\Persistence\RepositoryInterface;
22+
use Sylius\Resource\Metadata\RegistryInterface;
2223

2324
class ImportCommandHandler
2425
{
@@ -27,6 +28,7 @@ public function __construct(
2728
protected RepositoryInterface $processRepository,
2829
protected DenormalizerRegistryInterface $denormalizerRegistry,
2930
protected EntityManagerInterface $entityManager,
31+
protected RegistryInterface $metadataRegistry,
3032
) {
3133
}
3234

@@ -39,7 +41,8 @@ public function __invoke(ImportCommand $command): void
3941

4042
try {
4143
$importedCount = 0;
42-
$resourceClass = $process->getResource();
44+
$resourceMetadata = $this->metadataRegistry->get($process->getResource());
45+
$resourceClass = $resourceMetadata->getClass('model');
4346
$denormalizer = $this->denormalizerRegistry->get($resourceClass);
4447

4548
foreach ($command->batchData as $recordData) {
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\ImportExport\Uploader;
15+
16+
use Symfony\Component\HttpFoundation\File\UploadedFile;
17+
18+
final readonly class ImportFileUploader
19+
{
20+
public function __construct(
21+
private string $importFilesDirectory,
22+
) {
23+
}
24+
25+
public function upload(UploadedFile $file): string
26+
{
27+
if (!is_dir($this->importFilesDirectory)) {
28+
mkdir($this->importFilesDirectory, 0755, true);
29+
}
30+
31+
$fileName = uniqid() . '_' . $file->getClientOriginalName();
32+
$filePath = $this->importFilesDirectory . '/' . $fileName;
33+
34+
$file->move($this->importFilesDirectory, $fileName);
35+
36+
return $filePath;
37+
}
38+
39+
public function getFormatFromMimeType(?string $mimeType): string
40+
{
41+
return match ($mimeType) {
42+
'application/json' => 'json',
43+
'text/csv', 'text/plain' => 'csv',
44+
default => 'json',
45+
};
46+
}
47+
}

translations/messages.en.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ sylius_import_export:
2525
file_not_ready: "File not ready for download"
2626
export_failed: "Export failed"
2727
import_failed: "Import failed"
28+
upload_failed: "Upload failed"
2829
import_started: "Import started successfully"
2930
import_form_invalid: "Import form is invalid"
3031
imported_count: "Imported Count"

0 commit comments

Comments
 (0)