summaryrefslogtreecommitdiff
path: root/app/Core
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2016-01-03 16:43:13 -0500
committerFrederic Guillot <fred@kanboard.net>2016-01-03 16:43:13 -0500
commita296ba5b18487d312acca2513d461a210a460fae (patch)
treee5e22ffa7796a9734ec284826dd313219644a539 /app/Core
parentd578b612ea8853682f65ee74fd08f4893152d87a (diff)
Improve Automatic Actions plugin api
Diffstat (limited to 'app/Core')
-rw-r--r--app/Core/Action/ActionManager.php141
-rw-r--r--app/Core/Base.php3
-rw-r--r--app/Core/Event/EventManager.php83
-rw-r--r--app/Core/Mail/Client.php20
4 files changed, 238 insertions, 9 deletions
diff --git a/app/Core/Action/ActionManager.php b/app/Core/Action/ActionManager.php
new file mode 100644
index 00000000..921a8b98
--- /dev/null
+++ b/app/Core/Action/ActionManager.php
@@ -0,0 +1,141 @@
+<?php
+
+namespace Kanboard\Core\Action;
+
+use RuntimeException;
+use Kanboard\Core\Base;
+use Kanboard\Action\Base as ActionBase;
+
+/**
+ * Action Manager
+ *
+ * @package action
+ * @author Frederic Guillot
+ */
+class ActionManager extends Base
+{
+ /**
+ * List of automatic actions
+ *
+ * @access private
+ * @var array
+ */
+ private $actions = array();
+
+ /**
+ * Register a new automatic action
+ *
+ * @access public
+ * @param ActionBase $action
+ * @return ActionManager
+ */
+ public function register(ActionBase $action)
+ {
+ $this->actions[$action->getName()] = $action;
+ return $this;
+ }
+
+ /**
+ * Get automatic action instance
+ *
+ * @access public
+ * @param string $name Absolute class name with namespace
+ * @return ActionBase
+ */
+ public function getAction($name)
+ {
+ if (isset($this->actions[$name])) {
+ return $this->actions[$name];
+ }
+
+ throw new RuntimeException('Automatic Action Not Found: '.$name);
+ }
+
+ /**
+ * Get available automatic actions
+ *
+ * @access public
+ * @return array
+ */
+ public function getAvailableActions()
+ {
+ $actions = array();
+
+ foreach ($this->actions as $action) {
+ if (count($action->getEvents()) > 0) {
+ $actions[$action->getName()] = $action->getDescription();
+ }
+ }
+
+ asort($actions);
+
+ return $actions;
+ }
+
+ /**
+ * Get all available action parameters
+ *
+ * @access public
+ * @param array $actions
+ * @return array
+ */
+ public function getAvailableParameters(array $actions)
+ {
+ $params = array();
+
+ foreach ($actions as $action) {
+ $currentAction = $this->getAction($action['action_name']);
+ $params[$currentAction->getName()] = $currentAction->getActionRequiredParameters();
+ }
+
+ return $params;
+ }
+
+ /**
+ * Get list of compatible events for a given action
+ *
+ * @access public
+ * @param string $name
+ * @return array
+ */
+ public function getCompatibleEvents($name)
+ {
+ $events = array();
+ $actionEvents = $this->getAction($name)->getEvents();
+
+ foreach ($this->eventManager->getAll() as $event => $description) {
+ if (in_array($event, $actionEvents)) {
+ $events[$event] = $description;
+ }
+ }
+
+ return $events;
+ }
+
+ /**
+ * Bind automatic actions to events
+ *
+ * @access public
+ * @return ActionManager
+ */
+ public function attachEvents()
+ {
+ if ($this->userSession->isLogged()) {
+ $actions = $this->action->getAllByUser($this->userSession->getId());
+ } else {
+ $actions = $this->action->getAll();
+ }
+
+ foreach ($actions as $action) {
+ $listener = $this->getAction($action['action_name'])->setProjectId($action['project_id']);
+
+ foreach ($action['params'] as $param_name => $param_value) {
+ $listener->setParam($param_name, $param_value);
+ }
+
+ $this->dispatcher->addListener($action['event_name'], array($listener, 'execute'));
+ }
+
+ return $this;
+ }
+}
diff --git a/app/Core/Base.php b/app/Core/Base.php
index a4cf787a..11a0be68 100644
--- a/app/Core/Base.php
+++ b/app/Core/Base.php
@@ -10,7 +10,9 @@ use Pimple\Container;
* @package core
* @author Frederic Guillot
*
+ * @property \Kanboard\Core\Action\ActionManager $actionManager
* @property \Kanboard\Core\Cache\MemoryCache $memoryCache
+ * @property \Kanboard\Core\Event\EventManager $eventManager
* @property \Kanboard\Core\Group\GroupManager $groupManager
* @property \Kanboard\Core\Http\Client $httpClient
* @property \Kanboard\Core\Http\OAuth2 $oauth
@@ -54,6 +56,7 @@ use Pimple\Container;
* @property \Kanboard\Formatter\UserFilterAutoCompleteFormatter $userFilterAutoCompleteFormatter
* @property \Kanboard\Formatter\GroupAutoCompleteFormatter $groupAutoCompleteFormatter
* @property \Kanboard\Model\Action $action
+ * @property \Kanboard\Model\ActionParameter $actionParameter
* @property \Kanboard\Model\Authentication $authentication
* @property \Kanboard\Model\Board $board
* @property \Kanboard\Model\Category $category
diff --git a/app/Core/Event/EventManager.php b/app/Core/Event/EventManager.php
new file mode 100644
index 00000000..8e66cc12
--- /dev/null
+++ b/app/Core/Event/EventManager.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Kanboard\Core\Event;
+
+use Kanboard\Integration\GitlabWebhook;
+use Kanboard\Integration\GithubWebhook;
+use Kanboard\Integration\BitbucketWebhook;
+use Kanboard\Model\Task;
+use Kanboard\Model\TaskLink;
+
+/**
+ * Event Manager
+ *
+ * @package event
+ * @author Frederic Guillot
+ */
+class EventManager
+{
+ /**
+ * Extended events
+ *
+ * @access private
+ * @var array
+ */
+ private $events = array();
+
+ /**
+ * Add new event
+ *
+ * @access public
+ * @param string $event
+ * @param string $description
+ * @return EventManager
+ */
+ public function register($event, $description)
+ {
+ $this->events[$event] = $description;
+ return $this;
+ }
+
+ /**
+ * Get the list of events and description that can be used from the user interface
+ *
+ * @access public
+ * @return array
+ */
+ public function getAll()
+ {
+ $events = array(
+ TaskLink::EVENT_CREATE_UPDATE => t('Task link creation or modification'),
+ Task::EVENT_MOVE_COLUMN => t('Move a task to another column'),
+ Task::EVENT_UPDATE => t('Task modification'),
+ Task::EVENT_CREATE => t('Task creation'),
+ Task::EVENT_OPEN => t('Reopen a task'),
+ Task::EVENT_CLOSE => t('Closing a task'),
+ Task::EVENT_CREATE_UPDATE => t('Task creation or modification'),
+ Task::EVENT_ASSIGNEE_CHANGE => t('Task assignee change'),
+ GithubWebhook::EVENT_COMMIT => t('Github commit received'),
+ GithubWebhook::EVENT_ISSUE_OPENED => t('Github issue opened'),
+ GithubWebhook::EVENT_ISSUE_CLOSED => t('Github issue closed'),
+ GithubWebhook::EVENT_ISSUE_REOPENED => t('Github issue reopened'),
+ GithubWebhook::EVENT_ISSUE_ASSIGNEE_CHANGE => t('Github issue assignee change'),
+ GithubWebhook::EVENT_ISSUE_LABEL_CHANGE => t('Github issue label change'),
+ GithubWebhook::EVENT_ISSUE_COMMENT => t('Github issue comment created'),
+ GitlabWebhook::EVENT_COMMIT => t('Gitlab commit received'),
+ GitlabWebhook::EVENT_ISSUE_OPENED => t('Gitlab issue opened'),
+ GitlabWebhook::EVENT_ISSUE_REOPENED => t('Gitlab issue reopened'),
+ GitlabWebhook::EVENT_ISSUE_CLOSED => t('Gitlab issue closed'),
+ GitlabWebhook::EVENT_ISSUE_COMMENT => t('Gitlab issue comment created'),
+ BitbucketWebhook::EVENT_COMMIT => t('Bitbucket commit received'),
+ BitbucketWebhook::EVENT_ISSUE_OPENED => t('Bitbucket issue opened'),
+ BitbucketWebhook::EVENT_ISSUE_CLOSED => t('Bitbucket issue closed'),
+ BitbucketWebhook::EVENT_ISSUE_REOPENED => t('Bitbucket issue reopened'),
+ BitbucketWebhook::EVENT_ISSUE_ASSIGNEE_CHANGE => t('Bitbucket issue assignee change'),
+ BitbucketWebhook::EVENT_ISSUE_COMMENT => t('Bitbucket issue comment created'),
+ );
+
+ $events = array_merge($events, $this->events);
+ asort($events);
+
+ return $events;
+ }
+}
diff --git a/app/Core/Mail/Client.php b/app/Core/Mail/Client.php
index 7b4268bd..e1f31696 100644
--- a/app/Core/Mail/Client.php
+++ b/app/Core/Mail/Client.php
@@ -45,19 +45,21 @@ class Client extends Base
*/
public function send($email, $name, $subject, $html)
{
- $this->container['logger']->debug('Sending email to '.$email.' ('.MAIL_TRANSPORT.')');
+ if (! empty($email)) {
+ $this->logger->debug('Sending email to '.$email.' ('.MAIL_TRANSPORT.')');
- $start_time = microtime(true);
- $author = 'Kanboard';
+ $start_time = microtime(true);
+ $author = 'Kanboard';
- if ($this->userSession->isLogged()) {
- $author = e('%s via Kanboard', $this->helper->user->getFullname());
- }
+ if ($this->userSession->isLogged()) {
+ $author = e('%s via Kanboard', $this->helper->user->getFullname());
+ }
- $this->getTransport(MAIL_TRANSPORT)->sendEmail($email, $name, $subject, $html, $author);
+ $this->getTransport(MAIL_TRANSPORT)->sendEmail($email, $name, $subject, $html, $author);
- if (DEBUG) {
- $this->logger->debug('Email sent in '.round(microtime(true) - $start_time, 6).' seconds');
+ if (DEBUG) {
+ $this->logger->debug('Email sent in '.round(microtime(true) - $start_time, 6).' seconds');
+ }
}
return $this;