Improve Automatic Actions plugin api
This commit is contained in:
141
app/Core/Action/ActionManager.php
Normal file
141
app/Core/Action/ActionManager.php
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
83
app/Core/Event/EventManager.php
Normal file
83
app/Core/Event/EventManager.php
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user