Move events handling to Symfony\EventDispatcher
This commit is contained in:
@@ -2,9 +2,8 @@
|
|||||||
|
|
||||||
namespace Action;
|
namespace Action;
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use Core\Listener;
|
|
||||||
use Core\Tool;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for automatic actions
|
* Base class for automatic actions
|
||||||
@@ -21,8 +20,16 @@ use Core\Tool;
|
|||||||
* @property \Model\TaskFinder $taskFinder
|
* @property \Model\TaskFinder $taskFinder
|
||||||
* @property \Model\TaskStatus $taskStatus
|
* @property \Model\TaskStatus $taskStatus
|
||||||
*/
|
*/
|
||||||
abstract class Base implements Listener
|
abstract class Base
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Flag for called listener
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @var boolean
|
||||||
|
*/
|
||||||
|
private $called = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project id
|
* Project id
|
||||||
*
|
*
|
||||||
@@ -114,6 +121,7 @@ abstract class Base implements Listener
|
|||||||
$this->container = $container;
|
$this->container = $container;
|
||||||
$this->project_id = $project_id;
|
$this->project_id = $project_id;
|
||||||
$this->event_name = $event_name;
|
$this->event_name = $event_name;
|
||||||
|
$this->called = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -136,7 +144,7 @@ abstract class Base implements Listener
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
return Tool::loadModel($this->container, $name);
|
return $this->container[$name];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -225,12 +233,20 @@ abstract class Base implements Listener
|
|||||||
* Execute the action
|
* Execute the action
|
||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param array $data Event data dictionary
|
* @param \Event\GenericEvent $event Event data dictionary
|
||||||
* @return bool True if the action was executed or false when not executed
|
* @return bool True if the action was executed or false when not executed
|
||||||
*/
|
*/
|
||||||
public function execute(array $data)
|
public function execute(GenericEvent $event)
|
||||||
{
|
{
|
||||||
|
// Avoid infinite loop, a listener instance can be called only one time
|
||||||
|
if ($this->called) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = $event->getAll();
|
||||||
|
|
||||||
if ($this->isExecutable($data)) {
|
if ($this->isExecutable($data)) {
|
||||||
|
$this->called = true;
|
||||||
return $this->doAction($data);
|
return $this->doAction($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class TaskAssignCategoryColor extends Base
|
|||||||
'category_id' => $this->getParam('category_id'),
|
'category_id' => $this->getParam('category_id'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class TaskAssignCategoryLabel extends Base
|
|||||||
'category_id' => isset($data['category_id']) ? $data['category_id'] : $this->getParam('category_id'),
|
'category_id' => isset($data['category_id']) ? $data['category_id'] : $this->getParam('category_id'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ class TaskAssignColorCategory extends Base
|
|||||||
'color_id' => $this->getParam('color_id'),
|
'color_id' => $this->getParam('color_id'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class TaskAssignColorUser extends Base
|
|||||||
'color_id' => $this->getParam('color_id'),
|
'color_id' => $this->getParam('color_id'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -62,12 +62,16 @@ class TaskAssignCurrentUser extends Base
|
|||||||
*/
|
*/
|
||||||
public function doAction(array $data)
|
public function doAction(array $data)
|
||||||
{
|
{
|
||||||
|
if (! $this->acl->isLogged()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $data['task_id'],
|
'id' => $data['task_id'],
|
||||||
'owner_id' => $this->acl->getUserId(),
|
'owner_id' => $this->acl->getUserId(),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ class TaskAssignSpecificUser extends Base
|
|||||||
'owner_id' => $this->getParam('user_id'),
|
'owner_id' => $this->getParam('user_id'),
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class TaskAssignUser extends Base
|
|||||||
'owner_id' => $data['owner_id'],
|
'owner_id' => $data['owner_id'],
|
||||||
);
|
);
|
||||||
|
|
||||||
return $this->taskModification->update($values, false);
|
return $this->taskModification->update($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ class TaskCreation extends Base
|
|||||||
'project_id' => $data['project_id'],
|
'project_id' => $data['project_id'],
|
||||||
'title' => $data['title'],
|
'title' => $data['title'],
|
||||||
'reference' => $data['reference'],
|
'reference' => $data['reference'],
|
||||||
'description' => $data['description'],
|
'description' => isset($data['description']) ? $data['description'] : '',
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Auth;
|
namespace Auth;
|
||||||
|
|
||||||
use Core\Tool;
|
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -54,6 +53,6 @@ abstract class Base
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
return Tool::loadModel($this->container, $name);
|
return $this->container[$name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace Console;
|
namespace Console;
|
||||||
|
|
||||||
use Core\Tool;
|
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use Symfony\Component\Console\Command\Command;
|
use Symfony\Component\Console\Command\Command;
|
||||||
|
|
||||||
@@ -52,6 +51,6 @@ abstract class Base extends Command
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
return Tool::loadModel($this->container, $name);
|
return $this->container[$name];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
namespace Controller;
|
namespace Controller;
|
||||||
|
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use Core\Tool;
|
|
||||||
use Core\Security;
|
use Core\Security;
|
||||||
use Core\Request;
|
use Core\Request;
|
||||||
use Core\Response;
|
use Core\Response;
|
||||||
@@ -129,7 +128,7 @@ abstract class Base
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
return Tool::loadModel($this->container, $name);
|
return $this->container[$name];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -156,9 +155,6 @@ abstract class Base
|
|||||||
$this->response->hsts();
|
$this->response->hsts();
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->config->setupTranslations();
|
|
||||||
$this->config->setupTimezone();
|
|
||||||
|
|
||||||
// Authentication
|
// Authentication
|
||||||
if (! $this->authentication->isAuthenticated($controller, $action)) {
|
if (! $this->authentication->isAuthenticated($controller, $action)) {
|
||||||
|
|
||||||
@@ -173,30 +169,6 @@ abstract class Base
|
|||||||
if (! $this->acl->isPageAccessAllowed($controller, $action)) {
|
if (! $this->acl->isPageAccessAllowed($controller, $action)) {
|
||||||
$this->response->redirect('?controller=user&action=forbidden');
|
$this->response->redirect('?controller=user&action=forbidden');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attach events
|
|
||||||
$this->attachEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
private function attachEvents()
|
|
||||||
{
|
|
||||||
$models = array(
|
|
||||||
'projectActivity', // Order is important
|
|
||||||
'projectDailySummary',
|
|
||||||
'action',
|
|
||||||
'project',
|
|
||||||
'webhook',
|
|
||||||
'notification',
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($models as $model) {
|
|
||||||
$this->$model->attachEvents();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,175 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Core;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event dispatcher class
|
|
||||||
*
|
|
||||||
* @package core
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class Event
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Contains all listeners
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $listeners = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The last listener executed
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastListener = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The last triggered event
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $lastEvent = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Triggered events list
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var array
|
|
||||||
*/
|
|
||||||
private $events = array();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach a listener object to an event
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $eventName Event name
|
|
||||||
* @param Listener $listener Object that implements the Listener interface
|
|
||||||
*/
|
|
||||||
public function attach($eventName, Listener $listener)
|
|
||||||
{
|
|
||||||
if (! isset($this->listeners[$eventName])) {
|
|
||||||
$this->listeners[$eventName] = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->listeners[$eventName][] = $listener;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Trigger an event
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $eventName Event name
|
|
||||||
* @param array $data Event data
|
|
||||||
*/
|
|
||||||
public function trigger($eventName, array $data)
|
|
||||||
{
|
|
||||||
if (! $this->isEventTriggered($eventName)) {
|
|
||||||
|
|
||||||
$this->events[$eventName] = $data;
|
|
||||||
|
|
||||||
if (isset($this->listeners[$eventName])) {
|
|
||||||
|
|
||||||
foreach ($this->listeners[$eventName] as $listener) {
|
|
||||||
|
|
||||||
$this->lastEvent = $eventName;
|
|
||||||
|
|
||||||
if ($listener->execute($data)) {
|
|
||||||
$this->lastListener = get_class($listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the last listener executed
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return string Event name
|
|
||||||
*/
|
|
||||||
public function getLastListenerExecuted()
|
|
||||||
{
|
|
||||||
return $this->lastListener;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the last fired event
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return string Event name
|
|
||||||
*/
|
|
||||||
public function getLastTriggeredEvent()
|
|
||||||
{
|
|
||||||
return $this->lastEvent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a list of triggered events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getTriggeredEvents()
|
|
||||||
{
|
|
||||||
return $this->events;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get a list of triggered events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getEventData($eventName)
|
|
||||||
{
|
|
||||||
return isset($this->events[$eventName]) ? $this->events[$eventName] : array();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if an event have been triggered
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $eventName Event name
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function isEventTriggered($eventName)
|
|
||||||
{
|
|
||||||
return isset($this->events[$eventName]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flush the list of triggered events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function clearTriggeredEvents()
|
|
||||||
{
|
|
||||||
$this->events = array();
|
|
||||||
$this->lastEvent = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a listener bind to an event
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $eventName Event name
|
|
||||||
* @param mixed $instance Instance name or object itself
|
|
||||||
* @return bool Yes or no
|
|
||||||
*/
|
|
||||||
public function hasListener($eventName, $instance)
|
|
||||||
{
|
|
||||||
if (isset($this->listeners[$eventName])) {
|
|
||||||
foreach ($this->listeners[$eventName] as $listener) {
|
|
||||||
if ($listener instanceof $instance) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Core;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Event listener interface
|
|
||||||
*
|
|
||||||
* @package core
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
interface Listener
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute the listener
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data
|
|
||||||
* @return boolean
|
|
||||||
*/
|
|
||||||
public function execute(array $data);
|
|
||||||
}
|
|
||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace Core;
|
namespace Core;
|
||||||
|
|
||||||
use Pimple\Container;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tool class
|
* Tool class
|
||||||
*
|
*
|
||||||
@@ -33,23 +31,4 @@ class Tool
|
|||||||
fclose($fp);
|
fclose($fp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Load and register a model
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @access public
|
|
||||||
* @param Pimple\Container $container Container instance
|
|
||||||
* @param string $name Model name
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public static function loadModel(Container $container, $name)
|
|
||||||
{
|
|
||||||
if (! isset($container[$name])) {
|
|
||||||
$class = '\Model\\'.ucfirst($name);
|
|
||||||
$container[$name] = new $class($container);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $container[$name];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
use Pimple\Container;
|
|
||||||
use Core\Listener;
|
|
||||||
use Core\Tool;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Base Listener
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*
|
|
||||||
* @property \Model\Comment $comment
|
|
||||||
* @property \Model\Project $project
|
|
||||||
* @property \Model\ProjectActivity $projectActivity
|
|
||||||
* @property \Model\SubTask $subTask
|
|
||||||
* @property \Model\Task $task
|
|
||||||
* @property \Model\TaskFinder $taskFinder
|
|
||||||
*/
|
|
||||||
abstract class Base implements Listener
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Container instance
|
|
||||||
*
|
|
||||||
* @access protected
|
|
||||||
* @var \Pimple\Container
|
|
||||||
*/
|
|
||||||
protected $container;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param \Pimple\Container $container
|
|
||||||
*/
|
|
||||||
public function __construct(Container $container)
|
|
||||||
{
|
|
||||||
$this->container = $container;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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->container, $name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get event namespace
|
|
||||||
*
|
|
||||||
* Event = task.close | Namespace = task
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getEventNamespace()
|
|
||||||
{
|
|
||||||
$event_name = $this->container['event']->getLastTriggeredEvent();
|
|
||||||
return substr($event_name, 0, strpos($event_name, '.'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
7
app/Event/CommentEvent.php
Normal file
7
app/Event/CommentEvent.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Event;
|
||||||
|
|
||||||
|
class CommentEvent extends GenericEvent
|
||||||
|
{
|
||||||
|
}
|
||||||
7
app/Event/FileEvent.php
Normal file
7
app/Event/FileEvent.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Event;
|
||||||
|
|
||||||
|
class FileEvent extends GenericEvent
|
||||||
|
{
|
||||||
|
}
|
||||||
45
app/Event/GenericEvent.php
Normal file
45
app/Event/GenericEvent.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Event;
|
||||||
|
|
||||||
|
use ArrayAccess;
|
||||||
|
use Symfony\Component\EventDispatcher\Event as BaseEvent;
|
||||||
|
|
||||||
|
class GenericEvent extends BaseEvent implements ArrayAccess
|
||||||
|
{
|
||||||
|
private $container = array();
|
||||||
|
|
||||||
|
public function __construct(array $values = array())
|
||||||
|
{
|
||||||
|
$this->container = $values;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAll()
|
||||||
|
{
|
||||||
|
return $this->container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetSet($offset, $value)
|
||||||
|
{
|
||||||
|
if (is_null($offset)) {
|
||||||
|
$this->container[] = $value;
|
||||||
|
} else {
|
||||||
|
$this->container[$offset] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetExists($offset)
|
||||||
|
{
|
||||||
|
return isset($this->container[$offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetUnset($offset)
|
||||||
|
{
|
||||||
|
unset($this->container[$offset]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function offsetGet($offset)
|
||||||
|
{
|
||||||
|
return isset($this->container[$offset]) ? $this->container[$offset] : null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Notification listener
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class NotificationListener extends Base
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Template name
|
|
||||||
*
|
|
||||||
* @accesss private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $template = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set template name
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $template Template name
|
|
||||||
*/
|
|
||||||
public function setTemplate($template)
|
|
||||||
{
|
|
||||||
$this->template = $template;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the action
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return bool True if the action was executed or false when not executed
|
|
||||||
*/
|
|
||||||
public function execute(array $data)
|
|
||||||
{
|
|
||||||
$values = $this->getTemplateData($data);
|
|
||||||
$users = $this->notification->getUsersList($values['task']['project_id']);
|
|
||||||
|
|
||||||
if ($users) {
|
|
||||||
$this->notification->sendEmails($this->template, $users, $values);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch data for the mail template
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getTemplateData(array $data)
|
|
||||||
{
|
|
||||||
$values = array();
|
|
||||||
|
|
||||||
switch ($this->getEventNamespace()) {
|
|
||||||
case 'task':
|
|
||||||
$values['task'] = $this->taskFinder->getDetails($data['task_id']);
|
|
||||||
break;
|
|
||||||
case 'subtask':
|
|
||||||
$values['subtask'] = $this->subtask->getById($data['id'], true);
|
|
||||||
$values['task'] = $this->taskFinder->getDetails($data['task_id']);
|
|
||||||
break;
|
|
||||||
case 'file':
|
|
||||||
$values['file'] = $data;
|
|
||||||
$values['task'] = $this->taskFinder->getDetails($data['task_id']);
|
|
||||||
break;
|
|
||||||
case 'comment':
|
|
||||||
$values['comment'] = $this->comment->getById($data['id']);
|
|
||||||
$values['task'] = $this->taskFinder->getDetails($values['comment']['task_id']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $values;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Project activity listener
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class ProjectActivityListener extends Base
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute the action
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return bool True if the action was executed or false when not executed
|
|
||||||
*/
|
|
||||||
public function execute(array $data)
|
|
||||||
{
|
|
||||||
if (isset($data['task_id'])) {
|
|
||||||
|
|
||||||
$values = $this->getValues($data);
|
|
||||||
|
|
||||||
return $this->projectActivity->createEvent(
|
|
||||||
$values['task']['project_id'],
|
|
||||||
$values['task']['id'],
|
|
||||||
$this->acl->getUserId(),
|
|
||||||
$this->container['event']->getLastTriggeredEvent(),
|
|
||||||
$values
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get event activity data
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
private function getValues(array $data)
|
|
||||||
{
|
|
||||||
$values = array();
|
|
||||||
$values['task'] = $this->taskFinder->getDetails($data['task_id']);
|
|
||||||
|
|
||||||
switch ($this->getEventNamespace()) {
|
|
||||||
case 'subtask':
|
|
||||||
$values['subtask'] = $this->subTask->getById($data['id'], true);
|
|
||||||
break;
|
|
||||||
case 'comment':
|
|
||||||
$values['comment'] = $this->comment->getById($data['id']);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $values;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Project daily summary listener
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class ProjectDailySummaryListener extends Base
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute the action
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return bool True if the action was executed or false when not executed
|
|
||||||
*/
|
|
||||||
public function execute(array $data)
|
|
||||||
{
|
|
||||||
if (isset($data['project_id'])) {
|
|
||||||
return $this->projectDailySummary->updateTotals($data['project_id'], date('Y-m-d'));
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Project modification date listener
|
|
||||||
*
|
|
||||||
* Update the "last_modified" field for a project
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class ProjectModificationDateListener extends Base
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Execute the action
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return bool True if the action was executed or false when not executed
|
|
||||||
*/
|
|
||||||
public function execute(array $data)
|
|
||||||
{
|
|
||||||
if (isset($data['project_id'])) {
|
|
||||||
return $this->project->updateModificationDate($data['project_id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
7
app/Event/SubtaskEvent.php
Normal file
7
app/Event/SubtaskEvent.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Event;
|
||||||
|
|
||||||
|
class SubtaskEvent extends GenericEvent
|
||||||
|
{
|
||||||
|
}
|
||||||
7
app/Event/TaskEvent.php
Normal file
7
app/Event/TaskEvent.php
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Event;
|
||||||
|
|
||||||
|
class TaskEvent extends GenericEvent
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace Event;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Webhook task events
|
|
||||||
*
|
|
||||||
* @package event
|
|
||||||
* @author Frederic Guillot
|
|
||||||
*/
|
|
||||||
class WebhookListener extends Base
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Url to call
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $url = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set webhook url
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $url URL to call
|
|
||||||
*/
|
|
||||||
public function setUrl($url)
|
|
||||||
{
|
|
||||||
$this->url = $url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute the action
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param array $data Event data dictionary
|
|
||||||
* @return bool True if the action was executed or false when not executed
|
|
||||||
*/
|
|
||||||
public function execute(array $data)
|
|
||||||
{
|
|
||||||
$this->webhook->notify($this->url, $data);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -248,7 +248,7 @@ class Action extends Base
|
|||||||
$listener->setParam($param['name'], $param['value']);
|
$listener->setParam($param['name'], $param['value']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->event->attach($action['event_name'], $listener);
|
$this->container['dispatcher']->addListener($action['event_name'], array($listener, 'execute'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
use Core\Event;
|
|
||||||
use Core\Tool;
|
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use PicoDb\Database;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base model class
|
* Base model class
|
||||||
@@ -51,14 +48,6 @@ abstract class Base
|
|||||||
*/
|
*/
|
||||||
protected $db;
|
protected $db;
|
||||||
|
|
||||||
/**
|
|
||||||
* Event dispatcher instance
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @var \Core\Event
|
|
||||||
*/
|
|
||||||
public $event;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Container instance
|
* Container instance
|
||||||
*
|
*
|
||||||
@@ -77,7 +66,6 @@ abstract class Base
|
|||||||
{
|
{
|
||||||
$this->container = $container;
|
$this->container = $container;
|
||||||
$this->db = $this->container['db'];
|
$this->db = $this->container['db'];
|
||||||
$this->event = $this->container['event'];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -89,7 +77,7 @@ abstract class Base
|
|||||||
*/
|
*/
|
||||||
public function __get($name)
|
public function __get($name)
|
||||||
{
|
{
|
||||||
return Tool::loadModel($this->container, $name);
|
return $this->container[$name];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\CommentEvent;
|
||||||
use SimpleValidator\Validator;
|
use SimpleValidator\Validator;
|
||||||
use SimpleValidator\Validators;
|
use SimpleValidator\Validators;
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ class Comment extends Base
|
|||||||
$comment_id = $this->persist(self::TABLE, $values);
|
$comment_id = $this->persist(self::TABLE, $values);
|
||||||
|
|
||||||
if ($comment_id) {
|
if ($comment_id) {
|
||||||
$this->event->trigger(self::EVENT_CREATE, array('id' => $comment_id) + $values);
|
$this->container['dispatcher']->dispatch(self::EVENT_CREATE, new CommentEvent(array('id' => $comment_id) + $values));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $comment_id;
|
return $comment_id;
|
||||||
@@ -127,7 +128,7 @@ class Comment extends Base
|
|||||||
->eq('id', $values['id'])
|
->eq('id', $values['id'])
|
||||||
->update(array('comment' => $values['comment']));
|
->update(array('comment' => $values['comment']));
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_UPDATE, $values);
|
$this->container['dispatcher']->dispatch(self::EVENT_UPDATE, new CommentEvent($values));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\FileEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* File model
|
* File model
|
||||||
*
|
*
|
||||||
@@ -89,7 +91,10 @@ class File extends Base
|
|||||||
*/
|
*/
|
||||||
public function create($task_id, $name, $path, $is_image)
|
public function create($task_id, $name, $path, $is_image)
|
||||||
{
|
{
|
||||||
$this->event->trigger(self::EVENT_CREATE, array('task_id' => $task_id, 'name' => $name));
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_CREATE,
|
||||||
|
new FileEvent(array('task_id' => $task_id, 'name' => $name))
|
||||||
|
);
|
||||||
|
|
||||||
return $this->db->table(self::TABLE)->save(array(
|
return $this->db->table(self::TABLE)->save(array(
|
||||||
'task_id' => $task_id,
|
'task_id' => $task_id,
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Github Webhook model
|
* Github Webhook model
|
||||||
*
|
*
|
||||||
@@ -88,7 +90,10 @@ class GithubWebhook extends Base
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($task['is_active'] == Task::STATUS_OPEN) {
|
if ($task['is_active'] == Task::STATUS_OPEN) {
|
||||||
$this->event->trigger(self::EVENT_COMMIT, array('task_id' => $task_id) + $task);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_COMMIT,
|
||||||
|
new GenericEvent(array('task_id' => $task_id) + $task)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +151,11 @@ class GithubWebhook extends Base
|
|||||||
'task_id' => $task['id'],
|
'task_id' => $task['id'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_COMMENT, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_COMMENT,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +178,11 @@ class GithubWebhook extends Base
|
|||||||
'description' => $issue['body']."\n\n[".t('Github Issue').']('.$issue['html_url'].')',
|
'description' => $issue['body']."\n\n[".t('Github Issue').']('.$issue['html_url'].')',
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_OPENED, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_OPENED,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,7 +204,11 @@ class GithubWebhook extends Base
|
|||||||
'reference' => $issue['number'],
|
'reference' => $issue['number'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_CLOSED, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_CLOSED,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,7 +233,11 @@ class GithubWebhook extends Base
|
|||||||
'reference' => $issue['number'],
|
'reference' => $issue['number'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_REOPENED, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_REOPENED,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -244,7 +265,11 @@ class GithubWebhook extends Base
|
|||||||
'reference' => $issue['number'],
|
'reference' => $issue['number'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_ASSIGNEE_CHANGE, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_ASSIGNEE_CHANGE,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,7 +296,11 @@ class GithubWebhook extends Base
|
|||||||
'reference' => $issue['number'],
|
'reference' => $issue['number'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_ASSIGNEE_CHANGE, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_ASSIGNEE_CHANGE,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,7 +328,11 @@ class GithubWebhook extends Base
|
|||||||
'label' => $label['name'],
|
'label' => $label['name'],
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_LABEL_CHANGE, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_LABEL_CHANGE,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,7 +361,11 @@ class GithubWebhook extends Base
|
|||||||
'category_id' => 0,
|
'category_id' => 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->event->trigger(self::EVENT_ISSUE_LABEL_CHANGE, $event);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_ISSUE_LABEL_CHANGE,
|
||||||
|
new GenericEvent($event)
|
||||||
|
);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -93,37 +93,6 @@ class Notification extends Base
|
|||||||
return $users;
|
return $users;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachEvents()
|
|
||||||
{
|
|
||||||
$events = array(
|
|
||||||
Task::EVENT_CREATE => 'task_creation',
|
|
||||||
Task::EVENT_UPDATE => 'task_update',
|
|
||||||
Task::EVENT_CLOSE => 'task_close',
|
|
||||||
Task::EVENT_OPEN => 'task_open',
|
|
||||||
Task::EVENT_MOVE_COLUMN => 'task_move_column',
|
|
||||||
Task::EVENT_MOVE_POSITION => 'task_move_position',
|
|
||||||
Task::EVENT_ASSIGNEE_CHANGE => 'task_assignee_change',
|
|
||||||
SubTask::EVENT_CREATE => 'subtask_creation',
|
|
||||||
SubTask::EVENT_UPDATE => 'subtask_update',
|
|
||||||
Comment::EVENT_CREATE => 'comment_creation',
|
|
||||||
Comment::EVENT_UPDATE => 'comment_update',
|
|
||||||
File::EVENT_CREATE => 'file_creation',
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($events as $event_name => $template_name) {
|
|
||||||
|
|
||||||
$listener = new NotificationListener($this->container);
|
|
||||||
$listener->setTemplate($template_name);
|
|
||||||
|
|
||||||
$this->event->attach($event_name, $listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send the email notifications
|
* Send the email notifications
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ namespace Model;
|
|||||||
|
|
||||||
use SimpleValidator\Validator;
|
use SimpleValidator\Validator;
|
||||||
use SimpleValidator\Validators;
|
use SimpleValidator\Validators;
|
||||||
use Event\ProjectModificationDateListener;
|
|
||||||
use Core\Security;
|
use Core\Security;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -489,34 +488,4 @@ class Project extends Base
|
|||||||
$v->getErrors()
|
$v->getErrors()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachEvents()
|
|
||||||
{
|
|
||||||
$events = array(
|
|
||||||
Task::EVENT_CREATE_UPDATE,
|
|
||||||
Task::EVENT_CLOSE,
|
|
||||||
Task::EVENT_OPEN,
|
|
||||||
Task::EVENT_MOVE_COLUMN,
|
|
||||||
Task::EVENT_MOVE_POSITION,
|
|
||||||
Task::EVENT_ASSIGNEE_CHANGE,
|
|
||||||
GithubWebhook::EVENT_ISSUE_OPENED,
|
|
||||||
GithubWebhook::EVENT_ISSUE_CLOSED,
|
|
||||||
GithubWebhook::EVENT_ISSUE_REOPENED,
|
|
||||||
GithubWebhook::EVENT_ISSUE_ASSIGNEE_CHANGE,
|
|
||||||
GithubWebhook::EVENT_ISSUE_LABEL_CHANGE,
|
|
||||||
GithubWebhook::EVENT_ISSUE_COMMENT,
|
|
||||||
GithubWebhook::EVENT_COMMIT,
|
|
||||||
);
|
|
||||||
|
|
||||||
$listener = new ProjectModificationDateListener($this->container);
|
|
||||||
|
|
||||||
foreach ($events as $event_name) {
|
|
||||||
$this->event->attach($event_name, $listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
use Core\Template;
|
use Core\Template;
|
||||||
use Event\ProjectActivityListener;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project activity model
|
* Project activity model
|
||||||
@@ -126,34 +125,6 @@ class ProjectActivity extends Base
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events to be able to record the history
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachEvents()
|
|
||||||
{
|
|
||||||
$events = array(
|
|
||||||
Task::EVENT_ASSIGNEE_CHANGE,
|
|
||||||
Task::EVENT_UPDATE,
|
|
||||||
Task::EVENT_CREATE,
|
|
||||||
Task::EVENT_CLOSE,
|
|
||||||
Task::EVENT_OPEN,
|
|
||||||
Task::EVENT_MOVE_COLUMN,
|
|
||||||
Task::EVENT_MOVE_POSITION,
|
|
||||||
Comment::EVENT_UPDATE,
|
|
||||||
Comment::EVENT_CREATE,
|
|
||||||
SubTask::EVENT_UPDATE,
|
|
||||||
SubTask::EVENT_CREATE,
|
|
||||||
);
|
|
||||||
|
|
||||||
$listener = new ProjectActivityListener($this->container);
|
|
||||||
|
|
||||||
foreach ($events as $event_name) {
|
|
||||||
$this->event->attach($event_name, $listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the event html content
|
* Get the event html content
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
use Core\Template;
|
use Core\Template;
|
||||||
use Event\ProjectDailySummaryListener;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project daily summary
|
* Project daily summary
|
||||||
@@ -157,25 +156,4 @@ class ProjectDailySummary extends Base
|
|||||||
|
|
||||||
return $metrics;
|
return $metrics;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events to be able to record the metrics
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachEvents()
|
|
||||||
{
|
|
||||||
$events = array(
|
|
||||||
Task::EVENT_CREATE,
|
|
||||||
Task::EVENT_CLOSE,
|
|
||||||
Task::EVENT_OPEN,
|
|
||||||
Task::EVENT_MOVE_COLUMN,
|
|
||||||
);
|
|
||||||
|
|
||||||
$listener = new ProjectDailySummaryListener($this->container);
|
|
||||||
|
|
||||||
foreach ($events as $event_name) {
|
|
||||||
$this->event->attach($event_name, $listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\SubtaskEvent;
|
||||||
use SimpleValidator\Validator;
|
use SimpleValidator\Validator;
|
||||||
use SimpleValidator\Validators;
|
use SimpleValidator\Validators;
|
||||||
|
|
||||||
@@ -146,7 +147,10 @@ class SubTask extends Base
|
|||||||
$subtask_id = $this->persist(self::TABLE, $values);
|
$subtask_id = $this->persist(self::TABLE, $values);
|
||||||
|
|
||||||
if ($subtask_id) {
|
if ($subtask_id) {
|
||||||
$this->event->trigger(self::EVENT_CREATE, array('id' => $subtask_id) + $values);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_CREATE,
|
||||||
|
new SubtaskEvent(array('id' => $subtask_id) + $values)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $subtask_id;
|
return $subtask_id;
|
||||||
@@ -165,7 +169,10 @@ class SubTask extends Base
|
|||||||
$result = $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values);
|
$result = $this->db->table(self::TABLE)->eq('id', $values['id'])->save($values);
|
||||||
|
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$this->event->trigger(self::EVENT_UPDATE, $values);
|
$this->container['dispatcher']->dispatch(
|
||||||
|
self::EVENT_UPDATE,
|
||||||
|
new SubtaskEvent($values)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class Task extends Base
|
|||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
|
const EVENT_MOVE_PROJECT = 'task.move.project';
|
||||||
const EVENT_MOVE_COLUMN = 'task.move.column';
|
const EVENT_MOVE_COLUMN = 'task.move.column';
|
||||||
const EVENT_MOVE_POSITION = 'task.move.position';
|
const EVENT_MOVE_POSITION = 'task.move.position';
|
||||||
const EVENT_MOVE_SWIMLANE = 'task.move.swimlane';
|
const EVENT_MOVE_SWIMLANE = 'task.move.swimlane';
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Creation
|
* Task Creation
|
||||||
*
|
*
|
||||||
@@ -64,7 +66,7 @@ class TaskCreation extends Base
|
|||||||
private function fireEvents($task_id, array $values)
|
private function fireEvents($task_id, array $values)
|
||||||
{
|
{
|
||||||
$values['task_id'] = $task_id;
|
$values['task_id'] = $task_id;
|
||||||
$this->event->trigger(Task::EVENT_CREATE_UPDATE, $values);
|
$this->container['dispatcher']->dispatch(Task::EVENT_CREATE_UPDATE, new TaskEvent($values));
|
||||||
$this->event->trigger(Task::EVENT_CREATE, $values);
|
$this->container['dispatcher']->dispatch(Task::EVENT_CREATE, new TaskEvent($values));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Duplication
|
* Task Duplication
|
||||||
*
|
*
|
||||||
@@ -84,7 +86,14 @@ class TaskDuplication extends Base
|
|||||||
|
|
||||||
$this->checkDestinationProjectValues($values);
|
$this->checkDestinationProjectValues($values);
|
||||||
|
|
||||||
return $this->db->table(Task::TABLE)->eq('id', $task['id'])->update($values);
|
if ($this->db->table(Task::TABLE)->eq('id', $task['id'])->update($values)) {
|
||||||
|
$this->container['dispatcher']->dispatch(
|
||||||
|
Task::EVENT_MOVE_PROJECT,
|
||||||
|
new TaskEvent(array_merge($task, $values, array('task_id' => $task['id'])))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Modification
|
* Task Modification
|
||||||
*
|
*
|
||||||
@@ -15,17 +17,16 @@ class TaskModification extends Base
|
|||||||
*
|
*
|
||||||
* @access public
|
* @access public
|
||||||
* @param array $values
|
* @param array $values
|
||||||
* @param boolean $fire_events
|
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
public function update(array $values, $fire_events = true)
|
public function update(array $values)
|
||||||
{
|
{
|
||||||
$original_task = $this->taskFinder->getById($values['id']);
|
$original_task = $this->taskFinder->getById($values['id']);
|
||||||
|
|
||||||
$this->prepare($values);
|
$this->prepare($values);
|
||||||
$result = $this->db->table(Task::TABLE)->eq('id', $original_task['id'])->update($values);
|
$result = $this->db->table(Task::TABLE)->eq('id', $original_task['id'])->update($values);
|
||||||
|
|
||||||
if ($result && $fire_events) {
|
if ($result) {
|
||||||
$this->fireEvents($original_task, $values);
|
$this->fireEvents($original_task, $values);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ class TaskModification extends Base
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($events as $event) {
|
foreach ($events as $event) {
|
||||||
$this->event->trigger($event, $event_data);
|
$this->container['dispatcher']->dispatch($event, new TaskEvent($event_data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Position
|
* Task Position
|
||||||
*
|
*
|
||||||
@@ -139,13 +141,13 @@ class TaskPosition extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
if ($task['swimlane_id'] != $new_swimlane_id) {
|
if ($task['swimlane_id'] != $new_swimlane_id) {
|
||||||
$this->event->trigger(Task::EVENT_MOVE_SWIMLANE, $event_data);
|
$this->container['dispatcher']->dispatch(Task::EVENT_MOVE_SWIMLANE, new TaskEvent($event_data));
|
||||||
}
|
}
|
||||||
else if ($task['column_id'] != $new_column_id) {
|
else if ($task['column_id'] != $new_column_id) {
|
||||||
$this->event->trigger(Task::EVENT_MOVE_COLUMN, $event_data);
|
$this->container['dispatcher']->dispatch(Task::EVENT_MOVE_COLUMN, new TaskEvent($event_data));
|
||||||
}
|
}
|
||||||
else if ($task['position'] != $new_position) {
|
else if ($task['position'] != $new_position) {
|
||||||
$this->event->trigger(Task::EVENT_MOVE_POSITION, $event_data);
|
$this->container['dispatcher']->dispatch(Task::EVENT_MOVE_POSITION, new TaskEvent($event_data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task Status
|
* Task Status
|
||||||
*
|
*
|
||||||
@@ -84,9 +86,9 @@ class TaskStatus extends Base
|
|||||||
));
|
));
|
||||||
|
|
||||||
if ($result) {
|
if ($result) {
|
||||||
$this->event->trigger(
|
$this->container['dispatcher']->dispatch(
|
||||||
$event,
|
$event,
|
||||||
array('task_id' => $task_id) + $this->taskFinder->getById($task_id)
|
new TaskEvent(array('task_id' => $task_id) + $this->taskFinder->getById($task_id))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
namespace Model;
|
namespace Model;
|
||||||
|
|
||||||
use Event\WebhookListener;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Webhook model
|
* Webhook model
|
||||||
*
|
*
|
||||||
@@ -33,87 +31,6 @@ class Webhook extends Base
|
|||||||
*/
|
*/
|
||||||
const HTTP_USER_AGENT = 'Kanboard Webhook';
|
const HTTP_USER_AGENT = 'Kanboard Webhook';
|
||||||
|
|
||||||
/**
|
|
||||||
* URL to call for task creation
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $url_task_creation = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URL to call for task modification
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $url_task_modification = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Webook token
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
private $token = '';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachEvents()
|
|
||||||
{
|
|
||||||
$this->url_task_creation = $this->config->get('webhook_url_task_creation');
|
|
||||||
$this->url_task_modification = $this->config->get('webhook_url_task_modification');
|
|
||||||
$this->token = $this->config->get('webhook_token');
|
|
||||||
|
|
||||||
if ($this->url_task_creation) {
|
|
||||||
$this->attachCreateEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($this->url_task_modification) {
|
|
||||||
$this->attachUpdateEvents();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events for task modification
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachUpdateEvents()
|
|
||||||
{
|
|
||||||
$events = array(
|
|
||||||
Task::EVENT_UPDATE,
|
|
||||||
Task::EVENT_CLOSE,
|
|
||||||
Task::EVENT_OPEN,
|
|
||||||
Task::EVENT_MOVE_COLUMN,
|
|
||||||
Task::EVENT_MOVE_POSITION,
|
|
||||||
Task::EVENT_ASSIGNEE_CHANGE,
|
|
||||||
);
|
|
||||||
|
|
||||||
$listener = new WebhookListener($this->container);
|
|
||||||
$listener->setUrl($this->url_task_modification);
|
|
||||||
|
|
||||||
foreach ($events as $event_name) {
|
|
||||||
$this->event->attach($event_name, $listener);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attach events for task creation
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
public function attachCreateEvents()
|
|
||||||
{
|
|
||||||
$listener = new WebhookListener($this->container);
|
|
||||||
$listener->setUrl($this->url_task_creation);
|
|
||||||
|
|
||||||
$this->event->attach(Task::EVENT_CREATE, $listener);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Call the external URL
|
* Call the external URL
|
||||||
*
|
*
|
||||||
@@ -123,6 +40,8 @@ class Webhook extends Base
|
|||||||
*/
|
*/
|
||||||
public function notify($url, array $task)
|
public function notify($url, array $task)
|
||||||
{
|
{
|
||||||
|
$token = $this->config->get('webhook_token');
|
||||||
|
|
||||||
$headers = array(
|
$headers = array(
|
||||||
'Connection: close',
|
'Connection: close',
|
||||||
'User-Agent: '.self::HTTP_USER_AGENT,
|
'User-Agent: '.self::HTTP_USER_AGENT,
|
||||||
@@ -140,10 +59,10 @@ class Webhook extends Base
|
|||||||
));
|
));
|
||||||
|
|
||||||
if (strpos($url, '?') !== false) {
|
if (strpos($url, '?') !== false) {
|
||||||
$url .= '&token='.$this->token;
|
$url .= '&token='.$token;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$url .= '?token='.$this->token;
|
$url .= '?token='.$token;
|
||||||
}
|
}
|
||||||
|
|
||||||
@file_get_contents($url, false, $context);
|
@file_get_contents($url, false, $context);
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ namespace ServiceProvider;
|
|||||||
|
|
||||||
use Pimple\Container;
|
use Pimple\Container;
|
||||||
use Pimple\ServiceProviderInterface;
|
use Pimple\ServiceProviderInterface;
|
||||||
use PicoDb\Database as Dbal;
|
use PicoDb\Database;
|
||||||
|
|
||||||
class Database implements ServiceProviderInterface
|
class DatabaseProvider implements ServiceProviderInterface
|
||||||
{
|
{
|
||||||
public function register(Container $container)
|
public function register(Container $container)
|
||||||
{
|
{
|
||||||
@@ -55,7 +55,7 @@ class Database implements ServiceProviderInterface
|
|||||||
{
|
{
|
||||||
require_once __DIR__.'/../Schema/Sqlite.php';
|
require_once __DIR__.'/../Schema/Sqlite.php';
|
||||||
|
|
||||||
return new Dbal(array(
|
return new Database(array(
|
||||||
'driver' => 'sqlite',
|
'driver' => 'sqlite',
|
||||||
'filename' => DB_FILENAME
|
'filename' => DB_FILENAME
|
||||||
));
|
));
|
||||||
@@ -70,7 +70,7 @@ class Database implements ServiceProviderInterface
|
|||||||
{
|
{
|
||||||
require_once __DIR__.'/../Schema/Mysql.php';
|
require_once __DIR__.'/../Schema/Mysql.php';
|
||||||
|
|
||||||
return new Dbal(array(
|
return new Database(array(
|
||||||
'driver' => 'mysql',
|
'driver' => 'mysql',
|
||||||
'hostname' => DB_HOSTNAME,
|
'hostname' => DB_HOSTNAME,
|
||||||
'username' => DB_USERNAME,
|
'username' => DB_USERNAME,
|
||||||
@@ -89,7 +89,7 @@ class Database implements ServiceProviderInterface
|
|||||||
{
|
{
|
||||||
require_once __DIR__.'/../Schema/Postgres.php';
|
require_once __DIR__.'/../Schema/Postgres.php';
|
||||||
|
|
||||||
return new Dbal(array(
|
return new Database(array(
|
||||||
'driver' => 'postgres',
|
'driver' => 'postgres',
|
||||||
'hostname' => DB_HOSTNAME,
|
'hostname' => DB_HOSTNAME,
|
||||||
'username' => DB_USERNAME,
|
'username' => DB_USERNAME,
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace ServiceProvider;
|
|
||||||
|
|
||||||
use Pimple\Container;
|
|
||||||
use Pimple\ServiceProviderInterface;
|
|
||||||
use Core\Event as EventDispatcher;
|
|
||||||
|
|
||||||
class Event implements ServiceProviderInterface
|
|
||||||
{
|
|
||||||
public function register(Container $container)
|
|
||||||
{
|
|
||||||
$container['event'] = new EventDispatcher;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
28
app/ServiceProvider/EventDispatcherProvider.php
Normal file
28
app/ServiceProvider/EventDispatcherProvider.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ServiceProvider;
|
||||||
|
|
||||||
|
use Pimple\Container;
|
||||||
|
use Pimple\ServiceProviderInterface;
|
||||||
|
use Subscriber\NotificationSubscriber;
|
||||||
|
use Subscriber\ProjectActivitySubscriber;
|
||||||
|
use Subscriber\ProjectDailySummarySubscriber;
|
||||||
|
use Subscriber\ProjectModificationDateSubscriber;
|
||||||
|
use Subscriber\WebhookSubscriber;
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
|
||||||
|
class EventDispatcherProvider implements ServiceProviderInterface
|
||||||
|
{
|
||||||
|
public function register(Container $container)
|
||||||
|
{
|
||||||
|
$container['dispatcher'] = new EventDispatcher;
|
||||||
|
$container['dispatcher']->addSubscriber(new ProjectActivitySubscriber($container));
|
||||||
|
$container['dispatcher']->addSubscriber(new ProjectDailySummarySubscriber($container));
|
||||||
|
$container['dispatcher']->addSubscriber(new ProjectModificationDateSubscriber($container));
|
||||||
|
$container['dispatcher']->addSubscriber(new WebhookSubscriber($container));
|
||||||
|
$container['dispatcher']->addSubscriber(new NotificationSubscriber($container));
|
||||||
|
|
||||||
|
// Automatic actions
|
||||||
|
$container['action']->attachEvents();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,7 @@ use Monolog\Logger;
|
|||||||
use Monolog\Handler\StreamHandler;
|
use Monolog\Handler\StreamHandler;
|
||||||
use Monolog\Handler\SyslogHandler;
|
use Monolog\Handler\SyslogHandler;
|
||||||
|
|
||||||
class Logging implements ServiceProviderInterface
|
class LoggingProvider implements ServiceProviderInterface
|
||||||
{
|
{
|
||||||
public function register(Container $container)
|
public function register(Container $container)
|
||||||
{
|
{
|
||||||
@@ -8,7 +8,7 @@ use Swift_SmtpTransport;
|
|||||||
use Swift_SendmailTransport;
|
use Swift_SendmailTransport;
|
||||||
use Swift_MailTransport;
|
use Swift_MailTransport;
|
||||||
|
|
||||||
class Mailer implements ServiceProviderInterface
|
class MailerProvider implements ServiceProviderInterface
|
||||||
{
|
{
|
||||||
public function register(Container $container)
|
public function register(Container $container)
|
||||||
{
|
{
|
||||||
63
app/ServiceProvider/ModelProvider.php
Normal file
63
app/ServiceProvider/ModelProvider.php
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace ServiceProvider;
|
||||||
|
|
||||||
|
use Model\Config;
|
||||||
|
use Model\Project;
|
||||||
|
use Model\Webhook;
|
||||||
|
use Pimple\Container;
|
||||||
|
use Pimple\ServiceProviderInterface;
|
||||||
|
|
||||||
|
class ModelProvider implements ServiceProviderInterface
|
||||||
|
{
|
||||||
|
private $models = array(
|
||||||
|
'Acl',
|
||||||
|
'Action',
|
||||||
|
'Authentication',
|
||||||
|
'Board',
|
||||||
|
'Category',
|
||||||
|
'Color',
|
||||||
|
'Comment',
|
||||||
|
'Config',
|
||||||
|
'DateParser',
|
||||||
|
'File',
|
||||||
|
'GithubWebhook',
|
||||||
|
'LastLogin',
|
||||||
|
'Notification',
|
||||||
|
'Project',
|
||||||
|
'ProjectActivity',
|
||||||
|
'ProjectAnalytics',
|
||||||
|
'ProjectDailySummary',
|
||||||
|
'ProjectPaginator',
|
||||||
|
'ProjectPermission',
|
||||||
|
'SubTask',
|
||||||
|
'SubtaskPaginator',
|
||||||
|
'Swimlane',
|
||||||
|
'Task',
|
||||||
|
'TaskCreation',
|
||||||
|
'TaskDuplication',
|
||||||
|
'TaskExport',
|
||||||
|
'TaskFinder',
|
||||||
|
'TaskModification',
|
||||||
|
'TaskPaginator',
|
||||||
|
'TaskPermission',
|
||||||
|
'TaskPosition',
|
||||||
|
'TaskStatus',
|
||||||
|
'TaskValidator',
|
||||||
|
'TimeTracking',
|
||||||
|
'User',
|
||||||
|
'Webhook',
|
||||||
|
);
|
||||||
|
|
||||||
|
public function register(Container $container)
|
||||||
|
{
|
||||||
|
foreach ($this->models as $model) {
|
||||||
|
|
||||||
|
$class = '\Model\\'.$model;
|
||||||
|
|
||||||
|
$container[lcfirst($model)] = function ($c) use ($class) {
|
||||||
|
return new $class($c);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
47
app/Subscriber/Base.php
Normal file
47
app/Subscriber/Base.php
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Pimple\Container;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base subscriber class
|
||||||
|
*
|
||||||
|
* @package subscriber
|
||||||
|
* @author Frederic Guillot
|
||||||
|
*/
|
||||||
|
abstract class Base
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Container instance
|
||||||
|
*
|
||||||
|
* @access protected
|
||||||
|
* @var \Pimple\Container
|
||||||
|
*/
|
||||||
|
protected $container;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param \Pimple\Container $container
|
||||||
|
*/
|
||||||
|
public function __construct(Container $container)
|
||||||
|
{
|
||||||
|
$this->container = $container;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load automatically models
|
||||||
|
*
|
||||||
|
* @access public
|
||||||
|
* @param string $name Model name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function __get($name)
|
||||||
|
{
|
||||||
|
return $this->container[$name];
|
||||||
|
}
|
||||||
|
}
|
||||||
81
app/Subscriber/NotificationSubscriber.php
Normal file
81
app/Subscriber/NotificationSubscriber.php
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Model\Comment;
|
||||||
|
use Model\SubTask;
|
||||||
|
use Model\File;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class NotificationSubscriber extends Base implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
private $templates = array(
|
||||||
|
Task::EVENT_CREATE => 'task_creation',
|
||||||
|
Task::EVENT_UPDATE => 'task_update',
|
||||||
|
Task::EVENT_CLOSE => 'task_close',
|
||||||
|
Task::EVENT_OPEN => 'task_open',
|
||||||
|
Task::EVENT_MOVE_COLUMN => 'task_move_column',
|
||||||
|
Task::EVENT_MOVE_POSITION => 'task_move_position',
|
||||||
|
Task::EVENT_ASSIGNEE_CHANGE => 'task_assignee_change',
|
||||||
|
SubTask::EVENT_CREATE => 'subtask_creation',
|
||||||
|
SubTask::EVENT_UPDATE => 'subtask_update',
|
||||||
|
Comment::EVENT_CREATE => 'comment_creation',
|
||||||
|
Comment::EVENT_UPDATE => 'comment_update',
|
||||||
|
File::EVENT_CREATE => 'file_creation',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
Task::EVENT_CREATE => array('execute', 0),
|
||||||
|
Task::EVENT_UPDATE => array('execute', 0),
|
||||||
|
Task::EVENT_CLOSE => array('execute', 0),
|
||||||
|
Task::EVENT_OPEN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_COLUMN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_POSITION => array('execute', 0),
|
||||||
|
Task::EVENT_ASSIGNEE_CHANGE => array('execute', 0),
|
||||||
|
SubTask::EVENT_CREATE => array('execute', 0),
|
||||||
|
SubTask::EVENT_UPDATE => array('execute', 0),
|
||||||
|
Comment::EVENT_CREATE => array('execute', 0),
|
||||||
|
Comment::EVENT_UPDATE => array('execute', 0),
|
||||||
|
File::EVENT_CREATE => array('execute', 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(GenericEvent $event)
|
||||||
|
{
|
||||||
|
$values = $this->getTemplateData($event);
|
||||||
|
$users = $this->notification->getUsersList($values['task']['project_id']);
|
||||||
|
|
||||||
|
if ($users) {
|
||||||
|
$this->notification->sendEmails($this->templates[$event->getName()], $users, $values);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTemplateData(GenericEvent $event)
|
||||||
|
{
|
||||||
|
$values = array();
|
||||||
|
|
||||||
|
switch (get_class($event)) {
|
||||||
|
case 'Event\TaskEvent':
|
||||||
|
$values['task'] = $this->taskFinder->getDetails($event['task_id']);
|
||||||
|
break;
|
||||||
|
case 'Event\SubtaskEvent':
|
||||||
|
$values['subtask'] = $this->subTask->getById($event['id'], true);
|
||||||
|
$values['task'] = $this->taskFinder->getDetails($event['task_id']);
|
||||||
|
break;
|
||||||
|
case 'Event\FileEvent':
|
||||||
|
$values['file'] = $event->getAll();
|
||||||
|
$values['task'] = $this->taskFinder->getDetails($event['task_id']);
|
||||||
|
break;
|
||||||
|
case 'Event\CommentEvent':
|
||||||
|
$values['comment'] = $this->comment->getById($event['id']);
|
||||||
|
$values['task'] = $this->taskFinder->getDetails($values['comment']['task_id']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $values;
|
||||||
|
}
|
||||||
|
}
|
||||||
63
app/Subscriber/ProjectActivitySubscriber.php
Normal file
63
app/Subscriber/ProjectActivitySubscriber.php
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Model\Comment;
|
||||||
|
use Model\SubTask;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class ProjectActivitySubscriber extends Base implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
Task::EVENT_ASSIGNEE_CHANGE => array('execute', 0),
|
||||||
|
Task::EVENT_UPDATE => array('execute', 0),
|
||||||
|
Task::EVENT_CREATE => array('execute', 0),
|
||||||
|
Task::EVENT_CLOSE => array('execute', 0),
|
||||||
|
Task::EVENT_OPEN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_COLUMN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_POSITION => array('execute', 0),
|
||||||
|
Comment::EVENT_UPDATE => array('execute', 0),
|
||||||
|
Comment::EVENT_CREATE => array('execute', 0),
|
||||||
|
SubTask::EVENT_UPDATE => array('execute', 0),
|
||||||
|
SubTask::EVENT_CREATE => array('execute', 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(GenericEvent $event)
|
||||||
|
{
|
||||||
|
// Executed only when someone is logged
|
||||||
|
if ($this->container['acl']->isLogged() && isset($event['task_id'])) {
|
||||||
|
|
||||||
|
$values = $this->getValues($event);
|
||||||
|
|
||||||
|
$this->projectActivity->createEvent(
|
||||||
|
$values['task']['project_id'],
|
||||||
|
$values['task']['id'],
|
||||||
|
$this->acl->getUserId(),
|
||||||
|
$event->getName(),
|
||||||
|
$values
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getValues(GenericEvent $event)
|
||||||
|
{
|
||||||
|
$values = array();
|
||||||
|
$values['task'] = $this->taskFinder->getDetails($event['task_id']);
|
||||||
|
|
||||||
|
switch (get_class($event)) {
|
||||||
|
case 'Event\SubtaskEvent':
|
||||||
|
$values['subtask'] = $this->subTask->getById($event['id'], true);
|
||||||
|
break;
|
||||||
|
case 'Event\CommentEvent':
|
||||||
|
$values['comment'] = $this->comment->getById($event['id']);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $values;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
app/Subscriber/ProjectDailySummarySubscriber.php
Normal file
27
app/Subscriber/ProjectDailySummarySubscriber.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class ProjectDailySummarySubscriber extends Base implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
Task::EVENT_CREATE => array('execute', 0),
|
||||||
|
Task::EVENT_CLOSE => array('execute', 0),
|
||||||
|
Task::EVENT_OPEN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_COLUMN => array('execute', 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(TaskEvent $event)
|
||||||
|
{
|
||||||
|
if (isset($event['project_id'])) {
|
||||||
|
$this->projectDailySummary->updateTotals($event['project_id'], date('Y-m-d'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
38
app/Subscriber/ProjectModificationDateSubscriber.php
Normal file
38
app/Subscriber/ProjectModificationDateSubscriber.php
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Model\GithubWebhook;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class ProjectModificationDateSubscriber extends Base implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
Task::EVENT_CREATE_UPDATE => array('execute', 0),
|
||||||
|
Task::EVENT_CLOSE => array('execute', 0),
|
||||||
|
Task::EVENT_OPEN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_COLUMN => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_POSITION => array('execute', 0),
|
||||||
|
Task::EVENT_MOVE_PROJECT => array('execute', 0),
|
||||||
|
Task::EVENT_ASSIGNEE_CHANGE => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_OPENED => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_CLOSED => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_REOPENED => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_ASSIGNEE_CHANGE => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_LABEL_CHANGE => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_ISSUE_COMMENT => array('execute', 0),
|
||||||
|
GithubWebhook::EVENT_COMMIT => array('execute', 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function execute(GenericEvent $event)
|
||||||
|
{
|
||||||
|
if (isset($event['project_id'])) {
|
||||||
|
$this->project->updateModificationDate($event['project_id']);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
42
app/Subscriber/WebhookSubscriber.php
Normal file
42
app/Subscriber/WebhookSubscriber.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Subscriber;
|
||||||
|
|
||||||
|
use Event\TaskEvent;
|
||||||
|
use Model\Task;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class WebhookSubscriber extends Base implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
Task::EVENT_CREATE => array('onTaskCreation', 0),
|
||||||
|
Task::EVENT_UPDATE => array('onTaskModification', 0),
|
||||||
|
Task::EVENT_CLOSE => array('onTaskModification', 0),
|
||||||
|
Task::EVENT_OPEN => array('onTaskModification', 0),
|
||||||
|
Task::EVENT_MOVE_COLUMN => array('onTaskModification', 0),
|
||||||
|
Task::EVENT_MOVE_POSITION => array('onTaskModification', 0),
|
||||||
|
Task::EVENT_ASSIGNEE_CHANGE => array('onTaskModification', 0),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onTaskCreation(TaskEvent $event)
|
||||||
|
{
|
||||||
|
$this->executeRequest('webhook_url_task_creation');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onTaskModification(TaskEvent $event)
|
||||||
|
{
|
||||||
|
$this->executeRequest('webhook_url_task_modification');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function executeRequest($parameter)
|
||||||
|
{
|
||||||
|
$url = $this->config->get($parameter);
|
||||||
|
|
||||||
|
if (! empty($url)) {
|
||||||
|
$this->webhook->notify($url, $event->getAll());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,11 @@ if (file_exists('config.php')) {
|
|||||||
require __DIR__.'/constants.php';
|
require __DIR__.'/constants.php';
|
||||||
|
|
||||||
$container = new Pimple\Container;
|
$container = new Pimple\Container;
|
||||||
$container->register(new ServiceProvider\Logging);
|
$container->register(new ServiceProvider\LoggingProvider);
|
||||||
$container->register(new ServiceProvider\Database);
|
$container->register(new ServiceProvider\DatabaseProvider);
|
||||||
$container->register(new ServiceProvider\Event);
|
$container->register(new ServiceProvider\ModelProvider);
|
||||||
$container->register(new ServiceProvider\Mailer);
|
$container->register(new ServiceProvider\EventDispatcherProvider);
|
||||||
|
$container->register(new ServiceProvider\MailerProvider);
|
||||||
|
|
||||||
|
$container['config']->setupTranslations();
|
||||||
|
$container['config']->setupTimezone();
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
"lusitanian/oauth": "0.3.5",
|
"lusitanian/oauth": "0.3.5",
|
||||||
"pimple/pimple": "~3.0",
|
"pimple/pimple": "~3.0",
|
||||||
"monolog/monolog": "1.11.0",
|
"monolog/monolog": "1.11.0",
|
||||||
"symfony/console": "@stable"
|
"symfony/console": "@stable",
|
||||||
|
"symfony/event-dispatcher": "~2.6"
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-0": {"": "app/"},
|
"psr-0": {"": "app/"},
|
||||||
@@ -17,5 +18,8 @@
|
|||||||
"app/helpers.php",
|
"app/helpers.php",
|
||||||
"app/functions.php"
|
"app/functions.php"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/stopwatch": "~2.6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
110
composer.lock
generated
110
composer.lock
generated
@@ -4,7 +4,7 @@
|
|||||||
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"hash": "0e4e7b65c1a5eb4ab8bd2fc051c9dc3d",
|
"hash": "eb21652f9ba05c40d2c904bbf9113c69",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "erusev/parsedown",
|
"name": "erusev/parsedown",
|
||||||
@@ -521,9 +521,115 @@
|
|||||||
"description": "Symfony Console Component",
|
"description": "Symfony Console Component",
|
||||||
"homepage": "http://symfony.com",
|
"homepage": "http://symfony.com",
|
||||||
"time": "2014-12-02 20:19:20"
|
"time": "2014-12-02 20:19:20"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/event-dispatcher",
|
||||||
|
"version": "v2.6.1",
|
||||||
|
"target-dir": "Symfony/Component/EventDispatcher",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/EventDispatcher.git",
|
||||||
|
"reference": "720fe9bca893df7ad1b4546649473b5afddf0216"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/720fe9bca893df7ad1b4546649473b5afddf0216",
|
||||||
|
"reference": "720fe9bca893df7ad1b4546649473b5afddf0216",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/config": "~2.0",
|
||||||
|
"symfony/dependency-injection": "~2.6",
|
||||||
|
"symfony/expression-language": "~2.6",
|
||||||
|
"symfony/stopwatch": "~2.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/dependency-injection": "",
|
||||||
|
"symfony/http-kernel": ""
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.6-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\EventDispatcher\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony EventDispatcher Component",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"time": "2014-12-02 20:19:20"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"packages-dev": [
|
||||||
|
{
|
||||||
|
"name": "symfony/stopwatch",
|
||||||
|
"version": "v2.6.1",
|
||||||
|
"target-dir": "Symfony/Component/Stopwatch",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Stopwatch.git",
|
||||||
|
"reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Stopwatch/zipball/261abd360cfb6ac65ea93ffd82073e2011d034fc",
|
||||||
|
"reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.6-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Stopwatch\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Stopwatch Component",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"time": "2014-12-02 20:19:20"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [],
|
|
||||||
"aliases": [],
|
"aliases": [],
|
||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"stability-flags": {
|
"stability-flags": {
|
||||||
|
|||||||
194
jsonrpc.php
194
jsonrpc.php
@@ -2,69 +2,28 @@
|
|||||||
|
|
||||||
require __DIR__.'/app/common.php';
|
require __DIR__.'/app/common.php';
|
||||||
|
|
||||||
$models = array(
|
|
||||||
'Config',
|
|
||||||
'Project',
|
|
||||||
'ProjectPermission',
|
|
||||||
'Task',
|
|
||||||
'TaskCreation',
|
|
||||||
'TaskModification',
|
|
||||||
'TaskFinder',
|
|
||||||
'TaskPosition',
|
|
||||||
'TaskStatus',
|
|
||||||
'TaskValidator',
|
|
||||||
'User',
|
|
||||||
'Category',
|
|
||||||
'Comment',
|
|
||||||
'SubTask',
|
|
||||||
'Board',
|
|
||||||
'Action',
|
|
||||||
'Webhook',
|
|
||||||
'Notification',
|
|
||||||
);
|
|
||||||
|
|
||||||
$events = array(
|
|
||||||
'actionModel',
|
|
||||||
'projectModel',
|
|
||||||
'webhookModel',
|
|
||||||
'notificationModel',
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($models as $model) {
|
|
||||||
$variable = lcfirst($model).'Model';
|
|
||||||
$class = '\Model\\'.$model;
|
|
||||||
$$variable = new $class($container);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($events as $class) {
|
|
||||||
$$class->attachEvents();
|
|
||||||
}
|
|
||||||
|
|
||||||
$configModel->setupTranslations();
|
|
||||||
$configModel->setupTimezone();
|
|
||||||
|
|
||||||
$server = new JsonRPC\Server;
|
$server = new JsonRPC\Server;
|
||||||
$server->authentication(array('jsonrpc' => $configModel->get('api_token')));
|
$server->authentication(array('jsonrpc' => $container['config']->get('api_token')));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project procedures
|
* Project procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getProjectById', $projectModel, 'getById');
|
$server->bind('getProjectById', $container['project'], 'getById');
|
||||||
$server->bind('getProjectByName', $projectModel, 'getByName');
|
$server->bind('getProjectByName', $container['project'], 'getByName');
|
||||||
$server->bind('getAllProjects', $projectModel, 'getAll');
|
$server->bind('getAllProjects', $container['project'], 'getAll');
|
||||||
$server->bind('removeProject', $projectModel, 'remove');
|
$server->bind('removeProject', $container['project'], 'remove');
|
||||||
$server->bind('enableProject', $projectModel, 'enable');
|
$server->bind('enableProject', $container['project'], 'enable');
|
||||||
$server->bind('disableProject', $projectModel, 'disable');
|
$server->bind('disableProject', $container['project'], 'disable');
|
||||||
$server->bind('enableProjectPublicAccess', $projectModel, 'enablePublicAccess');
|
$server->bind('enableProjectPublicAccess', $container['project'], 'enablePublicAccess');
|
||||||
$server->bind('disableProjectPublicAccess', $projectModel, 'disablePublicAccess');
|
$server->bind('disableProjectPublicAccess', $container['project'], 'disablePublicAccess');
|
||||||
|
|
||||||
$server->register('createProject', function($name) use ($projectModel) {
|
$server->register('createProject', function($name) use ($container) {
|
||||||
$values = array('name' => $name);
|
$values = array('name' => $name);
|
||||||
list($valid,) = $projectModel->validateCreation($values);
|
list($valid,) = $container['project']->validateCreation($values);
|
||||||
return $valid ? $projectModel->create($values) : false;
|
return $valid ? $container['project']->create($values) : false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateProject', function($id, $name, $is_active = null, $is_public = null, $token = null) use ($projectModel) {
|
$server->register('updateProject', function($id, $name, $is_active = null, $is_public = null, $token = null) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
@@ -80,40 +39,40 @@ $server->register('updateProject', function($id, $name, $is_active = null, $is_p
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list($valid,) = $projectModel->validateModification($values);
|
list($valid,) = $container['project']->validateModification($values);
|
||||||
return $valid && $projectModel->update($values);
|
return $valid && $container['project']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Board procedures
|
* Board procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getBoard', $boardModel, 'getBoard');
|
$server->bind('getBoard', $container['board'], 'getBoard');
|
||||||
$server->bind('getColumns', $boardModel, 'getColumns');
|
$server->bind('getColumns', $container['board'], 'getColumns');
|
||||||
$server->bind('getColumn', $boardModel, 'getColumn');
|
$server->bind('getColumn', $container['board'], 'getColumn');
|
||||||
$server->bind('moveColumnUp', $boardModel, 'moveUp');
|
$server->bind('moveColumnUp', $container['board'], 'moveUp');
|
||||||
$server->bind('moveColumnDown', $boardModel, 'moveDown');
|
$server->bind('moveColumnDown', $container['board'], 'moveDown');
|
||||||
$server->bind('updateColumn', $boardModel, 'updateColumn');
|
$server->bind('updateColumn', $container['board'], 'updateColumn');
|
||||||
$server->bind('addColumn', $boardModel, 'addColumn');
|
$server->bind('addColumn', $container['board'], 'addColumn');
|
||||||
$server->bind('removeColumn', $boardModel, 'removeColumn');
|
$server->bind('removeColumn', $container['board'], 'removeColumn');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project permissions procedures
|
* Project permissions procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getMembers', $projectPermissionModel, 'getMembers');
|
$server->bind('getMembers', $container['projectPermission'], 'getMembers');
|
||||||
$server->bind('revokeUser', $projectPermissionModel, 'revokeUser');
|
$server->bind('revokeUser', $container['projectPermission'], 'revokeUser');
|
||||||
$server->bind('allowUser', $projectPermissionModel, 'allowUser');
|
$server->bind('allowUser', $container['projectPermission'], 'allowUser');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Task procedures
|
* Task procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getTask', $taskFinderModel, 'getById');
|
$server->bind('getTask', $container['taskFinder'], 'getById');
|
||||||
$server->bind('getAllTasks', $taskFinderModel, 'getAll');
|
$server->bind('getAllTasks', $container['taskFinder'], 'getAll');
|
||||||
$server->bind('openTask', $taskStatusModel, 'open');
|
$server->bind('openTask', $container['taskStatus'], 'open');
|
||||||
$server->bind('closeTask', $taskStatusModel, 'close');
|
$server->bind('closeTask', $container['taskStatus'], 'close');
|
||||||
$server->bind('removeTask', $taskModel, 'remove');
|
$server->bind('removeTask', $container['task'], 'remove');
|
||||||
$server->bind('moveTaskPosition', $taskPositionModel, 'movePosition');
|
$server->bind('moveTaskPosition', $container['taskPosition'], 'movePosition');
|
||||||
|
|
||||||
$server->register('createTask', function($title, $project_id, $color_id = '', $column_id = 0, $owner_id = 0, $creator_id = 0, $date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = 0) use ($taskCreationModel, $taskValidatorModel) {
|
$server->register('createTask', function($title, $project_id, $color_id = '', $column_id = 0, $owner_id = 0, $creator_id = 0, $date_due = '', $description = '', $category_id = 0, $score = 0, $swimlane_id = 0) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
@@ -129,16 +88,16 @@ $server->register('createTask', function($title, $project_id, $color_id = '', $c
|
|||||||
'swimlane_id' => $swimlane_id,
|
'swimlane_id' => $swimlane_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $taskValidatorModel->validateCreation($values);
|
list($valid,) = $container['taskValidator']->validateCreation($values);
|
||||||
|
|
||||||
if (! $valid) {
|
if (! $valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $taskCreationModel->create($values);
|
return $container['taskCreation']->create($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateTask', function($id, $title = null, $project_id = null, $color_id = null, $column_id = null, $owner_id = null, $creator_id = null, $date_due = null, $description = null, $category_id = null, $score = null, $swimlane_id = null) use ($taskModificationModel, $taskValidatorModel) {
|
$server->register('updateTask', function($id, $title = null, $project_id = null, $color_id = null, $column_id = null, $owner_id = null, $creator_id = null, $date_due = null, $description = null, $category_id = null, $score = null, $swimlane_id = null) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
@@ -161,19 +120,19 @@ $server->register('updateTask', function($id, $title = null, $project_id = null,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list($valid) = $taskValidatorModel->validateApiModification($values);
|
list($valid) = $container['taskValidator']->validateApiModification($values);
|
||||||
return $valid && $taskModificationModel->update($values);
|
return $valid && $container['taskModification']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* User procedures
|
* User procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getUser', $userModel, 'getById');
|
$server->bind('getUser', $container['user'], 'getById');
|
||||||
$server->bind('getAllUsers', $userModel, 'getAll');
|
$server->bind('getAllUsers', $container['user'], 'getAll');
|
||||||
$server->bind('removeUser', $userModel, 'remove');
|
$server->bind('removeUser', $container['user'], 'remove');
|
||||||
|
|
||||||
$server->register('createUser', function($username, $password, $name = '', $email = '', $is_admin = 0, $default_project_id = 0) use ($userModel) {
|
$server->register('createUser', function($username, $password, $name = '', $email = '', $is_admin = 0, $default_project_id = 0) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'username' => $username,
|
'username' => $username,
|
||||||
@@ -185,16 +144,16 @@ $server->register('createUser', function($username, $password, $name = '', $emai
|
|||||||
'default_project_id' => $default_project_id,
|
'default_project_id' => $default_project_id,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $userModel->validateCreation($values);
|
list($valid,) = $container['user']->validateCreation($values);
|
||||||
|
|
||||||
if (! $valid) {
|
if (! $valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $userModel->create($values);
|
return $container['user']->create($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateUser', function($id, $username = null, $name = null, $email = null, $is_admin = null, $default_project_id = null) use ($userModel) {
|
$server->register('updateUser', function($id, $username = null, $name = null, $email = null, $is_admin = null, $default_project_id = null) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
@@ -211,52 +170,52 @@ $server->register('updateUser', function($id, $username = null, $name = null, $e
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list($valid,) = $userModel->validateApiModification($values);
|
list($valid,) = $container['user']->validateApiModification($values);
|
||||||
return $valid && $userModel->update($values);
|
return $valid && $container['user']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Category procedures
|
* Category procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getCategory', $categoryModel, 'getById');
|
$server->bind('getCategory', $container['category'], 'getById');
|
||||||
$server->bind('getAllCategories', $categoryModel, 'getAll');
|
$server->bind('getAllCategories', $container['category'], 'getAll');
|
||||||
$server->bind('removeCategory', $categoryModel, 'remove');
|
$server->bind('removeCategory', $container['category'], 'remove');
|
||||||
|
|
||||||
$server->register('createCategory', function($project_id, $name) use ($categoryModel) {
|
$server->register('createCategory', function($project_id, $name) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'project_id' => $project_id,
|
'project_id' => $project_id,
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $categoryModel->validateCreation($values);
|
list($valid,) = $container['category']->validateCreation($values);
|
||||||
|
|
||||||
if (! $valid) {
|
if (! $valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $categoryModel->create($values);
|
return $container['category']->create($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateCategory', function($id, $name) use ($categoryModel) {
|
$server->register('updateCategory', function($id, $name) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $categoryModel->validateModification($values);
|
list($valid,) = $container['category']->validateModification($values);
|
||||||
return $valid && $categoryModel->update($values);
|
return $valid && $container['category']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comments procedures
|
* Comments procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getComment', $commentModel, 'getById');
|
$server->bind('getComment', $container['comment'], 'getById');
|
||||||
$server->bind('getAllComments', $commentModel, 'getAll');
|
$server->bind('getAllComments', $container['comment'], 'getAll');
|
||||||
$server->bind('removeComment', $commentModel, 'remove');
|
$server->bind('removeComment', $container['comment'], 'remove');
|
||||||
|
|
||||||
$server->register('createComment', function($task_id, $user_id, $content) use ($commentModel) {
|
$server->register('createComment', function($task_id, $user_id, $content) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'task_id' => $task_id,
|
'task_id' => $task_id,
|
||||||
@@ -264,34 +223,34 @@ $server->register('createComment', function($task_id, $user_id, $content) use ($
|
|||||||
'comment' => $content,
|
'comment' => $content,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $commentModel->validateCreation($values);
|
list($valid,) = $container['comment']->validateCreation($values);
|
||||||
|
|
||||||
if (! $valid) {
|
if (! $valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $commentModel->create($values);
|
return $container['comment']->create($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateComment', function($id, $content) use ($commentModel) {
|
$server->register('updateComment', function($id, $content) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
'comment' => $content,
|
'comment' => $content,
|
||||||
);
|
);
|
||||||
|
|
||||||
list($valid,) = $commentModel->validateModification($values);
|
list($valid,) = $container['comment']->validateModification($values);
|
||||||
return $valid && $commentModel->update($values);
|
return $valid && $container['comment']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subtask procedures
|
* Subtask procedures
|
||||||
*/
|
*/
|
||||||
$server->bind('getSubtask', $subTaskModel, 'getById');
|
$server->bind('getSubtask', $container['subTask'], 'getById');
|
||||||
$server->bind('getAllSubtasks', $subTaskModel, 'getAll');
|
$server->bind('getAllSubtasks', $container['subTask'], 'getAll');
|
||||||
$server->bind('removeSubtask', $subTaskModel, 'remove');
|
$server->bind('removeSubtask', $container['subTask'], 'remove');
|
||||||
|
|
||||||
$server->register('createSubtask', function($task_id, $title, $user_id = 0, $time_estimated = 0, $time_spent = 0, $status = 0) use ($subTaskModel) {
|
$server->register('createSubtask', function($task_id, $title, $user_id = 0, $time_estimated = 0, $time_spent = 0, $status = 0) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'title' => $title,
|
'title' => $title,
|
||||||
@@ -307,17 +266,16 @@ $server->register('createSubtask', function($task_id, $title, $user_id = 0, $tim
|
|||||||
unset($values[$key]);
|
unset($values[$key]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
list($valid,) = $container['subTask']->validateCreation($values);
|
||||||
list($valid,) = $subTaskModel->validateCreation($values);
|
|
||||||
|
|
||||||
if (! $valid) {
|
if (! $valid) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $subTaskModel->create($values);
|
return $container['subTask']->create($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
$server->register('updateSubtask', function($id, $task_id, $title = null, $user_id = null, $time_estimated = null, $time_spent = null, $status = null) use ($subTaskModel) {
|
$server->register('updateSubtask', function($id, $task_id, $title = null, $user_id = null, $time_estimated = null, $time_spent = null, $status = null) use ($container) {
|
||||||
|
|
||||||
$values = array(
|
$values = array(
|
||||||
'id' => $id,
|
'id' => $id,
|
||||||
@@ -335,15 +293,15 @@ $server->register('updateSubtask', function($id, $task_id, $title = null, $user_
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
list($valid,) = $subTaskModel->validateApiModification($values);
|
list($valid,) = $container['subTask']->validateApiModification($values);
|
||||||
return $valid && $subTaskModel->update($values);
|
return $valid && $container['subTask']->update($values);
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Application procedures
|
* Application procedures
|
||||||
*/
|
*/
|
||||||
$server->register('getTimezone', function() use($configModel) {
|
$server->register('getTimezone', function() use ($container) {
|
||||||
return $configModel->get('application_timezone');
|
return $container['config']->get('application_timezone');
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ class Api extends PHPUnit_Framework_TestCase
|
|||||||
$pdo = new PDO('pgsql:host='.DB_HOSTNAME.';dbname='.DB_NAME, DB_USERNAME, DB_PASSWORD);
|
$pdo = new PDO('pgsql:host='.DB_HOSTNAME.';dbname='.DB_NAME, DB_USERNAME, DB_PASSWORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
$service = new ServiceProvider\Database;
|
$service = new ServiceProvider\DatabaseProvider;
|
||||||
$service->getInstance();
|
$service->getInstance();
|
||||||
|
|
||||||
$pdo->exec("UPDATE settings SET value='".API_KEY."' WHERE option='api_token'");
|
$pdo->exec("UPDATE settings SET value='".API_KEY."' WHERE option='api_token'");
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ use Model\TaskCreation;
|
|||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
use Model\Project;
|
use Model\Project;
|
||||||
use Model\Category;
|
use Model\Category;
|
||||||
|
use Event\GenericEvent;
|
||||||
|
|
||||||
class ActionTaskAssignColorCategory extends Base
|
class ActionTaskAssignColorCategory extends Base
|
||||||
{
|
{
|
||||||
@@ -21,7 +22,7 @@ class ActionTaskAssignColorCategory extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -51,7 +52,7 @@ class ActionTaskAssignColorCategory extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should NOT be executed
|
// Our event should NOT be executed
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the ategory_id=1 and have the green color
|
// Our task should be assigned to the ategory_id=1 and have the green color
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
@@ -69,7 +70,7 @@ class ActionTaskAssignColorCategory extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should be executed
|
// Our event should be executed
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should have the blue color
|
// Our task should have the blue color
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ use Model\Task;
|
|||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
use Model\Project;
|
use Model\Project;
|
||||||
|
use Event\GenericEvent;
|
||||||
|
|
||||||
class ActionTaskAssignColorUser extends Base
|
class ActionTaskAssignColorUser extends Base
|
||||||
{
|
{
|
||||||
@@ -20,7 +21,7 @@ class ActionTaskAssignColorUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -44,7 +45,7 @@ class ActionTaskAssignColorUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should NOT be executed
|
// Our event should NOT be executed
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to nobody and have the green color
|
// Our task should be assigned to nobody and have the green color
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
@@ -60,7 +61,7 @@ class ActionTaskAssignColorUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should be executed
|
// Our event should be executed
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to nobody and have the blue color
|
// Our task should be assigned to nobody and have the blue color
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Model\Task;
|
use Model\Task;
|
||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
@@ -22,7 +23,7 @@ class ActionTaskAssignCurrentUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadColumn()
|
public function testBadColumn()
|
||||||
@@ -36,7 +37,7 @@ class ActionTaskAssignCurrentUser extends Base
|
|||||||
'column_id' => 3,
|
'column_id' => 3,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -65,7 +66,7 @@ class ActionTaskAssignCurrentUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should be executed
|
// Our event should be executed
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the user 5 (from the session)
|
// Our task should be assigned to the user 5 (from the session)
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Model\Task;
|
use Model\Task;
|
||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
@@ -21,7 +22,7 @@ class ActionTaskAssignSpecificUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadColumn()
|
public function testBadColumn()
|
||||||
@@ -35,7 +36,7 @@ class ActionTaskAssignSpecificUser extends Base
|
|||||||
'column_id' => 3,
|
'column_id' => 3,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -59,7 +60,7 @@ class ActionTaskAssignSpecificUser extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should be executed
|
// Our event should be executed
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the user 1
|
// Our task should be assigned to the user 1
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Model\Task;
|
use Model\Task;
|
||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
@@ -45,7 +46,7 @@ class ActionTaskCloseTest extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadProject()
|
public function testBadProject()
|
||||||
@@ -60,7 +61,7 @@ class ActionTaskCloseTest extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadColumn()
|
public function testBadColumn()
|
||||||
@@ -74,7 +75,7 @@ class ActionTaskCloseTest extends Base
|
|||||||
'column_id' => 3,
|
'column_id' => 3,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -97,7 +98,7 @@ class ActionTaskCloseTest extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Our event should be executed
|
// Our event should be executed
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be closed
|
// Our task should be closed
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Model\Task;
|
use Model\Task;
|
||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
@@ -21,7 +22,7 @@ class ActionTaskDuplicateAnotherProject extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadColumn()
|
public function testBadColumn()
|
||||||
@@ -35,7 +36,7 @@ class ActionTaskDuplicateAnotherProject extends Base
|
|||||||
'column_id' => 3,
|
'column_id' => 3,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -60,7 +61,7 @@ class ActionTaskDuplicateAnotherProject extends Base
|
|||||||
// Our event should NOT be executed because we define the same project
|
// Our event should NOT be executed because we define the same project
|
||||||
$action->setParam('column_id', 2);
|
$action->setParam('column_id', 2);
|
||||||
$action->setParam('project_id', 1);
|
$action->setParam('project_id', 1);
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the project 1
|
// Our task should be assigned to the project 1
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
@@ -78,7 +79,7 @@ class ActionTaskDuplicateAnotherProject extends Base
|
|||||||
$action->setParam('column_id', 2);
|
$action->setParam('column_id', 2);
|
||||||
$action->setParam('project_id', 2);
|
$action->setParam('project_id', 2);
|
||||||
$this->assertTrue($action->hasRequiredCondition($event));
|
$this->assertTrue($action->hasRequiredCondition($event));
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the project 1
|
// Our task should be assigned to the project 1
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Event\GenericEvent;
|
||||||
use Model\Task;
|
use Model\Task;
|
||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
@@ -21,7 +22,7 @@ class ActionTaskMoveAnotherProject extends Base
|
|||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->isExecutable($event));
|
$this->assertFalse($action->isExecutable($event));
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testBadColumn()
|
public function testBadColumn()
|
||||||
@@ -35,7 +36,7 @@ class ActionTaskMoveAnotherProject extends Base
|
|||||||
'column_id' => 3,
|
'column_id' => 3,
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testExecute()
|
public function testExecute()
|
||||||
@@ -60,7 +61,7 @@ class ActionTaskMoveAnotherProject extends Base
|
|||||||
// Our event should NOT be executed because we define the same project
|
// Our event should NOT be executed because we define the same project
|
||||||
$action->setParam('column_id', 2);
|
$action->setParam('column_id', 2);
|
||||||
$action->setParam('project_id', 1);
|
$action->setParam('project_id', 1);
|
||||||
$this->assertFalse($action->execute($event));
|
$this->assertFalse($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the project 1
|
// Our task should be assigned to the project 1
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
@@ -77,7 +78,7 @@ class ActionTaskMoveAnotherProject extends Base
|
|||||||
// Our event should be executed because we define a different project
|
// Our event should be executed because we define a different project
|
||||||
$action->setParam('column_id', 2);
|
$action->setParam('column_id', 2);
|
||||||
$action->setParam('project_id', 2);
|
$action->setParam('project_id', 2);
|
||||||
$this->assertTrue($action->execute($event));
|
$this->assertTrue($action->execute(new GenericEvent($event)));
|
||||||
|
|
||||||
// Our task should be assigned to the project 2
|
// Our task should be assigned to the project 2
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
|
|||||||
@@ -10,46 +10,11 @@ use Model\TaskPosition;
|
|||||||
use Model\TaskCreation;
|
use Model\TaskCreation;
|
||||||
use Model\TaskFinder;
|
use Model\TaskFinder;
|
||||||
use Model\Category;
|
use Model\Category;
|
||||||
|
use Model\GithubWebhook;
|
||||||
|
|
||||||
class ActionTest extends Base
|
class ActionTest extends Base
|
||||||
{/*
|
{/*
|
||||||
public function testFetchActions()
|
public function testSingleAction()
|
||||||
{
|
|
||||||
$action = new Action($this->container);
|
|
||||||
$board = new Board($this->container);
|
|
||||||
$project = new Project($this->container);
|
|
||||||
|
|
||||||
$this->assertEquals(1, $project->create(array('name' => 'unit_test')));
|
|
||||||
|
|
||||||
// We should have nothing
|
|
||||||
$this->assertEmpty($action->getAll());
|
|
||||||
$this->assertEmpty($action->getAllByProject(1));
|
|
||||||
|
|
||||||
// We create a new action
|
|
||||||
$this->assertTrue($action->create(array(
|
|
||||||
'project_id' => 1,
|
|
||||||
'event_name' => Task::EVENT_MOVE_COLUMN,
|
|
||||||
'action_name' => 'TaskClose',
|
|
||||||
'params' => array(
|
|
||||||
'column_id' => 4,
|
|
||||||
)
|
|
||||||
)));
|
|
||||||
|
|
||||||
// We should have our action
|
|
||||||
$this->assertNotEmpty($action->getAll());
|
|
||||||
$this->assertEquals($action->getAll(), $action->getAllByProject(1));
|
|
||||||
|
|
||||||
$actions = $action->getAll();
|
|
||||||
|
|
||||||
$this->assertEquals(1, count($actions));
|
|
||||||
$this->assertEquals(1, $actions[0]['project_id']);
|
|
||||||
$this->assertEquals(Task::EVENT_MOVE_COLUMN, $actions[0]['event_name']);
|
|
||||||
$this->assertEquals('TaskClose', $actions[0]['action_name']);
|
|
||||||
$this->assertEquals('column_id', $actions[0]['params'][0]['name']);
|
|
||||||
$this->assertEquals(4, $actions[0]['params'][0]['value']);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testEventMoveColumn()
|
|
||||||
{
|
{
|
||||||
$tp = new TaskPosition($this->container);
|
$tp = new TaskPosition($this->container);
|
||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
@@ -61,15 +26,6 @@ class ActionTest extends Base
|
|||||||
// We create a project
|
// We create a project
|
||||||
$this->assertEquals(1, $project->create(array('name' => 'unit_test')));
|
$this->assertEquals(1, $project->create(array('name' => 'unit_test')));
|
||||||
|
|
||||||
// We create a task
|
|
||||||
$this->assertEquals(1, $tc->create(array(
|
|
||||||
'title' => 'unit_test',
|
|
||||||
'project_id' => 1,
|
|
||||||
'owner_id' => 1,
|
|
||||||
'color_id' => 'red',
|
|
||||||
'column_id' => 1,
|
|
||||||
)));
|
|
||||||
|
|
||||||
// We create a new action
|
// We create a new action
|
||||||
$this->assertTrue($action->create(array(
|
$this->assertTrue($action->create(array(
|
||||||
'project_id' => 1,
|
'project_id' => 1,
|
||||||
@@ -80,7 +36,16 @@ class ActionTest extends Base
|
|||||||
)
|
)
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// We bind events
|
// We create a task
|
||||||
|
$this->assertEquals(1, $tc->create(array(
|
||||||
|
'title' => 'unit_test',
|
||||||
|
'project_id' => 1,
|
||||||
|
'owner_id' => 1,
|
||||||
|
'color_id' => 'red',
|
||||||
|
'column_id' => 1,
|
||||||
|
)));
|
||||||
|
|
||||||
|
// We attach events
|
||||||
$action->attachEvents();
|
$action->attachEvents();
|
||||||
|
|
||||||
// Our task should be open
|
// Our task should be open
|
||||||
@@ -91,87 +56,86 @@ class ActionTest extends Base
|
|||||||
// We move our task
|
// We move our task
|
||||||
$tp->movePosition(1, 1, 4, 1);
|
$tp->movePosition(1, 1, 4, 1);
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_UPDATE));
|
|
||||||
|
|
||||||
// Our task should be closed
|
// Our task should be closed
|
||||||
$t1 = $tf->getById(1);
|
$t1 = $tf->getById(1);
|
||||||
$this->assertEquals(4, $t1['column_id']);
|
$this->assertEquals(4, $t1['column_id']);
|
||||||
$this->assertEquals(0, $t1['is_active']);
|
$this->assertEquals(0, $t1['is_active']);
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
public function testExecuteMultipleActions()
|
public function testMultipleActions()
|
||||||
{
|
{
|
||||||
$tp = new TaskPosition($this->container);
|
$tp = new TaskPosition($this->container);
|
||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
$tf = new TaskFinder($this->container);
|
$tf = new TaskFinder($this->container);
|
||||||
$board = new Board($this->container);
|
$b = new Board($this->container);
|
||||||
$project = new Project($this->container);
|
$p = new Project($this->container);
|
||||||
$action = new Action($this->container);
|
$a = new Action($this->container);
|
||||||
|
$c = new Category($this->container);
|
||||||
|
$g = new GithubWebhook($this->container);
|
||||||
|
|
||||||
// We create 2 projects
|
// We create a project
|
||||||
$this->assertEquals(1, $project->create(array('name' => 'unit_test1')));
|
$this->assertEquals(1, $p->create(array('name' => 'unit_test')));
|
||||||
$this->assertEquals(2, $project->create(array('name' => 'unit_test2')));
|
$this->assertEquals(1, $c->create(array('name' => 'unit_test')));
|
||||||
|
|
||||||
// We create a task
|
// We create a new action
|
||||||
$this->assertEquals(1, $tc->create(array(
|
$this->assertTrue($a->create(array(
|
||||||
'title' => 'unit_test',
|
|
||||||
'project_id' => 1,
|
'project_id' => 1,
|
||||||
'owner_id' => 1,
|
'event_name' => GithubWebhook::EVENT_ISSUE_OPENED,
|
||||||
'color_id' => 'red',
|
'action_name' => 'TaskCreation',
|
||||||
'column_id' => 1,
|
'params' => array()
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// We create 2 actions
|
$this->assertTrue($a->create(array(
|
||||||
$this->assertTrue($action->create(array(
|
|
||||||
'project_id' => 1,
|
'project_id' => 1,
|
||||||
'event_name' => Task::EVENT_CLOSE,
|
'event_name' => GithubWebhook::EVENT_ISSUE_LABEL_CHANGE,
|
||||||
'action_name' => 'TaskDuplicateAnotherProject',
|
'action_name' => 'TaskAssignCategoryLabel',
|
||||||
'params' => array(
|
'params' => array(
|
||||||
'column_id' => 4,
|
'label' => 'bug',
|
||||||
'project_id' => 2,
|
'category_id' => 1,
|
||||||
)
|
)
|
||||||
)));
|
)));
|
||||||
|
|
||||||
$this->assertTrue($action->create(array(
|
$this->assertTrue($a->create(array(
|
||||||
'project_id' => 1,
|
'project_id' => 1,
|
||||||
'event_name' => Task::EVENT_MOVE_COLUMN,
|
'event_name' => Task::EVENT_CREATE_UPDATE,
|
||||||
'action_name' => 'TaskClose',
|
'action_name' => 'TaskAssignColorCategory',
|
||||||
'params' => array(
|
'params' => array(
|
||||||
'column_id' => 4,
|
'color_id' => 'red',
|
||||||
|
'category_id' => 1,
|
||||||
)
|
)
|
||||||
)));
|
)));
|
||||||
|
|
||||||
// We bind events
|
// We attach events
|
||||||
$action->attachEvents();
|
$a->attachEvents();
|
||||||
|
$g->setProjectId(1);
|
||||||
|
|
||||||
// Events should be attached
|
// We create a Github issue
|
||||||
$this->assertTrue($this->container['event']->hasListener(Task::EVENT_CLOSE, 'Action\TaskDuplicateAnotherProject'));
|
$issue = array(
|
||||||
$this->assertTrue($this->container['event']->hasListener(Task::EVENT_MOVE_COLUMN, 'Action\TaskClose'));
|
'number' => 123,
|
||||||
|
'title' => 'Bugs everywhere',
|
||||||
|
'body' => 'There is a bug!',
|
||||||
|
'html_url' => 'http://localhost/',
|
||||||
|
);
|
||||||
|
|
||||||
// Our task should be open, linked to the first project and in the first column
|
$this->assertTrue($g->handleIssueOpened($issue));
|
||||||
$t1 = $tf->getById(1);
|
|
||||||
$this->assertEquals(1, $t1['is_active']);
|
|
||||||
$this->assertEquals(1, $t1['column_id']);
|
|
||||||
$this->assertEquals(1, $t1['project_id']);
|
|
||||||
|
|
||||||
// We move our task
|
$task = $tf->getById(1);
|
||||||
$tp->movePosition(1, 1, 4, 1);
|
$this->assertNotEmpty($task);
|
||||||
|
$this->assertEquals(1, $task['is_active']);
|
||||||
|
$this->assertEquals(0, $task['category_id']);
|
||||||
|
$this->assertEquals('yellow', $task['color_id']);
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
// We assign a label to our issue
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CLOSE));
|
$label = array(
|
||||||
|
'name' => 'bug',
|
||||||
|
);
|
||||||
|
|
||||||
// Our task should be closed
|
$this->assertTrue($g->handleIssueLabeled($issue, $label));
|
||||||
$t1 = $tf->getById(1);
|
|
||||||
$this->assertEquals(4, $t1['column_id']);
|
|
||||||
$this->assertEquals(0, $t1['is_active']);
|
|
||||||
|
|
||||||
// Our task should be duplicated to the 2nd project
|
$task = $tf->getById(1);
|
||||||
$t2 = $tf->getById(2);
|
$this->assertNotEmpty($task);
|
||||||
$this->assertNotEmpty($t2);
|
$this->assertEquals(1, $task['is_active']);
|
||||||
$this->assertNotEquals(4, $t2['column_id']);
|
$this->assertEquals(1, $task['category_id']);
|
||||||
$this->assertEquals(1, $t2['is_active']);
|
$this->assertEquals('red', $task['color_id']);
|
||||||
$this->assertEquals(2, $t2['project_id']);
|
|
||||||
$this->assertEquals('unit_test', $t2['title']);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,10 @@
|
|||||||
require __DIR__.'/../../vendor/autoload.php';
|
require __DIR__.'/../../vendor/autoload.php';
|
||||||
require __DIR__.'/../../app/constants.php';
|
require __DIR__.'/../../app/constants.php';
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
use Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher;
|
||||||
|
use Symfony\Component\Stopwatch\Stopwatch;
|
||||||
|
|
||||||
date_default_timezone_set('UTC');
|
date_default_timezone_set('UTC');
|
||||||
|
|
||||||
abstract class Base extends PHPUnit_Framework_TestCase
|
abstract class Base extends PHPUnit_Framework_TestCase
|
||||||
@@ -23,8 +27,13 @@ abstract class Base extends PHPUnit_Framework_TestCase
|
|||||||
}
|
}
|
||||||
|
|
||||||
$this->container = new Pimple\Container;
|
$this->container = new Pimple\Container;
|
||||||
$this->container->register(new ServiceProvider\Database);
|
$this->container->register(new ServiceProvider\DatabaseProvider);
|
||||||
$this->container->register(new ServiceProvider\Event);
|
$this->container->register(new ServiceProvider\ModelProvider);
|
||||||
|
|
||||||
|
$this->container['dispatcher'] = new TraceableEventDispatcher(
|
||||||
|
new EventDispatcher,
|
||||||
|
new Stopwatch
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function tearDown()
|
public function tearDown()
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
require_once __DIR__.'/Base.php';
|
require_once __DIR__.'/Base.php';
|
||||||
|
|
||||||
|
use Subscriber\ProjectModificationDateSubscriber;
|
||||||
use Model\Project;
|
use Model\Project;
|
||||||
use Model\ProjectPermission;
|
use Model\ProjectPermission;
|
||||||
use Model\User;
|
use Model\User;
|
||||||
@@ -52,7 +53,6 @@ class ProjectTest extends Base
|
|||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
|
|
||||||
$now = time();
|
$now = time();
|
||||||
$p->attachEvents();
|
|
||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
|
$this->assertEquals(1, $p->create(array('name' => 'UnitTest')));
|
||||||
|
|
||||||
@@ -62,9 +62,13 @@ class ProjectTest extends Base
|
|||||||
|
|
||||||
sleep(1);
|
sleep(1);
|
||||||
|
|
||||||
|
$listener = new ProjectModificationDateSubscriber($this->container);
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, array($listener, 'execute'));
|
||||||
|
|
||||||
$this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1)));
|
$this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1)));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertEquals('Event\ProjectModificationDateListener', $this->container['event']->getLastListenerExecuted());
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE_UPDATE.'.Subscriber\ProjectModificationDateSubscriber::execute', $called);
|
||||||
|
|
||||||
$project = $p->getById(1);
|
$project = $p->getById(1);
|
||||||
$this->assertNotEmpty($project);
|
$this->assertNotEmpty($project);
|
||||||
|
|||||||
@@ -11,17 +11,31 @@ use Model\ProjectPermission;
|
|||||||
|
|
||||||
class TaskCreationTest extends Base
|
class TaskCreationTest extends Base
|
||||||
{
|
{
|
||||||
|
public function onCreate($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals('test', $event_data['title']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testNoProjectId()
|
public function testNoProjectId()
|
||||||
{
|
{
|
||||||
$p = new Project($this->container);
|
$p = new Project($this->container);
|
||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
$tf = new TaskFinder($this->container);
|
$tf = new TaskFinder($this->container);
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, function() {});
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE, function() {});
|
||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
||||||
$this->assertEquals(0, $tc->create(array('title' => 'test', 'project_id' => 0)));
|
$this->assertEquals(0, $tc->create(array('title' => 'test', 'project_id' => 0)));
|
||||||
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
$this->assertArrayNotHasKey(Task::EVENT_CREATE_UPDATE.'.closure', $called);
|
||||||
|
$this->assertArrayNotHasKey(Task::EVENT_CREATE.'.closure', $called);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testNoTitle()
|
public function testNoTitle()
|
||||||
@@ -30,11 +44,15 @@ class TaskCreationTest extends Base
|
|||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
$tf = new TaskFinder($this->container);
|
$tf = new TaskFinder($this->container);
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, function() {});
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE, function() {});
|
||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
||||||
$this->assertEquals(0, $tc->create(array('project_id' => 1)));
|
$this->assertEquals(0, $tc->create(array('project_id' => 1)));
|
||||||
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
$this->assertArrayNotHasKey(Task::EVENT_CREATE_UPDATE.'.closure', $called);
|
||||||
|
$this->assertArrayNotHasKey(Task::EVENT_CREATE.'.closure', $called);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testMinimum()
|
public function testMinimum()
|
||||||
@@ -43,11 +61,15 @@ class TaskCreationTest extends Base
|
|||||||
$tc = new TaskCreation($this->container);
|
$tc = new TaskCreation($this->container);
|
||||||
$tf = new TaskFinder($this->container);
|
$tf = new TaskFinder($this->container);
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, function() {});
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE, array($this, 'onCreate'));
|
||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
||||||
$this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test')));
|
$this->assertEquals(1, $tc->create(array('project_id' => 1, 'title' => 'test')));
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
$this->assertArrayHasKey(Task::EVENT_CREATE_UPDATE.'.closure', $called);
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE.'.TaskCreationTest::onCreate', $called);
|
||||||
|
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
$this->assertNotEmpty($task);
|
$this->assertNotEmpty($task);
|
||||||
|
|||||||
@@ -45,10 +45,15 @@ class TaskDuplicationTest extends Base
|
|||||||
$this->assertEquals(2, $task['category_id']);
|
$this->assertEquals(2, $task['category_id']);
|
||||||
$this->assertEquals(4.4, $task['time_spent']);
|
$this->assertEquals(4.4, $task['time_spent']);
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, function() {});
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE, function() {});
|
||||||
|
|
||||||
// We duplicate our task
|
// We duplicate our task
|
||||||
$this->assertEquals(2, $td->duplicate(1));
|
$this->assertEquals(2, $td->duplicate(1));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE_UPDATE.'.closure', $called);
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE.'.closure', $called);
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -82,10 +87,15 @@ class TaskDuplicationTest extends Base
|
|||||||
// We create a task
|
// We create a task
|
||||||
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'owner_id' => 1, 'category_id' => 1)));
|
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'column_id' => 2, 'owner_id' => 1, 'category_id' => 1)));
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, function() {});
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE, function() {});
|
||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE_UPDATE.'.closure', $called);
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_CREATE.'.closure', $called);
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -121,8 +131,6 @@ class TaskDuplicationTest extends Base
|
|||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -156,8 +164,6 @@ class TaskDuplicationTest extends Base
|
|||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -191,8 +197,6 @@ class TaskDuplicationTest extends Base
|
|||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -223,8 +227,6 @@ class TaskDuplicationTest extends Base
|
|||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
$this->assertEquals(2, $td->duplicateToProject(1, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE));
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
|
||||||
|
|
||||||
// Check the values of the duplicated task
|
// Check the values of the duplicated task
|
||||||
$task = $tf->getById(2);
|
$task = $tf->getById(2);
|
||||||
@@ -265,6 +267,16 @@ class TaskDuplicationTest extends Base
|
|||||||
$this->assertEquals(5, $task['column_id']);
|
$this->assertEquals(5, $task['column_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function onMoveProject($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals('test', $event_data['title']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testMoveAnotherProject()
|
public function testMoveAnotherProject()
|
||||||
{
|
{
|
||||||
$td = new TaskDuplication($this->container);
|
$td = new TaskDuplication($this->container);
|
||||||
@@ -281,9 +293,14 @@ class TaskDuplicationTest extends Base
|
|||||||
// We create a task
|
// We create a task
|
||||||
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'owner_id' => 1, 'category_id' => 10, 'position' => 333)));
|
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1, 'owner_id' => 1, 'category_id' => 10, 'position' => 333)));
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_MOVE_PROJECT, array($this, 'onMoveProject'));
|
||||||
|
|
||||||
// We duplicate our task to the 2nd project
|
// We duplicate our task to the 2nd project
|
||||||
$this->assertTrue($td->moveToProject(1, 2));
|
$this->assertTrue($td->moveToProject(1, 2));
|
||||||
|
|
||||||
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_MOVE_PROJECT.'.TaskDuplicationTest::onMoveProject', $called);
|
||||||
|
|
||||||
// Check the values of the moved task
|
// Check the values of the moved task
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
$this->assertNotEmpty($task);
|
$this->assertNotEmpty($task);
|
||||||
|
|||||||
@@ -12,6 +12,36 @@ use Model\ProjectPermission;
|
|||||||
|
|
||||||
class TaskModificationTest extends Base
|
class TaskModificationTest extends Base
|
||||||
{
|
{
|
||||||
|
public function onCreateUpdate($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals('Task #1', $event_data['title']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onUpdate($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals('Task #1', $event_data['title']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onAssigneeChange($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals(1, $event_data['owner_id']);
|
||||||
|
}
|
||||||
|
|
||||||
public function testChangeTitle()
|
public function testChangeTitle()
|
||||||
{
|
{
|
||||||
$p = new Project($this->container);
|
$p = new Project($this->container);
|
||||||
@@ -21,15 +51,15 @@ class TaskModificationTest extends Base
|
|||||||
|
|
||||||
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
$this->assertEquals(1, $p->create(array('name' => 'test')));
|
||||||
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1)));
|
$this->assertEquals(1, $tc->create(array('title' => 'test', 'project_id' => 1)));
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CREATE_UPDATE, array($this, 'onCreateUpdate'));
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_UPDATE, array($this, 'onUpdate'));
|
||||||
|
|
||||||
$this->assertTrue($tm->update(array('id' => 1, 'title' => 'Task #1')));
|
$this->assertTrue($tm->update(array('id' => 1, 'title' => 'Task #1')));
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_UPDATE));
|
$this->assertArrayHasKey(Task::EVENT_CREATE_UPDATE.'.TaskModificationTest::onCreateUpdate', $called);
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_UPDATE.'.TaskModificationTest::onUpdate', $called);
|
||||||
$event_data = $this->container['event']->getEventData(Task::EVENT_UPDATE);
|
|
||||||
$this->assertNotEmpty($event_data);
|
|
||||||
$this->assertEquals(1, $event_data['task_id']);
|
|
||||||
$this->assertEquals('Task #1', $event_data['title']);
|
|
||||||
|
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
$this->assertEquals('Task #1', $task['title']);
|
$this->assertEquals('Task #1', $task['title']);
|
||||||
@@ -48,14 +78,12 @@ class TaskModificationTest extends Base
|
|||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
$this->assertEquals(0, $task['owner_id']);
|
$this->assertEquals(0, $task['owner_id']);
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_ASSIGNEE_CHANGE, array($this, 'onAssigneeChange'));
|
||||||
|
|
||||||
$this->assertTrue($tm->update(array('id' => 1, 'owner_id' => 1)));
|
$this->assertTrue($tm->update(array('id' => 1, 'owner_id' => 1)));
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_ASSIGNEE_CHANGE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey(Task::EVENT_ASSIGNEE_CHANGE.'.TaskModificationTest::onAssigneeChange', $called);
|
||||||
$event_data = $this->container['event']->getEventData(Task::EVENT_ASSIGNEE_CHANGE);
|
|
||||||
$this->assertNotEmpty($event_data);
|
|
||||||
$this->assertEquals(1, $event_data['task_id']);
|
|
||||||
$this->assertEquals(1, $event_data['owner_id']);
|
|
||||||
|
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
$this->assertEquals(1, $task['owner_id']);
|
$this->assertEquals(1, $task['owner_id']);
|
||||||
|
|||||||
@@ -73,8 +73,6 @@ class TaskPositionTest extends Base
|
|||||||
|
|
||||||
// We move the task 3 to the column 3
|
// We move the task 3 to the column 3
|
||||||
$this->assertTrue($tp->movePosition(1, 3, 3, 2));
|
$this->assertTrue($tp->movePosition(1, 3, 3, 2));
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
|
||||||
|
|
||||||
// Check tasks position
|
// Check tasks position
|
||||||
$task = $tf->getById(1);
|
$task = $tf->getById(1);
|
||||||
@@ -470,6 +468,10 @@ class TaskPositionTest extends Base
|
|||||||
$this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1)));
|
$this->assertEquals(1, $tc->create(array('title' => 'Task #1', 'project_id' => 1, 'column_id' => 1)));
|
||||||
$this->assertEquals(2, $tc->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 2)));
|
$this->assertEquals(2, $tc->create(array('title' => 'Task #2', 'project_id' => 1, 'column_id' => 2)));
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_MOVE_COLUMN, array($this, 'onMoveColumn'));
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_MOVE_POSITION, array($this, 'onMovePosition'));
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_MOVE_SWIMLANE, array($this, 'onMoveSwimlane'));
|
||||||
|
|
||||||
// We move the task 1 to the column 2
|
// We move the task 1 to the column 2
|
||||||
$this->assertTrue($tp->movePosition(1, 1, 2, 1));
|
$this->assertTrue($tp->movePosition(1, 1, 2, 1));
|
||||||
|
|
||||||
@@ -483,18 +485,9 @@ class TaskPositionTest extends Base
|
|||||||
$this->assertEquals(2, $task['column_id']);
|
$this->assertEquals(2, $task['column_id']);
|
||||||
$this->assertEquals(2, $task['position']);
|
$this->assertEquals(2, $task['position']);
|
||||||
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_SWIMLANE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
$this->assertArrayHasKey(Task::EVENT_MOVE_COLUMN.'.TaskPositionTest::onMoveColumn', $called);
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
$this->assertEquals(1, count($called));
|
||||||
|
|
||||||
$event_data = $this->container['event']->getEventData(Task::EVENT_MOVE_COLUMN);
|
|
||||||
$this->assertNotEmpty($event_data);
|
|
||||||
$this->assertEquals(1, $event_data['task_id']);
|
|
||||||
$this->assertEquals(1, $event_data['position']);
|
|
||||||
$this->assertEquals(2, $event_data['column_id']);
|
|
||||||
$this->assertEquals(1, $event_data['project_id']);
|
|
||||||
|
|
||||||
$this->container['event']->clearTriggeredEvents();
|
|
||||||
|
|
||||||
// We move the task 1 to the position 2
|
// We move the task 1 to the position 2
|
||||||
$this->assertTrue($tp->movePosition(1, 1, 2, 2));
|
$this->assertTrue($tp->movePosition(1, 1, 2, 2));
|
||||||
@@ -509,18 +502,9 @@ class TaskPositionTest extends Base
|
|||||||
$this->assertEquals(2, $task['column_id']);
|
$this->assertEquals(2, $task['column_id']);
|
||||||
$this->assertEquals(1, $task['position']);
|
$this->assertEquals(1, $task['position']);
|
||||||
|
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_SWIMLANE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_COLUMN));
|
$this->assertArrayHasKey(Task::EVENT_MOVE_POSITION.'.TaskPositionTest::onMovePosition', $called);
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
$this->assertEquals(2, count($called));
|
||||||
|
|
||||||
$event_data = $this->container['event']->getEventData(Task::EVENT_MOVE_POSITION);
|
|
||||||
$this->assertNotEmpty($event_data);
|
|
||||||
$this->assertEquals(1, $event_data['task_id']);
|
|
||||||
$this->assertEquals(2, $event_data['position']);
|
|
||||||
$this->assertEquals(2, $event_data['column_id']);
|
|
||||||
$this->assertEquals(1, $event_data['project_id']);
|
|
||||||
|
|
||||||
$this->container['event']->clearTriggeredEvents();
|
|
||||||
|
|
||||||
// Move to another swimlane
|
// Move to another swimlane
|
||||||
$this->assertTrue($tp->movePosition(1, 1, 3, 1, 1));
|
$this->assertTrue($tp->movePosition(1, 1, 3, 1, 1));
|
||||||
@@ -537,11 +521,40 @@ class TaskPositionTest extends Base
|
|||||||
$this->assertEquals(1, $task['position']);
|
$this->assertEquals(1, $task['position']);
|
||||||
$this->assertEquals(0, $task['swimlane_id']);
|
$this->assertEquals(0, $task['swimlane_id']);
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_MOVE_SWIMLANE));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
$this->assertArrayHasKey(Task::EVENT_MOVE_SWIMLANE.'.TaskPositionTest::onMoveSwimlane', $called);
|
||||||
$this->assertFalse($this->container['event']->isEventTriggered(Task::EVENT_MOVE_POSITION));
|
$this->assertEquals(3, count($called));
|
||||||
|
}
|
||||||
|
|
||||||
$event_data = $this->container['event']->getEventData(Task::EVENT_MOVE_SWIMLANE);
|
public function onMoveColumn($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals(1, $event_data['position']);
|
||||||
|
$this->assertEquals(2, $event_data['column_id']);
|
||||||
|
$this->assertEquals(1, $event_data['project_id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onMovePosition($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
|
$this->assertNotEmpty($event_data);
|
||||||
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
|
$this->assertEquals(2, $event_data['position']);
|
||||||
|
$this->assertEquals(2, $event_data['column_id']);
|
||||||
|
$this->assertEquals(1, $event_data['project_id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onMoveSwimlane($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
|
||||||
|
$event_data = $event->getAll();
|
||||||
$this->assertNotEmpty($event_data);
|
$this->assertNotEmpty($event_data);
|
||||||
$this->assertEquals(1, $event_data['task_id']);
|
$this->assertEquals(1, $event_data['task_id']);
|
||||||
$this->assertEquals(1, $event_data['position']);
|
$this->assertEquals(1, $event_data['position']);
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ class TaskStatusTest extends Base
|
|||||||
|
|
||||||
// We close the task
|
// We close the task
|
||||||
|
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_CLOSE, array($this, 'onTaskClose'));
|
||||||
|
$this->container['dispatcher']->addListener(Task::EVENT_OPEN, array($this, 'onTaskOpen'));
|
||||||
|
|
||||||
$this->assertTrue($ts->close(1));
|
$this->assertTrue($ts->close(1));
|
||||||
$this->assertTrue($ts->isClosed(1));
|
$this->assertTrue($ts->isClosed(1));
|
||||||
|
|
||||||
@@ -42,8 +45,6 @@ class TaskStatusTest extends Base
|
|||||||
$this->assertEquals(time(), $task['date_completed']);
|
$this->assertEquals(time(), $task['date_completed']);
|
||||||
$this->assertEquals(time(), $task['date_modification']);
|
$this->assertEquals(time(), $task['date_modification']);
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CLOSE));
|
|
||||||
|
|
||||||
// We open the task again
|
// We open the task again
|
||||||
|
|
||||||
$this->assertTrue($ts->open(1));
|
$this->assertTrue($ts->open(1));
|
||||||
@@ -55,6 +56,22 @@ class TaskStatusTest extends Base
|
|||||||
$this->assertEquals(0, $task['date_completed']);
|
$this->assertEquals(0, $task['date_completed']);
|
||||||
$this->assertEquals(time(), $task['date_modification']);
|
$this->assertEquals(time(), $task['date_modification']);
|
||||||
|
|
||||||
$this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_OPEN));
|
$called = $this->container['dispatcher']->getCalledListeners();
|
||||||
|
$this->assertArrayHasKey('task.close.TaskStatusTest::onTaskClose', $called);
|
||||||
|
$this->assertArrayHasKey('task.open.TaskStatusTest::onTaskOpen', $called);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onTaskOpen($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
$this->assertArrayHasKey('task_id', $event);
|
||||||
|
$this->assertNotEmpty($event['task_id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onTaskClose($event)
|
||||||
|
{
|
||||||
|
$this->assertInstanceOf('Event\TaskEvent', $event);
|
||||||
|
$this->assertArrayHasKey('task_id', $event);
|
||||||
|
$this->assertNotEmpty($event['task_id']);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user