From 0945dde1179a0466adf46223bf176e00d5084840 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Fri, 24 Nov 2023 19:08:05 -0400 Subject: [PATCH 1/6] Throw global signal event --- ProcessMaker/Nayra/Repositories/PersistenceHandler.php | 3 +++ .../Nayra/Repositories/PersistenceTokenTrait.php | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php index 8a4789b74a..17d5c662be 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php @@ -108,6 +108,9 @@ public function save(array $transaction) case 'start_event_triggered': $this->persistStartEventTriggered($transaction); break; + case 'throw_global_signal_event': + $this->throwGlobalSignalEvent($transaction); + break; case 'event_based_gateway_activated': $this->persistEventBasedGatewayActivated($transaction); break; diff --git a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php index 25b8cc256d..756129af40 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Nayra\Repositories; use Illuminate\Support\Facades\Cache; +use ProcessMaker\Facades\WorkflowManager; use ProcessMaker\Listeners\BpmnSubscriber; use ProcessMaker\Listeners\CommentsSubscriber; use ProcessMaker\Nayra\Bpmn\Events\ActivityActivatedEvent; @@ -298,4 +299,12 @@ public function persistAbout(array $aboutInfo) error_log("Microservice $name version $version is running."); Cache::put(self::$aboutCacheKey, $aboutInfo, 60); } + + public function throwGlobalSignalEvent(array $transaction) + { + $throwElement = $this->deserializer->unserializeEntity($transaction['throw_element']); + $token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null; + $eventDefinition = $throwElement->getEventDefinitions()->item(0); + WorkflowManager::throwSignalEventDefinition($eventDefinition, $token); + } } From 7dde800f5ffe3c38d2a0b2f2260d7139fa6f6fc1 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Fri, 24 Nov 2023 19:34:53 -0400 Subject: [PATCH 2/6] Get IDs of collaborating instances --- .../Nayra/Managers/WorkflowManagerDefault.php | 25 +++++++++++++++---- .../Managers/WorkflowManagerRabbitMq.php | 18 +++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerDefault.php b/ProcessMaker/Nayra/Managers/WorkflowManagerDefault.php index 7be0689130..4902a9ec37 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerDefault.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerDefault.php @@ -32,7 +32,6 @@ use ProcessMaker\Nayra\Contracts\Bpmn\ThrowEventInterface; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; -use ProcessMaker\Repositories\DefinitionsRepository; class WorkflowManagerDefault implements WorkflowManagerInterface { @@ -265,12 +264,28 @@ public function throwSignalEventDefinition(EventDefinitionInterface $sourceEvent } $excludeProcesses = [$token->getInstance()->getModel()->process_id]; - $excludeRequests = []; - $instances = $token->getInstance()->getProcess()->getEngine()->getExecutionInstances(); + + $excludeRequests = $this->getCollaboratingInstanceIds($token->getInstance()); + ThrowSignalEvent::dispatch($signalRef, $data, $excludeProcesses, $excludeRequests)->onQueue('bpmn'); + } + + /** + * Retrieves IDs of all instances collaborating with the given instance. + * + * This function compiles a list of IDs from execution instances associated + * with the same process as the input instance, including the instance itself. + * + * @param ProcessRequest $instance The instance to find collaborators for. + * @return int[] Array of collaborating instance IDs. + */ + protected function getCollaboratingInstanceIds($instance) + { + $ids = []; + $instances = $instance->getProcess()->getEngine()->getExecutionInstances(); foreach ($instances as $instance) { - $excludeRequests[] = $instance->getId(); + $ids[] = $instance->getId(); } - ThrowSignalEvent::dispatch($signalRef, $data, $excludeProcesses, $excludeRequests)->onQueue('bpmn'); + return $ids; } /** diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php index f942a69f92..dbd5ceb7c8 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php @@ -553,6 +553,24 @@ public function throwSignalEventRequest(ProcessRequest $request, $signalRef, arr ]); } + /** + * Retrieves IDs of all instances collaborating with the given instance. + * + * This function compiles a list of IDs from execution instances associated + * with the same process as the input instance, including the instance itself. + * + * @param ProcessRequest $instance The instance to find collaborators for. + * @return int[] Array of collaborating instance IDs. + */ + protected function getCollaboratingInstanceIds($instance) + { + $ids = ProcessRequest:: + where('process_collaboration_id', $instance->process_collaboration_id) + ->pluck('id') + ->toArray(); + return $ids; + } + /** * Build a state object. * From e564e93e7c6f8c6858994282de87e3386596a485 Mon Sep 17 00:00:00 2001 From: Alex Runyan Date: Wed, 29 Nov 2023 10:40:33 -0500 Subject: [PATCH 3/6] Introduce our own optimize:clear artisan command to ensure cached packages.php doesnt get flushed unnecessarily --- .../Console/Commands/OptimizeClearCommand.php | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 ProcessMaker/Console/Commands/OptimizeClearCommand.php diff --git a/ProcessMaker/Console/Commands/OptimizeClearCommand.php b/ProcessMaker/Console/Commands/OptimizeClearCommand.php new file mode 100644 index 0000000000..9870ffa33b --- /dev/null +++ b/ProcessMaker/Console/Commands/OptimizeClearCommand.php @@ -0,0 +1,42 @@ +components->info('Clearing cached bootstrap files.'); + + collect([ + 'events' => fn () => $this->callSilent('event:clear') == 0, + 'views' => fn () => $this->callSilent('view:clear') == 0, + 'route' => fn () => $this->callSilent('route:clear') == 0, + ])->each(fn ($task, $description) => $this->components->task($description, $task)); + + $this->newLine(); + } +} From 658e352138902e24bddb2623546f5b15d7f4e35d Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Tue, 28 Nov 2023 13:11:16 -0400 Subject: [PATCH 4/6] Improve get activated transition in gateway --- .../Nayra/Repositories/PersistenceTokenTrait.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php index 756129af40..2336f3f917 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php @@ -3,6 +3,7 @@ namespace ProcessMaker\Nayra\Repositories; use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\Log; use ProcessMaker\Facades\WorkflowManager; use ProcessMaker\Listeners\BpmnSubscriber; use ProcessMaker\Listeners\CommentsSubscriber; @@ -166,9 +167,17 @@ public function persistGatewayTokenConsumed(array $transaction) public function persistGatewayTokenPassed(array $transaction) { $gateway = $this->deserializer->unserializeEntity($transaction['gateway']); - $transition = $this->deserializer->unserializeEntity($transaction['transition']); + if (!is_numeric($transaction['transition'])) { + Log::info('Invalid transition id for gateway token passed. ' . json_encode($transaction)); + return; + } + $transition = $gateway->getTransitions()[$transaction['transition']] ?? null; + if (empty($transaction)) { + Log::info('Invalid transition for gateway token passed. ' . json_encode($transaction)); + return; + } $tokens = $this->deserializer->unserializeTokensCollection($transaction['tokens']); - $this->tokenRepository->persistGatewayTokenPassed($gateway, $tokens[0]); + $this->tokenRepository->persistGatewayTokenPassed($gateway, $tokens->item(0)); // Comments $subscriber = new CommentsSubscriber(); From cae5383fe6a9fedd3b31cce5771431c247d20b6e Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Tue, 28 Nov 2023 13:52:01 -0400 Subject: [PATCH 5/6] Fix variable name --- ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php index 2336f3f917..6d79d5a381 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php @@ -172,7 +172,7 @@ public function persistGatewayTokenPassed(array $transaction) return; } $transition = $gateway->getTransitions()[$transaction['transition']] ?? null; - if (empty($transaction)) { + if (empty($transition)) { Log::info('Invalid transition for gateway token passed. ' . json_encode($transaction)); return; } From 1e8352edb6fd64519f05917886dede4f16250107 Mon Sep 17 00:00:00 2001 From: Ryan Cooley Date: Wed, 29 Nov 2023 15:03:47 -0800 Subject: [PATCH 6/6] Version 4.8.1 Build #aa23ed0e --- composer.json | 2 +- composer.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 5af8de9678..71cb46835f 100644 --- a/composer.json +++ b/composer.json @@ -96,7 +96,7 @@ "Gmail" ], "processmaker": { - "build": "e24a3c60", + "build": "aa23ed0e", "custom": { "package-ellucian-ethos": "1.14.1", "package-plaid": "1.3.1", diff --git a/composer.lock b/composer.lock index a5a0c0eeed..75b80e7123 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "08d1c39d3fb9b2c3bd58193f03966e91", + "content-hash": "bb462c407499f96fbb57b8d1210e2e8b", "packages": [ { "name": "aws/aws-crt-php",