Repository navigation
Expand file tree
/
Copy pathHttpProcessExecuteValueResolver.php
More file actions
104 lines (89 loc) · 3.97 KB
/
Copy pathHttpProcessExecuteValueResolver.php
File metadata and controls
104 lines (89 loc) · 3.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
declare(strict_types=1);
/*
* This file is part of the CleverAge/UiProcessBundle package.
*
* Copyright (c) Clever-Age
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace CleverAge\UiProcessBundle\Http\ValueResolver;
use CleverAge\UiProcessBundle\Http\Model\HttpProcessExecution;
use CleverAge\UiProcessBundle\Manager\UploadedFileManager;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Attribute\AsTargetedValueResolver;
use Symfony\Component\HttpKernel\Controller\ValueResolverInterface;
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
use Symfony\Component\Serializer\SerializerInterface;
/**
* @internal
*/
#[AsTargetedValueResolver('http_process_execution')]
readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface
{
/**
* Request attribute: path of the uploaded input file written by the resolver, to be deleted once the process has
* been executed or when the request is rejected (an input given by its path is never deleted).
*/
public const UPLOADED_INPUT_ATTRIBUTE = '_cleverage_ui_process_uploaded_input';
public function __construct(private string $storageDir, private SerializerInterface $serializer)
{
}
/**
* @return iterable<HttpProcessExecution>
*/
public function resolve(Request $request, ArgumentMetadata $argument): iterable
{
try {
$hasRequestData = $request->request->count() > 0 || $request->files->count() > 0;
// The query string is read with form data, and also without body
$hasQueryOnly = !$hasRequestData && '' === $request->getContent() && $request->query->count() > 0;
if (!$hasRequestData && !$hasQueryOnly) {
$content = $request->getContent();
if (empty($content)) {
return [new HttpProcessExecution()];
}
$httpProcessExecution = $this->serializer->deserialize(
$content,
HttpProcessExecution::class,
'json'
);
} else {
$input = $request->request->get('input') ?? $request->query->get('input');
$input ??= $request->files->get('input');
if ($input instanceof UploadedFile) {
$prefix = date('YmdHis').'_'.uniqid().'_';
// A client file name too long for the file system made the writing fail
$uploadFileName = $this->storageDir.\DIRECTORY_SEPARATOR.$prefix.UploadedFileManager::getSafeName(
$input,
UploadedFileManager::MAX_FILENAME_LENGTH - \strlen($prefix)
);
(new Filesystem())->dumpFile($uploadFileName, $input->getContent());
$request->attributes->set(self::UPLOADED_INPUT_ATTRIBUTE, $uploadFileName);
$input = $uploadFileName;
}
$code = $request->request->get('code') ?? $request->query->get('code');
$context = $request->request->all('context');
if ([] === $context) {
$context = $request->query->all('context');
}
$queue = $request->request->has('queue')
? $request->request->getBoolean('queue')
: $request->query->getBoolean('queue', true);
/** @var string|null $input */
$httpProcessExecution = new HttpProcessExecution(
(string) $code,
$input,
$context,
$queue
);
}
return [$httpProcessExecution];
} catch (\Throwable) {
return [new HttpProcessExecution()];
}
}
}