Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ProcessMaker/Jobs/BoundaryEvent.php
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ public function action(BpmnDocumentInterface $definitions, TokenInterface $token
}

/**
* Updata data for a message event
* Update data for a message event
*
* If variableName is set, then the event payload will be set to that variable name.
* If the data name exists, then the data is merged.
Expand Down
46 changes: 46 additions & 0 deletions ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
use ProcessMaker\Models\Process as Definitions;
use ProcessMaker\Models\ProcessRequest;
use ProcessMaker\Models\User;
use ProcessMaker\Nayra\Contracts\Bpmn\BoundaryEventInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\ScriptTaskInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\StartEventInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface;
Expand All @@ -24,6 +25,7 @@ class WorkflowManagerRabbitMq extends WorkflowManagerDefault implements Workflow
const ACTION_COMPLETE_TASK = 'COMPLETE_TASK';
const ACTION_TRIGGER_INTERMEDIATE_EVENT = 'TRIGGER_INTERMEDIATE_EVENT';
const ACTION_RUN_SCRIPT = 'RUN_SCRIPT';
const ACTION_TRIGGER_BOUNDARY_EVENT = 'TRIGGER_BOUNDARY_EVENT';

/**
* Trigger a start event and return the process request instance.
Expand Down Expand Up @@ -194,6 +196,49 @@ public function runScripTask(ScriptTaskInterface $scriptTask, TokenInterface $to
]);
}

/**
* Trigger a boundary event
*
* @param Definitions $definitions
* @param ExecutionInstanceInterface $instance
* @param TokenInterface $token
* @param BoundaryEventInterface $boundaryEvent
* @param array $data
*
* @return void
*/
public function triggerBoundaryEvent(
Definitions $definitions,
ExecutionInstanceInterface $instance,
TokenInterface $token,
BoundaryEventInterface $boundaryEvent,
array $data
) {
//Validate data
$this->validateData($data, $definitions, $boundaryEvent);

// Get complementary information
$version = $instance->process->getLatestVersion();
$userId = $this->getCurrentUserId();
$state = $this->serializeState($instance);

// Dispatch complete task action
$this->dispatchAction([
'bpmn' => $version->getKey(),
'action' => self::ACTION_TRIGGER_BOUNDARY_EVENT,
'params' => [
'request_id' => $token->process_request_id,
'token_id' => $token->uuid,
'element_id' => $boundaryEvent->getId(),
'data' => [],
],
'state' => $state,
'session' => [
'user_id' => $userId,
],
]);
}

/**
* Build a state object.
*
Expand All @@ -211,6 +256,7 @@ private function serializeState(ProcessRequest $instance)
'status' => $token->status,
'index' => $token->element_index,
'element_id' => $token->element_id,
'created_at' => $token->created_at->getTimestamp(),
]);
}

Expand Down
24 changes: 24 additions & 0 deletions ProcessMaker/Nayra/Repositories/Deserializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use ProcessMaker\Nayra\Bpmn\Collection;
use ProcessMaker\Nayra\Contracts\Bpmn\CollectionInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\EntityInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\EventDefinitionInterface;
use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface;
use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface;
use ProcessMaker\Repositories\BpmnDocument;
Expand All @@ -19,10 +20,15 @@
class Deserializer
{
private $definitions = [];

private $requests = [];

private $tokens = [];

private ExecutionInstanceRepository $instanceRepository;

private TokenRepository $tokenRepository;

private DefinitionsRepository $factory;

/**
Expand Down Expand Up @@ -230,6 +236,7 @@ public function unserializeToken(array $serialized): TokenInterface
public function unserializeEntity(array $serialized): EntityInterface
{
$definition = $this->findProcessDefinition($serialized['model_id']);

return $definition->getElementInstanceById($serialized['id']);
}

Expand All @@ -248,4 +255,21 @@ public function unserializeTokensCollection(array $serialized): CollectionInterf

return $collection;
}

/**
* Return event definition from serialized data
*
* @param array $serialized
* @return EventDefinitionInterface
*/
public function unserializeEventDefinition(array $serialized): EventDefinitionInterface
{
$definition = $this->findProcessDefinition($serialized['model_id']);
$element = $definition->getElementInstanceById($serialized['element_id']);
$node = $element->getBpmnElement();
$childNode = $node->childNodes->item($serialized['index']);
$eventDefinition = $childNode->getBpmnElementInstance();

return $eventDefinition;
}
}
13 changes: 13 additions & 0 deletions ProcessMaker/Nayra/Repositories/PersistenceHandler.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,20 @@

use Exception;
use Illuminate\Support\Facades\Auth;
use ProcessMaker\Managers\TaskSchedulerManager;
use ProcessMaker\Repositories\ExecutionInstanceRepository;
use ProcessMaker\Repositories\TokenRepository;

class PersistenceHandler
{
use PersistenceRequestTrait;
use PersistenceTokenTrait;
use PersistenceTimerEventsTrait;

protected Deserializer $deserializer;
protected ExecutionInstanceRepository $instanceRepository;
protected TokenRepository $tokenRepository;
protected TaskSchedulerManager $taskSchedulerManager;

/**
* PersistenceHandler constructor
Expand All @@ -24,6 +27,7 @@ public function __construct()
$this->deserializer = new Deserializer();
$this->instanceRepository = new ExecutionInstanceRepository();
$this->tokenRepository = new TokenRepository($this->instanceRepository);
$this->taskSchedulerManager = new TaskSchedulerManager();
}

/**
Expand Down Expand Up @@ -105,6 +109,15 @@ public function save(array $transaction)
case 'instance_updated':
$this->persistInstanceUpdated($transaction);
break;
case 'schedule_date':
$this->persistScheduleDate($transaction);
break;
case 'schedule_cycle':
$this->persistScheduleCycle($transaction);
break;
case 'schedule_duration':
$this->persistScheduleDuration($transaction);
break;
default:
throw new Exception('Unknown transaction type ' . $transaction['type']);
}
Expand Down
42 changes: 42 additions & 0 deletions ProcessMaker/Nayra/Repositories/PersistenceTimerEventsTrait.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

namespace ProcessMaker\Nayra\Repositories;

use ProcessMaker\Managers\TaskSchedulerManager;
use ProcessMaker\Repositories\ExecutionInstanceRepository;

trait PersistenceTimerEventsTrait
{
protected Deserializer $deserializer;

protected ExecutionInstanceRepository $instanceRepository;

protected TaskSchedulerManager $taskSchedulerManager;

public function persistScheduleDate(array $transaction)
{
$dateTime = unserialize($transaction['date_time']);
$eventDefinition = $this->deserializer->unserializeEventDefinition($transaction['event_definition']);
$element = $this->deserializer->unserializeEntity($transaction['element']);
$token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null;
$this->taskSchedulerManager->scheduleDate($dateTime, $eventDefinition, $element, $token);
}

public function persistScheduleCycle(array $transaction)
{
$cycle = unserialize($transaction['cycle']);
$eventDefinition = $this->deserializer->unserializeEventDefinition($transaction['event_definition']);
$element = $this->deserializer->unserializeEntity($transaction['element']);
$token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null;
$this->taskSchedulerManager->scheduleCycle($cycle, $eventDefinition, $element, $token);
}

public function persistScheduleDuration(array $transaction)
{
$duration = unserialize($transaction['duration']);
$eventDefinition = $this->deserializer->unserializeEventDefinition($transaction['event_definition']);
$element = $this->deserializer->unserializeEntity($transaction['element']);
$token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null;
$this->taskSchedulerManager->scheduleDuration($duration, $eventDefinition, $element, $token);
}
}
1 change: 1 addition & 0 deletions phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
<!-- Caching config -->
<env name="CACHE_DRIVER" value="array" />
<env name="QUEUE_DRIVER" value="sync" />
<env name="MESSAGE_BROKER_DRIVER" value="default" />

<!-- Workflow Database -->
<env name="DB_ADAPTER" value="mysql" />
Expand Down