From ffdfa4b232aae80422a6d7baf2afbe1c53ab5f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Wed, 15 Jan 2025 15:51:38 +0100 Subject: [PATCH 1/6] #34 Improve process launch using http call. --- config/services/http_value_resolver.yaml | 2 + src/Controller/ProcessExecuteController.php | 7 +++- src/Http/Model/HttpProcessExecution.php | 6 ++- .../HttpProcessExecuteValueResolver.php | 41 +++++++++++++++---- 4 files changed, 45 insertions(+), 11 deletions(-) diff --git a/config/services/http_value_resolver.yaml b/config/services/http_value_resolver.yaml index 21b40f2..7f1f32f 100644 --- a/config/services/http_value_resolver.yaml +++ b/config/services/http_value_resolver.yaml @@ -5,6 +5,8 @@ services: public: false arguments: - '%upload_directory%' + - '@validator' + - '@serializer' cleverage_ui_process.http_value_resolver.process_configuration: class: CleverAge\UiProcessBundle\Http\ValueResolver\ProcessConfigurationValueResolver diff --git a/src/Controller/ProcessExecuteController.php b/src/Controller/ProcessExecuteController.php index 5de49d2..c001e80 100644 --- a/src/Controller/ProcessExecuteController.php +++ b/src/Controller/ProcessExecuteController.php @@ -18,6 +18,7 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; +use Symfony\Component\HttpKernel\Attribute\ValueResolver; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; use Symfony\Component\Messenger\MessageBusInterface; use Symfony\Component\Routing\Attribute\Route; @@ -27,7 +28,7 @@ class ProcessExecuteController extends AbstractController { public function __invoke( - #[MapRequestPayload] HttpProcessExecution $httpProcessExecution, + #[ValueResolver('http_process_execution')] HttpProcessExecution $httpProcessExecution, ValidatorInterface $validator, MessageBusInterface $bus, ): JsonResponse { @@ -43,7 +44,9 @@ public function __invoke( new ProcessExecuteMessage( $httpProcessExecution->code ?? '', $httpProcessExecution->input, - $httpProcessExecution->context + is_string($httpProcessExecution->context) + ? json_decode($httpProcessExecution->context, true) + : $httpProcessExecution->context ) ); diff --git a/src/Http/Model/HttpProcessExecution.php b/src/Http/Model/HttpProcessExecution.php index fc4272f..fd9f62b 100644 --- a/src/Http/Model/HttpProcessExecution.php +++ b/src/Http/Model/HttpProcessExecution.php @@ -14,8 +14,11 @@ namespace CleverAge\UiProcessBundle\Http\Model; use CleverAge\UiProcessBundle\Validator\IsValidProcessCode; +use Symfony\Component\Validator\Constraints\AtLeastOneOf; +use Symfony\Component\Validator\Constraints\Json; use Symfony\Component\Validator\Constraints\NotNull; use Symfony\Component\Validator\Constraints\Sequentially; +use Symfony\Component\Validator\Constraints\Type; final readonly class HttpProcessExecution { @@ -26,7 +29,8 @@ public function __construct( #[Sequentially(constraints: [new NotNull(message: 'Process code is required.'), new IsValidProcessCode()])] public ?string $code = null, public ?string $input = null, - public array $context = [], + #[AtLeastOneOf(constraints: [new Json(), new Type('array')])] + public string|array $context = [], ) { } } diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index 5e2aafe..17ef773 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -20,11 +20,18 @@ use Symfony\Component\HttpKernel\Attribute\AsTargetedValueResolver; use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; +use Symfony\Component\Serializer\SerializerInterface; +use Symfony\Component\Validator\Validator\ValidatorInterface; +use Symfony\Contracts\Service\Attribute\Required; #[AsTargetedValueResolver('http_process_execution')] readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface { - public function __construct(private string $storageDir) + public function __construct( + private string $storageDir, + private ValidatorInterface $validator, + private SerializerInterface $serializer + ) { } @@ -33,13 +40,31 @@ public function __construct(private string $storageDir) */ public function resolve(Request $request, ArgumentMetadata $argument): iterable { - $input = $request->get('input', $request->files->get('input')); - if ($input instanceof UploadedFile) { - $uploadFileName = $this->storageDir.\DIRECTORY_SEPARATOR.date('YmdHis').'_'.uniqid().'_'.$input->getClientOriginalName(); - (new Filesystem())->dumpFile($uploadFileName, $input->getContent()); - $input = $uploadFileName; - } + $all = $request->request->all(); + try { + if (empty($all)) { + $httpProcessExecution = $this->serializer->deserialize( + $request->getContent(), + HttpProcessExecution::class, + 'json' + ); + } else { + $input = $request->get('input', $request->files->get('input')); + if ($input instanceof UploadedFile) { + $uploadFileName = $this->storageDir . \DIRECTORY_SEPARATOR . date('YmdHis') . '_' . uniqid() . '_' . $input->getClientOriginalName(); + (new Filesystem())->dumpFile($uploadFileName, $input->getContent()); + $input = $uploadFileName; + } + $httpProcessExecution = new HttpProcessExecution( + $request->get('code'), + $input, + $request->get('context', []) + ); + } - return [new HttpProcessExecution($request->get('code'), $input, $request->get('context', []))]; + return [$httpProcessExecution]; + } catch (\Throwable $e) { + return [new HttpProcessExecution()]; + } } } From f1cf76c077673944421318d4df0094c5816838f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Mon, 20 Jan 2025 14:13:19 +0100 Subject: [PATCH 2/6] #34 Improve process launch using http call. Remove unused services. --- config/services/http_value_resolver.yaml | 1 - src/Http/ValueResolver/HttpProcessExecuteValueResolver.php | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/config/services/http_value_resolver.yaml b/config/services/http_value_resolver.yaml index 7f1f32f..3f59048 100644 --- a/config/services/http_value_resolver.yaml +++ b/config/services/http_value_resolver.yaml @@ -5,7 +5,6 @@ services: public: false arguments: - '%upload_directory%' - - '@validator' - '@serializer' cleverage_ui_process.http_value_resolver.process_configuration: diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index 17ef773..cce245a 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -21,17 +21,12 @@ use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Contracts\Service\Attribute\Required; #[AsTargetedValueResolver('http_process_execution')] readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface { - public function __construct( - private string $storageDir, - private ValidatorInterface $validator, - private SerializerInterface $serializer - ) + public function __construct(private string $storageDir, private SerializerInterface $serializer) { } From aaceeb3dc959b3ed3a2c066c6a78b44ec64ac5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Mon, 27 Jan 2025 11:44:21 +0100 Subject: [PATCH 3/6] #34 Quality --- src/Controller/ProcessExecuteController.php | 3 +-- src/Http/ValueResolver/HttpProcessExecuteValueResolver.php | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Controller/ProcessExecuteController.php b/src/Controller/ProcessExecuteController.php index c001e80..21c351b 100644 --- a/src/Controller/ProcessExecuteController.php +++ b/src/Controller/ProcessExecuteController.php @@ -17,7 +17,6 @@ use CleverAge\UiProcessBundle\Message\ProcessExecuteMessage; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; use Symfony\Component\HttpKernel\Attribute\ValueResolver; use Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException; use Symfony\Component\Messenger\MessageBusInterface; @@ -44,7 +43,7 @@ public function __invoke( new ProcessExecuteMessage( $httpProcessExecution->code ?? '', $httpProcessExecution->input, - is_string($httpProcessExecution->context) + \is_string($httpProcessExecution->context) ? json_decode($httpProcessExecution->context, true) : $httpProcessExecution->context ) diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index cce245a..ad0252c 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -21,7 +21,6 @@ use Symfony\Component\HttpKernel\Controller\ValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata; use Symfony\Component\Serializer\SerializerInterface; -use Symfony\Contracts\Service\Attribute\Required; #[AsTargetedValueResolver('http_process_execution')] readonly class HttpProcessExecuteValueResolver implements ValueResolverInterface @@ -46,7 +45,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable } else { $input = $request->get('input', $request->files->get('input')); if ($input instanceof UploadedFile) { - $uploadFileName = $this->storageDir . \DIRECTORY_SEPARATOR . date('YmdHis') . '_' . uniqid() . '_' . $input->getClientOriginalName(); + $uploadFileName = $this->storageDir.\DIRECTORY_SEPARATOR.date('YmdHis').'_'.uniqid().'_'.$input->getClientOriginalName(); (new Filesystem())->dumpFile($uploadFileName, $input->getContent()); $input = $uploadFileName; } From 67247bd0828fbd9728adad76c0690064a86aa4ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Mon, 27 Jan 2025 11:47:30 +0100 Subject: [PATCH 4/6] #34 Quality --- src/Http/ValueResolver/HttpProcessExecuteValueResolver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index ad0252c..44e976f 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -36,7 +36,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable { $all = $request->request->all(); try { - if (empty($all)) { + if ($all === []) { $httpProcessExecution = $this->serializer->deserialize( $request->getContent(), HttpProcessExecution::class, @@ -57,7 +57,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable } return [$httpProcessExecution]; - } catch (\Throwable $e) { + } catch (\Throwable) { return [new HttpProcessExecution()]; } } From a66587b7fea943808b9f74bd83d1c12236258e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Mon, 27 Jan 2025 11:49:16 +0100 Subject: [PATCH 5/6] #34 Quality --- src/Http/ValueResolver/HttpProcessExecuteValueResolver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php index 44e976f..411f0cc 100644 --- a/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php +++ b/src/Http/ValueResolver/HttpProcessExecuteValueResolver.php @@ -36,7 +36,7 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable { $all = $request->request->all(); try { - if ($all === []) { + if ([] === $all) { $httpProcessExecution = $this->serializer->deserialize( $request->getContent(), HttpProcessExecution::class, From 83e5b9d087927445c185c1f07897f181879fe8c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tonon=20Gr=C3=A9gory?= Date: Fri, 21 Feb 2025 16:07:00 +0100 Subject: [PATCH 6/6] #34 Add curl sample for http process execution --- docs/index.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/docs/index.md b/docs/index.md index db90d03..5297d9e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -52,12 +52,25 @@ That's all, now you can launch a process via http post request ***Curl sample*** ```bash make bash -curl --location 'http://apache2/http/process/execute?code=demo.die' \ ---header 'Authorization: Bearer 3da8409b5f5b640fb0c43d68e8ac8d23' \ ---form 'input=@"/file.csv"' \ ---form 'context[context_1]="FOO"' \ ---form 'context[context_2]="BAR"' +curl --location 'http://localhost/http/process/execute' \ +--header 'Authorization: Bearer myBearerToken' \ +--form 'input=@"/path/to/your/file.csv"' \ +--form 'code="demo.dummy"' \ +--form 'context="{\"foo\": \"bar\"}"' ``` + +```bash +make bash +curl --location 'http://localhost/http/process/execute' \ +--header 'Content-Type: application/json' \ +--header 'Authorization: Bearer d641d254aed12733758a3a4247559868' \ +--header 'Cookie: PHPSESSID=m8l9s5sniknv1b0jb798f8sri7; main_auth_profile_token=2f3d24' \ +--data '{ +"code": "demo.die", +"context": {"foo": "bar"} +}' +``` + * Query string code parameter must be a valid process code * Header Authorization: Bearer is the previously generated token * input could be string or file representation