|
|
<?php |
|
|
|
|
|
namespace Kanboard\Action; |
|
|
|
|
|
use Kanboard\Event\GenericEvent; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract class Base extends \Kanboard\Core\Base |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $compatibleEvents = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $callStack = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $projectId = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private $params = array(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
final public function getName() |
|
|
{ |
|
|
return '\\'.get_called_class(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function getDescription(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function doAction(array $data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function getActionRequiredParameters(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function getEventRequiredParameters(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function getCompatibleEvents(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
abstract public function hasRequiredCondition(array $data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function __toString() |
|
|
{ |
|
|
$params = array(); |
|
|
|
|
|
foreach ($this->params as $key => $value) { |
|
|
$params[] = $key.'='.var_export($value, true); |
|
|
} |
|
|
|
|
|
return $this->getName().'('.implode('|', $params).')'; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setProjectId($project_id) |
|
|
{ |
|
|
$this->projectId = $project_id; |
|
|
return $this; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getProjectId() |
|
|
{ |
|
|
return $this->projectId; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function setParam($name, $value) |
|
|
{ |
|
|
$this->params[$name] = $value; |
|
|
return $this; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getParam($name, $default = null) |
|
|
{ |
|
|
return isset($this->params[$name]) ? $this->params[$name] : $default; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function isExecutable(array $data, $eventName) |
|
|
{ |
|
|
return $this->hasCompatibleEvent($eventName) && |
|
|
$this->hasRequiredProject($data) && |
|
|
$this->hasRequiredParameters($data) && |
|
|
$this->hasRequiredCondition($data); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function hasCompatibleEvent($eventName) |
|
|
{ |
|
|
return in_array($eventName, $this->getEvents()); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function hasRequiredProject(array $data) |
|
|
{ |
|
|
return (isset($data['project_id']) && $data['project_id'] == $this->getProjectId()) || |
|
|
(isset($data['task']['project_id']) && $data['task']['project_id'] == $this->getProjectId()); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function hasRequiredParameters(array $data, array $parameters = array()) |
|
|
{ |
|
|
$parameters = $parameters ?: $this->getEventRequiredParameters(); |
|
|
|
|
|
foreach ($parameters as $key => $value) { |
|
|
if (is_array($value)) { |
|
|
return isset($data[$key]) && $this->hasRequiredParameters($data[$key], $value); |
|
|
} else if (! isset($data[$value])) { |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
return true; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function execute(GenericEvent $event, $eventName) |
|
|
{ |
|
|
$data = $event->getAll(); |
|
|
$hash = md5(serialize($data).$eventName); |
|
|
|
|
|
|
|
|
if (isset($this->callStack[$hash])) { |
|
|
return false; |
|
|
} else { |
|
|
$this->callStack[$hash] = true; |
|
|
} |
|
|
|
|
|
$executable = $this->isExecutable($data, $eventName); |
|
|
$executed = false; |
|
|
|
|
|
if ($executable) { |
|
|
$executed = $this->doAction($data); |
|
|
} |
|
|
|
|
|
$this->logger->debug($this.' ['.$eventName.'] => executable='.var_export($executable, true).' exec_success='.var_export($executed, true)); |
|
|
|
|
|
return $executed; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function addEvent($event, $description = '') |
|
|
{ |
|
|
if ($description !== '') { |
|
|
$this->eventManager->register($event, $description); |
|
|
} |
|
|
|
|
|
$this->compatibleEvents[] = $event; |
|
|
return $this; |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function getEvents() |
|
|
{ |
|
|
return array_unique(array_merge($this->getCompatibleEvents(), $this->compatibleEvents)); |
|
|
} |
|
|
} |
|
|
|