From 762650821a2569dfb4ea57176be7b443e32ac87d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Thu, 6 Jun 2024 14:09:41 +0000 Subject: [PATCH] FOUR-15871 Optimize Interstitial to Reduce Redundant Task Calls --- ProcessMaker/Events/ActivityAssigned.php | 11 ++++++ ProcessMaker/Events/ProcessUpdated.php | 12 +++++- ProcessMaker/Jobs/ExecuteScript.php | 38 ++++++++++++++++++- ProcessMaker/Listeners/BpmnSubscriber.php | 5 ++- .../Managers/TaskSchedulerManager.php | 2 +- ProcessMaker/Models/ProcessRequest.php | 6 +-- ProcessMaker/Models/ProcessRequestToken.php | 4 +- .../Managers/WorkflowManagerRabbitMq.php | 2 +- ProcessMaker/Repositories/TokenRepository.php | 8 ++-- ProcessMaker/RollbackProcessRequest.php | 4 +- config/app.php | 2 + 11 files changed, 79 insertions(+), 15 deletions(-) diff --git a/ProcessMaker/Events/ActivityAssigned.php b/ProcessMaker/Events/ActivityAssigned.php index 3eeb13190f..75c51c5fde 100644 --- a/ProcessMaker/Events/ActivityAssigned.php +++ b/ProcessMaker/Events/ActivityAssigned.php @@ -60,4 +60,15 @@ public function getProcessRequestToken() { return $this->processRequestToken; } + + /** + * Get data + */ + public function getData(): array + { + return [ + 'payloadUrl' => $this->payloadUrl, + 'element_type' => $this->processRequestToken->element_type, + ]; + } } diff --git a/ProcessMaker/Events/ProcessUpdated.php b/ProcessMaker/Events/ProcessUpdated.php index 7c96abc964..e1bf14f692 100644 --- a/ProcessMaker/Events/ProcessUpdated.php +++ b/ProcessMaker/Events/ProcessUpdated.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; use ProcessMaker\Models\ProcessRequest; +use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; class ProcessUpdated implements ShouldBroadcastNow { @@ -17,6 +18,10 @@ class ProcessUpdated implements ShouldBroadcastNow public $event; + public $tokenId; + + public $elementType; + private $processRequest; /** @@ -24,12 +29,17 @@ class ProcessUpdated implements ShouldBroadcastNow * * @return void */ - public function __construct(ProcessRequest $processRequest, $event) + public function __construct(ProcessRequest $processRequest, $event, TokenInterface $token = null) { $this->payloadUrl = route('api.requests.show', ['request' => $processRequest->getKey()]); $this->event = $event; $this->processRequest = $processRequest; + + if ($token) { + $this->tokenId = $token->getId(); + $this->elementType = $token->element_type; + } } /** diff --git a/ProcessMaker/Jobs/ExecuteScript.php b/ProcessMaker/Jobs/ExecuteScript.php index a9c8ad88f2..f82147a07c 100644 --- a/ProcessMaker/Jobs/ExecuteScript.php +++ b/ProcessMaker/Jobs/ExecuteScript.php @@ -11,6 +11,7 @@ use ProcessMaker\Events\ScriptResponseEvent; use ProcessMaker\Models\Script; use ProcessMaker\Models\User; +use ProcessMaker\Nayra\Managers\WorkflowManagerRabbitMq; use Throwable; class ExecuteScript implements ShouldQueue @@ -62,7 +63,12 @@ public function __construct(ScriptInterface $script, User $current_user, $code, */ public function handle() { - //throw new \Exception('This method must be overridden.'); + $useNayraDocker = !empty(config('app.nayra_rest_api_host')); + $isPhp = strtolower($this->script->language) === 'php'; + if ($isPhp && $useNayraDocker && $this->sync) { + return $this->handleNayraDocker(); + } + try { // Just set the code but do not save the object (preview only) $this->script->code = $this->code; @@ -82,6 +88,36 @@ public function handle() } } + /** + * Execute the script task using Nayra Docker. + * + * @return string|bool + */ + public function handleNayraDocker() + { + $engine = new WorkflowManagerRabbitMq(); + $params = [ + 'name' => uniqid('script_', true), + 'script' => $this->code, + 'data' => $this->data, + 'config' => $this->configuration, + 'envVariables' => $engine->getEnvironmentVariables(), + ]; + $body = json_encode($params); + $url = config('app.nayra_rest_api_host') . '/run_script'; + $ch = curl_init($url); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); + curl_setopt($ch, CURLOPT_POSTFIELDS, $body); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', + 'Content-Length: ' . strlen($body), + ]); + $result = curl_exec($ch); + curl_close($ch); + return $result; + } + /** * Send a response to the user interface * diff --git a/ProcessMaker/Listeners/BpmnSubscriber.php b/ProcessMaker/Listeners/BpmnSubscriber.php index 7d8a36ebca..bbf6586179 100644 --- a/ProcessMaker/Listeners/BpmnSubscriber.php +++ b/ProcessMaker/Listeners/BpmnSubscriber.php @@ -126,8 +126,9 @@ public function onActivityActivated(ActivityActivatedEvent $event) if ($token->user_id) { $token->sendActivityActivatedNotifications(); } - - event(new ActivityAssigned($event->token)); + if ($event->token->element_type === 'task') { + event(new ActivityAssigned($event->token)); + } } /** diff --git a/ProcessMaker/Managers/TaskSchedulerManager.php b/ProcessMaker/Managers/TaskSchedulerManager.php index 9c516d5319..c7a5ad41e7 100644 --- a/ProcessMaker/Managers/TaskSchedulerManager.php +++ b/ProcessMaker/Managers/TaskSchedulerManager.php @@ -144,7 +144,7 @@ public function scheduleTasks() $this->removeExpiredLocks(); - $tasks = ScheduledTask::all(); + $tasks = ScheduledTask::cursor(); foreach ($tasks as $task) { try { diff --git a/ProcessMaker/Models/ProcessRequest.php b/ProcessMaker/Models/ProcessRequest.php index 5b1ec55308..44829ac996 100644 --- a/ProcessMaker/Models/ProcessRequest.php +++ b/ProcessMaker/Models/ProcessRequest.php @@ -888,11 +888,11 @@ public function getVersionDefinitions($forceParse = false, $engine = null) * * @param string $eventName */ - public function notifyProcessUpdated($eventName) + public function notifyProcessUpdated($eventName, TokenInterface $token = null) { - $event = new ProcessUpdated($this, $eventName); + $event = new ProcessUpdated($this, $eventName, $token); if ($this->parentRequest) { - $this->parentRequest->notifyProcessUpdated($eventName); + $this->parentRequest->notifyProcessUpdated($eventName, $token); } event($event); } diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index 85ce41d136..e58a2302b1 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -1150,6 +1150,8 @@ public function reassign($toUserId, User $requestingUser) // Send a notification to the user $notification = new TaskReassignmentNotification($this); $this->user->notify($notification); - event(new ActivityAssigned($this)); + if ($this->element_type === 'task') { + event(new ActivityAssigned($this)); + } } } diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php index 5dd2fd75ec..bed0984384 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php @@ -682,7 +682,7 @@ private function dispatchAction(array $action, $subject = null): void * * @return array */ - private function getEnvironmentVariables() + public function getEnvironmentVariables() { $environmentVariables = []; EnvironmentVariable::chunk(50, function ($variables) use (&$environmentVariables) { diff --git a/ProcessMaker/Repositories/TokenRepository.php b/ProcessMaker/Repositories/TokenRepository.php index 6d72d7e0b2..1a652d3067 100644 --- a/ProcessMaker/Repositories/TokenRepository.php +++ b/ProcessMaker/Repositories/TokenRepository.php @@ -154,7 +154,7 @@ public function persistActivityActivated(ActivityInterface $activity, TokenInter $token->saveOrFail(); $token->setId($token->getKey()); $request = $token->getInstance(); - $request->notifyProcessUpdated('ACTIVITY_ACTIVATED'); + $request->notifyProcessUpdated('ACTIVITY_ACTIVATED', $token); $this->instanceRepository->persistInstanceUpdated($token->getInstance()); } @@ -192,7 +192,7 @@ public function persistStartEventTriggered(StartEventInterface $startEvent, Coll $token->saveOrFail(); $token->setId($token->getKey()); $request = $token->getInstance(); - $request->notifyProcessUpdated('START_EVENT_TRIGGERED'); + $request->notifyProcessUpdated('START_EVENT_TRIGGERED', $token); } private function assignTaskUser(ActivityInterface $activity, TokenInterface $token, Instance $instance) @@ -224,7 +224,7 @@ public function persistActivityException(ActivityInterface $activity, TokenInter $token->save(); $token->setId($token->getKey()); $request = $token->getInstance(); - $request->notifyProcessUpdated('ACTIVITY_EXCEPTION'); + $request->notifyProcessUpdated('ACTIVITY_EXCEPTION', $token); } /** @@ -258,7 +258,7 @@ public function persistActivityCompleted(ActivityInterface $activity, TokenInter $token->save(); $token->setId($token->getKey()); $request = $token->getInstance(); - $request->notifyProcessUpdated('ACTIVITY_COMPLETED'); + $request->notifyProcessUpdated('ACTIVITY_COMPLETED', $token); } /** diff --git a/ProcessMaker/RollbackProcessRequest.php b/ProcessMaker/RollbackProcessRequest.php index fdf3c52323..e7245074ce 100644 --- a/ProcessMaker/RollbackProcessRequest.php +++ b/ProcessMaker/RollbackProcessRequest.php @@ -148,7 +148,9 @@ private function rollbackToTask() if ($this->newTask->user_id) { $this->newTask->sendActivityActivatedNotifications(); } - event(new ActivityAssigned($this->newTask)); + if ($this->newTask->element_type === 'task') { + event(new ActivityAssigned($this->newTask)); + } $this->addComment(); } diff --git a/config/app.php b/config/app.php index 0bf2a8438a..debeb5bfa2 100644 --- a/config/app.php +++ b/config/app.php @@ -99,6 +99,8 @@ env('APP_URL', 'http://localhost') ) ), + 'nayra_rest_api_host' => env('NAYRA_REST_API_HOST', ''), + 'screen_task_cache_time' => env('SCREEN_TASK_CACHE_TIME', 86400), // Allows our script executors to ignore invalid SSL. This should only be set to false for development. 'api_ssl_verify' => env('API_SSL_VERIFY', 'true'),