mirror of
https://github.com/Karaka-Management/oms-Workflow.git
synced 2026-01-11 14:58:39 +00:00
182 lines
5.1 KiB
PHP
Executable File
182 lines
5.1 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* Karaka
|
|
*
|
|
* PHP Version 8.1
|
|
*
|
|
* @package Modules\Workflow
|
|
* @copyright Dennis Eichhorn
|
|
* @license OMS License 1.0
|
|
* @version 1.0.0
|
|
* @link https://jingga.app
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Modules\Workflow\Controller;
|
|
|
|
use Modules\Workflow\Models\WorkflowInstanceAbstract;
|
|
use Modules\Workflow\Models\WorkflowStatus;
|
|
use Modules\Workflow\Models\WorkflowTemplate;
|
|
use Modules\Workflow\Models\WorkflowTemplateMapper;
|
|
use phpOMS\Contract\RenderableInterface;
|
|
use phpOMS\Message\Http\RequestStatusCode;
|
|
use phpOMS\Message\RequestAbstract;
|
|
use phpOMS\Message\ResponseAbstract;
|
|
use phpOMS\Model\Message\FormValidation;
|
|
use phpOMS\Utils\StringUtils;
|
|
use phpOMS\Views\View;
|
|
|
|
/**
|
|
* Workflow controller class.
|
|
*
|
|
* @package Modules\Workflow
|
|
* @license OMS License 1.0
|
|
* @link https://jingga.app
|
|
* @since 1.0.0
|
|
*/
|
|
final class CliController extends Controller
|
|
{
|
|
/**
|
|
* Api method to make a call to the cli app
|
|
*
|
|
* @param mixed ...$data Generic data
|
|
*
|
|
* @return void
|
|
*
|
|
* @api
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
public function runWorkflowFromHook(mixed ...$data) : void
|
|
{
|
|
/** @var \Modules\Workflow\Models\WorkflowTemplate[] $workflows */
|
|
$workflows = WorkflowTemplateMapper::getAll()->where('status', WorkflowStatus::ACTIVE)->execute();
|
|
foreach ($workflows as $workflow) {
|
|
$hooks = $workflow->getHooks();
|
|
|
|
foreach ($hooks as $hook) {
|
|
/** @var array{\\:triggerGroup?:string} $data */
|
|
$triggerIsRegex = \stripos($data['@triggerGroup'], '/') === 0;
|
|
$matched = false;
|
|
|
|
if ($triggerIsRegex) {
|
|
$matched = \preg_match($data['@triggerGroup'], $hook) === 1;
|
|
} else {
|
|
$matched = $data['@triggerGroup'] === $hook;
|
|
}
|
|
|
|
if (!$matched && \stripos($hook, '/') === 0) {
|
|
$matched = \preg_match($hook, $data['@triggerGroup']) === 1;
|
|
}
|
|
|
|
if ($matched) {
|
|
$this->runWorkflow($workflow, $hook, $data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Api method to make a call to the cli app
|
|
*
|
|
* @param WorkflowTemplate $workflow Workflow template
|
|
* @param string $hook Event hook
|
|
* @param array $data Event data
|
|
*
|
|
* @return void
|
|
*
|
|
* @api
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
public function runWorkflow(WorkflowTemplate $workflow, string $hook, array $data) : void
|
|
{
|
|
include $workflow->source->getAbsolutePath();
|
|
}
|
|
|
|
/**
|
|
* Method which creates a workflow instance
|
|
*
|
|
* @param RequestAbstract $request Request
|
|
* @param ResponseAbstract $response Response
|
|
* @param mixed $data Generic data
|
|
*
|
|
* @return RenderableInterface Response can be rendered
|
|
*
|
|
* @since 1.0.0
|
|
* @codeCoverageIgnore
|
|
*/
|
|
public function cliWorkflowInstanceCreate(RequestAbstract $request, ResponseAbstract $response, mixed $data = null) : RenderableInterface
|
|
{
|
|
$view = new View($this->app->l11nManager, $request, $response);
|
|
|
|
if (!empty($val = $this->validateInstanceCreate($request))) {
|
|
$response->set('instance_create', new FormValidation($val));
|
|
$response->header->status = RequestStatusCode::R_400;
|
|
}
|
|
|
|
$instance = $this->createInstanceFromRequest($request);
|
|
|
|
$view->setTemplate('/Modules/Workflow/Theme/Cli/empty-command');
|
|
|
|
return $view;
|
|
}
|
|
|
|
/**
|
|
* Validate template create request
|
|
*
|
|
* @param RequestAbstract $request Request
|
|
*
|
|
* @return array<string, bool>
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
private function validateInstanceCreate(RequestAbstract $request) : array
|
|
{
|
|
$val = [];
|
|
if (($val['j'] = empty($request->getData('j')))) {
|
|
return $val;
|
|
}
|
|
|
|
return [];
|
|
}
|
|
|
|
/**
|
|
* Method to create instance from request.
|
|
*
|
|
* @param RequestAbstract $request Request
|
|
*
|
|
* @return WorkflowInstanceAbstract
|
|
*
|
|
* @since 1.0.0
|
|
*/
|
|
private function createInstanceFromRequest(RequestAbstract $request) : WorkflowInstanceAbstract
|
|
{
|
|
/** @var \Modules\Workflow\Models\WorkflowTemplate $template */
|
|
$template = WorkflowTemplateMapper::get()
|
|
->where('id', (int) $request->getData('j'))
|
|
->execute();
|
|
|
|
$controller = null;
|
|
|
|
$files = $template->source->getSources();
|
|
foreach ($files as $tMedia) {
|
|
$lowerPath = \strtolower($tMedia->getPath());
|
|
|
|
switch (true) {
|
|
case StringUtils::endsWith($lowerPath, 'WorkflowController.php'):
|
|
require_once $lowerPath;
|
|
|
|
$controller = new WorkflowController($this->app, $template);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/** @var \Modules\Workflow\Models\WorkflowControllerInterface $controller */
|
|
$instance = $controller->createInstanceFromRequest($request);
|
|
$controller->createInstanceDbModel($instance);
|
|
|
|
return $instance;
|
|
}
|
|
}
|