From 03fa01ac7b036820ee232d893ec63241918c6012 Mon Sep 17 00:00:00 2001 From: Frédéric Guillot Date: Sun, 28 Sep 2014 14:26:40 -0400 Subject: Improve automatic actions (check for compatible events/actions/parameters) --- app/Action/Base.php | 116 ++++++++++++++++++++++++----- app/Action/TaskAssignCategoryColor.php | 47 ++++++------ app/Action/TaskAssignColorCategory.php | 47 ++++++------ app/Action/TaskAssignColorUser.php | 48 ++++++------ app/Action/TaskAssignCurrentUser.php | 57 ++++++-------- app/Action/TaskAssignSpecificUser.php | 48 ++++++------ app/Action/TaskClose.php | 65 +++++++++------- app/Action/TaskDuplicateAnotherProject.php | 45 ++++++----- app/Action/TaskMoveAnotherProject.php | 45 ++++++----- 9 files changed, 297 insertions(+), 221 deletions(-) (limited to 'app/Action') diff --git a/app/Action/Base.php b/app/Action/Base.php index 5b7b3502..339aeecc 100644 --- a/app/Action/Base.php +++ b/app/Action/Base.php @@ -3,12 +3,17 @@ namespace Action; use Core\Listener; +use Core\Registry; +use Core\Tool; /** * Base class for automatic actions * * @package action * @author Frederic Guillot + * + * @property \Model\Acl $acl + * @property \Model\Task $task */ abstract class Base implements Listener { @@ -28,6 +33,22 @@ abstract class Base implements Listener */ private $params = array(); + /** + * Attached event name + * + * @access protected + * @var string + */ + protected $event_name = ''; + + /** + * Registry instance + * + * @access protected + * @var \Core\Registry + */ + protected $registry; + /** * Execute the action * @@ -56,15 +77,60 @@ abstract class Base implements Listener */ abstract public function getEventRequiredParameters(); + /** + * Get the compatible events + * + * @abstract + * @access public + * @return array + */ + abstract public function getCompatibleEvents(); + + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + abstract public function hasRequiredCondition(array $data); + /** * Constructor * * @access public - * @param integer $project_id Project id + * @param \Core\Registry $registry Regsitry instance + * @param integer $project_id Project id + * @param string $event_name Attached event name */ - public function __construct($project_id) + public function __construct(Registry $registry, $project_id, $event_name) { + $this->registry = $registry; $this->project_id = $project_id; + $this->event_name = $event_name; + } + + /** + * Return class information + * + * @access public + * @return string + */ + public function __toString() + { + return get_called_class(); + } + + /** + * Load automatically models + * + * @access public + * @param string $name Model name + * @return mixed + */ + public function __get($name) + { + return Tool::loadModel($this->registry, $name); } /** @@ -101,11 +167,34 @@ abstract class Base implements Listener */ public function isExecutable(array $data) { - if (isset($data['project_id']) && $data['project_id'] == $this->project_id && $this->hasRequiredParameters($data)) { - return true; - } + return $this->hasCompatibleEvent() && + $this->hasRequiredProject($data) && + $this->hasRequiredParameters($data) && + $this->hasRequiredCondition($data); + } - return false; + /** + * Check if the event is compatible with the action + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasCompatibleEvent() + { + return in_array($this->event_name, $this->getCompatibleEvents()); + } + + /** + * Check if the event data has the required project + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredProject(array $data) + { + return isset($data['project_id']) && $data['project_id'] == $this->project_id; } /** @@ -118,7 +207,9 @@ abstract class Base implements Listener public function hasRequiredParameters(array $data) { foreach ($this->getEventRequiredParameters() as $parameter) { - if (! isset($data[$parameter])) return false; + if (! isset($data[$parameter])) { + return false; + } } return true; @@ -139,15 +230,4 @@ abstract class Base implements Listener return false; } - - /** - * Return class information - * - * @access public - * @return string - */ - public function __toString() - { - return get_called_class(); - } } diff --git a/app/Action/TaskAssignCategoryColor.php b/app/Action/TaskAssignCategoryColor.php index 3e5b9304..be15f659 100644 --- a/app/Action/TaskAssignCategoryColor.php +++ b/app/Action/TaskAssignCategoryColor.php @@ -13,24 +13,16 @@ use Model\Task; class TaskAssignCategoryColor extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + ); } /** @@ -62,7 +54,7 @@ class TaskAssignCategoryColor extends Base } /** - * Execute the action + * Execute the action (change the category) * * @access public * @param array $data Event data dictionary @@ -70,16 +62,23 @@ class TaskAssignCategoryColor extends Base */ public function doAction(array $data) { - if ($data['color_id'] == $this->getParam('color_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'category_id' => $this->getParam('category_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'category_id' => $this->getParam('category_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['color_id'] == $this->getParam('color_id'); } } diff --git a/app/Action/TaskAssignColorCategory.php b/app/Action/TaskAssignColorCategory.php index e7aad01f..f5a9ac5a 100644 --- a/app/Action/TaskAssignColorCategory.php +++ b/app/Action/TaskAssignColorCategory.php @@ -13,24 +13,16 @@ use Model\Task; class TaskAssignColorCategory extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + ); } /** @@ -62,7 +54,7 @@ class TaskAssignColorCategory extends Base } /** - * Execute the action + * Execute the action (change the task color) * * @access public * @param array $data Event data dictionary @@ -70,16 +62,23 @@ class TaskAssignColorCategory extends Base */ public function doAction(array $data) { - if ($data['category_id'] == $this->getParam('category_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'color_id' => $this->getParam('color_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'color_id' => $this->getParam('color_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['category_id'] == $this->getParam('category_id'); } } diff --git a/app/Action/TaskAssignColorUser.php b/app/Action/TaskAssignColorUser.php index dad46bf9..00680186 100644 --- a/app/Action/TaskAssignColorUser.php +++ b/app/Action/TaskAssignColorUser.php @@ -13,24 +13,17 @@ use Model\Task; class TaskAssignColorUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE, + Task::EVENT_ASSIGNEE_CHANGE, + ); } /** @@ -62,7 +55,7 @@ class TaskAssignColorUser extends Base } /** - * Execute the action + * Execute the action (change the task color) * * @access public * @param array $data Event data dictionary @@ -70,16 +63,23 @@ class TaskAssignColorUser extends Base */ public function doAction(array $data) { - if ($data['owner_id'] == $this->getParam('user_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'color_id' => $this->getParam('color_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'color_id' => $this->getParam('color_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['owner_id'] == $this->getParam('user_id'); } } diff --git a/app/Action/TaskAssignCurrentUser.php b/app/Action/TaskAssignCurrentUser.php index 8ae87ff9..7a9cf70b 100644 --- a/app/Action/TaskAssignCurrentUser.php +++ b/app/Action/TaskAssignCurrentUser.php @@ -3,7 +3,6 @@ namespace Action; use Model\Task; -use Model\Acl; /** * Assign a task to the logged user @@ -14,34 +13,17 @@ use Model\Acl; class TaskAssignCurrentUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Acl model - * - * @accesss private - * @var \Model\Acl - */ - private $acl; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance - * @param \Model\Acl $acl Acl model instance + * @return array */ - public function __construct($project_id, Task $task, Acl $acl) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; - $this->acl = $acl; + return array( + Task::EVENT_CREATE, + Task::EVENT_MOVE_COLUMN, + ); } /** @@ -80,16 +62,23 @@ class TaskAssignCurrentUser extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'owner_id' => $this->acl->getUserId(), - ), false); + $values = array( + 'id' => $data['task_id'], + 'owner_id' => $this->acl->getUserId(), + ); - return true; - } + return $this->task->update($values, false); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskAssignSpecificUser.php b/app/Action/TaskAssignSpecificUser.php index a903327b..f70459be 100644 --- a/app/Action/TaskAssignSpecificUser.php +++ b/app/Action/TaskAssignSpecificUser.php @@ -13,24 +13,17 @@ use Model\Task; class TaskAssignSpecificUser extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_CREATE_UPDATE, + Task::EVENT_MOVE_COLUMN, + ); } /** @@ -62,7 +55,7 @@ class TaskAssignSpecificUser extends Base } /** - * Execute the action + * Execute the action (assign the given user) * * @access public * @param array $data Event data dictionary @@ -70,16 +63,23 @@ class TaskAssignSpecificUser extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - - $this->task->update(array( - 'id' => $data['task_id'], - 'owner_id' => $this->getParam('user_id'), - ), false); + $values = array( + 'id' => $data['task_id'], + 'owner_id' => $this->getParam('user_id'), + ); - return true; - } + return $this->task->update($values, false); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['column_id'] == $this->getParam('column_id'); } } diff --git a/app/Action/TaskClose.php b/app/Action/TaskClose.php index 32887d3c..da0744d0 100644 --- a/app/Action/TaskClose.php +++ b/app/Action/TaskClose.php @@ -2,6 +2,7 @@ namespace Action; +use Model\GithubWebhook; use Model\Task; /** @@ -13,24 +14,17 @@ use Model\Task; class TaskClose extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + GithubWebhook::EVENT_COMMIT, + ); } /** @@ -41,9 +35,12 @@ class TaskClose extends Base */ public function getActionRequiredParameters() { - return array( - 'column_id' => t('Column'), - ); + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return array(); + default: + return array('column_id' => t('Column')); + } } /** @@ -54,14 +51,16 @@ class TaskClose extends Base */ public function getEventRequiredParameters() { - return array( - 'task_id', - 'column_id', - ); + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return array('task_id'); + default: + return array('task_id', 'column_id'); + } } /** - * Execute the action + * Execute the action (close the task) * * @access public * @param array $data Event data dictionary @@ -69,11 +68,23 @@ class TaskClose extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id')) { - $this->task->close($data['task_id']); - return true; - } + return $this->task->close($data['task_id']); + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + switch ($this->event_name) { + case GithubWebhook::EVENT_COMMIT: + return true; + default: + return $data['column_id'] == $this->getParam('column_id'); + } } } diff --git a/app/Action/TaskDuplicateAnotherProject.php b/app/Action/TaskDuplicateAnotherProject.php index 0f14cbed..b76b3884 100644 --- a/app/Action/TaskDuplicateAnotherProject.php +++ b/app/Action/TaskDuplicateAnotherProject.php @@ -13,24 +13,17 @@ use Model\Task; class TaskDuplicateAnotherProject extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + Task::EVENT_CLOSE, + ); } /** @@ -63,7 +56,7 @@ class TaskDuplicateAnotherProject extends Base } /** - * Execute the action + * Execute the action (duplicate the task to another project) * * @access public * @param array $data Event data dictionary @@ -71,14 +64,20 @@ class TaskDuplicateAnotherProject extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id')) { - - $task = $this->task->getById($data['task_id']); - $this->task->duplicateToAnotherProject($this->getParam('project_id'), $task); - - return true; - } + $task = $this->task->getById($data['task_id']); + $this->task->duplicateToAnotherProject($this->getParam('project_id'), $task); + return true; + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); } } diff --git a/app/Action/TaskMoveAnotherProject.php b/app/Action/TaskMoveAnotherProject.php index 8091053e..9922a981 100644 --- a/app/Action/TaskMoveAnotherProject.php +++ b/app/Action/TaskMoveAnotherProject.php @@ -13,24 +13,17 @@ use Model\Task; class TaskMoveAnotherProject extends Base { /** - * Task model - * - * @accesss private - * @var \Model\Task - */ - private $task; - - /** - * Constructor + * Get the list of compatible events * * @access public - * @param integer $project_id Project id - * @param \Model\Task $task Task model instance + * @return array */ - public function __construct($project_id, Task $task) + public function getCompatibleEvents() { - parent::__construct($project_id); - $this->task = $task; + return array( + Task::EVENT_MOVE_COLUMN, + Task::EVENT_CLOSE, + ); } /** @@ -63,7 +56,7 @@ class TaskMoveAnotherProject extends Base } /** - * Execute the action + * Execute the action (move the task to another project) * * @access public * @param array $data Event data dictionary @@ -71,14 +64,20 @@ class TaskMoveAnotherProject extends Base */ public function doAction(array $data) { - if ($data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id')) { - - $task = $this->task->getById($data['task_id']); - $this->task->moveToAnotherProject($this->getParam('project_id'), $task); - - return true; - } + $task = $this->task->getById($data['task_id']); + $this->task->moveToAnotherProject($this->getParam('project_id'), $task); + return true; + } - return false; + /** + * Check if the event data meet the action condition + * + * @access public + * @param array $data Event data dictionary + * @return bool + */ + public function hasRequiredCondition(array $data) + { + return $data['column_id'] == $this->getParam('column_id') && $data['project_id'] != $this->getParam('project_id'); } } -- cgit v1.2.3