oms-Workflow/Controller/CliController.php

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://karaka.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://karaka.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;
}
}