new: [action module] added background processing

pull/8530/head
iglocska 2022-05-11 12:35:52 +02:00
parent dbdde2f197
commit a7b6f7ba46
No known key found for this signature in database
GPG Key ID: BEA224F1FEF113AC
2 changed files with 106 additions and 20 deletions

View File

@ -0,0 +1,51 @@
<?php
App::uses('BackgroundJobsTool', 'Tools');
require_once 'AppShell.php';
/**
* @property Job $Job
* @property User $User
*/
class ModuleShell extends AppShell
{
public $uses = array('Module', 'User', 'Job', 'Server');
public function execute_action_module()
{
if (!isset($this->args[0]) || empty($this->args[1]) || empty($this->args[2])) {
die('Usage: ' . $this->Server->command_line_functions['console_automation_tasks']['data']['Execute Action Module'] . PHP_EOL);
}
$userId = $this->args[0];
$data = $this->args[1];
if (!empty($this->args[2])) {
$jobId = $this->args[2];
} else {
$jobId = $this->Job->createJob(null, Job::WORKER_PRIO, 'execute_action_module', 'Module: ' . $data["module"], 'Executing...');
}
$this->Job->read(null, $jobId);
$result = $this->Module->executeAction($data);
if (empty($result['data']) || !empty($result['error'])) {
$message = empty($result['error']) ? __('Execution failed for module %s.', $data['module']) : $result['error'];
$this->Job->saveStatus($jobId, false, $message);
} else {
$message = 'Job done.';
$this->Job->saveStatus($jobId, true, $message);
$this->Job->saveProgress($jobId, $message, 100);
}
}
/**
* @param int $userId
* @return array
*/
private function getUser($userId)
{
$user = $this->User->getAuthUser($userId);
if (empty($user)) {
$this->error('User ID do not match an existing user.');
}
return $user;
}
}

View File

@ -353,6 +353,9 @@ class Module extends AppModel
{
$modules = $this->getEnabledModules($user, null, $moduleFamily = 'Action');
$sorted_modules = [];
if (empty($modules) || !is_array($modules)) {
return true;
}
foreach ($modules['modules'] as $k => &$module) {
if (!in_array($type, $module['mispattributes']['hooks'])) {
//unset($modules['modules'][$k]);
@ -374,29 +377,61 @@ class Module extends AppModel
'config' => empty($module['config']) ? [] : $module['config'],
'data' => $input
];
$result = $this->queryModuleServer($data, false, 'Action');
if (!empty($result['error'])) {
$this->loadLog()->createLogEntry(
'SYSTEM',
'warning',
empty($logData['model']) ? 'Module' : $logData['model'],
empty($logData['id']) ? 0 : $logData['id'],
sprintf(
'Executing %s action module on failed.',
$type
),
sprintf(
'Returned error: %s',
$result['error']
)
);
}
if (!empty($module['mispattributes']['blocking']) && (empty($result['data']) || !empty($result['error']))) {
$error = empty($result['error']) ? __('Execution failed for module %s.', $module['name']) : $result['error'];
return false;
if (empty($module['mispattributes']['blocking'])) {
$this->enqueueAction($data, $user);
return true;
} else {
$result = $this->executeAction($data);
if (empty($result['data']) || !empty($result['error'])) {
$error = empty($result['error']) ? __('Execution failed for module %s.', $module['name']) : $result['error'];
return false;
}
}
}
}
return true;
}
public function enqueueAction($data, $user)
{
/** @var Job $job */
$job = ClassRegistry::init('Job');
$jobId = $job->createJob($user, Job::WORKER_PRIO, 'execute_action_module', 'Module: ' . $data["module"], 'Executing...');
$args = [
'execute_action_module',
$user['id'],
$data,
$jobId
];
$this->getBackgroundJobsTool()->enqueue(
BackgroundJobsTool::PRIO_QUEUE,
BackgroundJobsTool::CMD_MODULE,
$args,
true,
$jobId
);
return true;
}
public function executeAction($data)
{
$result = $this->queryModuleServer($data, false, 'Action');
if (!empty($result['error'])) {
$this->loadLog()->createLogEntry(
'SYSTEM',
'warning',
empty($logData['model']) ? 'Module' : $logData['model'],
empty($logData['id']) ? 0 : $logData['id'],
sprintf(
'Executing %s action module on failed.',
$type
),
sprintf(
'Returned error: %s',
$result['error']
)
);
}
return $result;
}
}