diff options
-rw-r--r-- | app/Action/Base.php | 1 | ||||
-rw-r--r-- | app/Action/TaskClose.php | 2 | ||||
-rw-r--r-- | app/Action/TaskOpen.php | 2 | ||||
-rw-r--r-- | app/Controller/Base.php | 1 | ||||
-rw-r--r-- | app/Controller/Task.php | 4 | ||||
-rw-r--r-- | app/Model/Task.php | 56 | ||||
-rw-r--r-- | app/Model/TaskStatus.php | 112 | ||||
-rw-r--r-- | jsonrpc.php | 10 | ||||
-rw-r--r-- | tests/units/TaskStatusTest.php | 61 | ||||
-rw-r--r-- | tests/units/TaskTest.php | 6 |
10 files changed, 189 insertions, 66 deletions
diff --git a/app/Action/Base.php b/app/Action/Base.php index a438ce04..c9363617 100644 --- a/app/Action/Base.php +++ b/app/Action/Base.php @@ -16,6 +16,7 @@ use Core\Tool; * @property \Model\Comment $comment * @property \Model\Task $task * @property \Model\TaskFinder $taskFinder + * @property \Model\TaskStatus $taskStatus */ abstract class Base implements Listener { diff --git a/app/Action/TaskClose.php b/app/Action/TaskClose.php index f71d4b0e..6cf9be05 100644 --- a/app/Action/TaskClose.php +++ b/app/Action/TaskClose.php @@ -71,7 +71,7 @@ class TaskClose extends Base */ public function doAction(array $data) { - return $this->task->close($data['task_id']); + return $this->taskStatus->close($data['task_id']); } /** diff --git a/app/Action/TaskOpen.php b/app/Action/TaskOpen.php index 6847856c..fc29e9eb 100644 --- a/app/Action/TaskOpen.php +++ b/app/Action/TaskOpen.php @@ -56,7 +56,7 @@ class TaskOpen extends Base */ public function doAction(array $data) { - return $this->task->open($data['task_id']); + return $this->taskStatus->open($data['task_id']); } /** diff --git a/app/Controller/Base.php b/app/Controller/Base.php index bd7bd2ee..5e208009 100644 --- a/app/Controller/Base.php +++ b/app/Controller/Base.php @@ -37,6 +37,7 @@ use Model\LastLogin; * @property \Model\TaskExport $taskExport * @property \Model\TaskFinder $taskFinder * @property \Model\TaskPermission $taskPermission + * @property \Model\TaskStatus $taskStatus * @property \Model\TaskValidator $taskValidator * @property \Model\CommentHistory $commentHistory * @property \Model\SubtaskHistory $subtaskHistory diff --git a/app/Controller/Task.php b/app/Controller/Task.php index d1be8e1e..cad2f583 100644 --- a/app/Controller/Task.php +++ b/app/Controller/Task.php @@ -268,7 +268,7 @@ class Task extends Base $this->checkCSRFParam(); - if ($this->task->close($task['id'])) { + if ($this->taskStatus->close($task['id'])) { $this->session->flash(t('Task closed successfully.')); } else { $this->session->flashError(t('Unable to close this task.')); @@ -295,7 +295,7 @@ class Task extends Base $this->checkCSRFParam(); - if ($this->task->open($task['id'])) { + if ($this->taskStatus->open($task['id'])) { $this->session->flash(t('Task opened successfully.')); } else { $this->session->flashError(t('Unable to open this task.')); diff --git a/app/Model/Task.php b/app/Model/Task.php index 25a4f000..1b2a66cd 100644 --- a/app/Model/Task.php +++ b/app/Model/Task.php @@ -182,62 +182,6 @@ class Task extends Base } /** - * Mark a task closed - * - * @access public - * @param integer $task_id Task id - * @return boolean - */ - public function close($task_id) - { - if (! $this->taskFinder->exists($task_id)) { - return false; - } - - $result = $this->db - ->table(self::TABLE) - ->eq('id', $task_id) - ->update(array( - 'is_active' => 0, - 'date_completed' => time() - )); - - if ($result) { - $this->event->trigger(self::EVENT_CLOSE, array('task_id' => $task_id) + $this->taskFinder->getById($task_id)); - } - - return $result; - } - - /** - * Mark a task open - * - * @access public - * @param integer $task_id Task id - * @return boolean - */ - public function open($task_id) - { - if (! $this->taskFinder->exists($task_id)) { - return false; - } - - $result = $this->db - ->table(self::TABLE) - ->eq('id', $task_id) - ->update(array( - 'is_active' => 1, - 'date_completed' => 0 - )); - - if ($result) { - $this->event->trigger(self::EVENT_OPEN, array('task_id' => $task_id) + $this->taskFinder->getById($task_id)); - } - - return $result; - } - - /** * Remove a task * * @access public diff --git a/app/Model/TaskStatus.php b/app/Model/TaskStatus.php new file mode 100644 index 00000000..99faffde --- /dev/null +++ b/app/Model/TaskStatus.php @@ -0,0 +1,112 @@ +<?php + +namespace Model; + +/** + * Task Status + * + * @package model + * @author Frederic Guillot + */ +class TaskStatus extends Base +{ + /** + * Return true if the task is closed + * + * @access public + * @param integer $task_id Task id + * @return boolean + */ + public function isClosed($task_id) + { + return $this->checkStatus($task_id, Task::STATUS_CLOSED); + } + + /** + * Return true if the task is open + * + * @access public + * @param integer $task_id Task id + * @return boolean + */ + public function isOpen($task_id) + { + return $this->checkStatus($task_id, Task::STATUS_OPEN); + } + + /** + * Mark a task closed + * + * @access public + * @param integer $task_id Task id + * @return boolean + */ + public function close($task_id) + { + return $this->changeStatus($task_id, Task::STATUS_CLOSED, time(), Task::EVENT_CLOSE); + } + + /** + * Mark a task open + * + * @access public + * @param integer $task_id Task id + * @return boolean + */ + public function open($task_id) + { + return $this->changeStatus($task_id, Task::STATUS_OPEN, 0, Task::EVENT_OPEN); + } + + /** + * Common method to change the status of task + * + * @access private + * @param integer $task_id Task id + * @param integer $status Task status + * @param integer $date_completed Timestamp + * @param string $event Event name + * @return boolean + */ + private function changeStatus($task_id, $status, $date_completed, $event) + { + if (! $this->taskFinder->exists($task_id)) { + return false; + } + + $result = $this->db + ->table(Task::TABLE) + ->eq('id', $task_id) + ->update(array( + 'is_active' => $status, + 'date_completed' => $date_completed, + 'date_modification' => time(), + )); + + if ($result) { + $this->event->trigger( + $event, + array('task_id' => $task_id) + $this->taskFinder->getById($task_id) + ); + } + + return $result; + } + + /** + * Check the status of task + * + * @access private + * @param integer $task_id Task id + * @param integer $status Task status + * @return boolean + */ + private function checkStatus($task_id, $status) + { + return $this->db + ->table(Task::TABLE) + ->eq('id', $task_id) + ->eq('is_active', $status) + ->count() === 1; + } +} diff --git a/jsonrpc.php b/jsonrpc.php index d1ef7e6e..62537ff6 100644 --- a/jsonrpc.php +++ b/jsonrpc.php @@ -7,6 +7,7 @@ use Model\Project; use Model\ProjectPermission; use Model\Task; use Model\TaskFinder; +use Model\TaskStatus; use Model\TaskValidator; use Model\User; use Model\Config; @@ -26,6 +27,7 @@ $project = new Project($container); $projectPermission = new ProjectPermission($container); $task = new Task($container); $taskFinder = new TaskFinder($container); +$taskStatus = new TaskStatus($container); $taskValidator = new TaskValidator($container); $user = new User($container); $category = new Category($container); @@ -214,12 +216,12 @@ $server->register('updateTask', function($id, $title = null, $project_id = null, return $valid && $task->update($values); }); -$server->register('openTask', function($task_id) use ($task) { - return $task->open($task_id); +$server->register('openTask', function($task_id) use ($taskStatus) { + return $taskStatus->open($task_id); }); -$server->register('closeTask', function($task_id) use ($task) { - return $task->close($task_id); +$server->register('closeTask', function($task_id) use ($taskStatus) { + return $taskStatus->close($task_id); }); $server->register('removeTask', function($task_id) use ($task) { diff --git a/tests/units/TaskStatusTest.php b/tests/units/TaskStatusTest.php new file mode 100644 index 00000000..9b17ccd7 --- /dev/null +++ b/tests/units/TaskStatusTest.php @@ -0,0 +1,61 @@ +<?php + +require_once __DIR__.'/Base.php'; + +use Model\Task; +use Model\TaskFinder; +use Model\TaskStatus; +use Model\Project; +use Model\ProjectPermission; + +class TaskStatusTest extends Base +{ + public function testStatus() + { + $t = new Task($this->container); + $tf = new TaskFinder($this->container); + $ts = new TaskStatus($this->container); + $p = new Project($this->container); + + $this->assertEquals(1, $p->create(array('name' => 'test'))); + $this->assertEquals(1, $t->create(array('title' => 'test', 'project_id' => 1))); + + // The task must be open + + $this->assertTrue($ts->isOpen(1)); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals(Task::STATUS_OPEN, $task['is_active']); + $this->assertEquals(0, $task['date_completed']); + $this->assertEquals(time(), $task['date_modification']); + + // We close the task + + $ts->close(1); + + $this->assertTrue($ts->isClosed(1)); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals(Task::STATUS_CLOSED, $task['is_active']); + $this->assertEquals(time(), $task['date_completed']); + $this->assertEquals(time(), $task['date_modification']); + + $this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CLOSE)); + + // We open the task again + + $ts->open(1); + + $this->assertTrue($ts->isOpen(1)); + + $task = $tf->getById(1); + $this->assertNotEmpty($task); + $this->assertEquals(Task::STATUS_OPEN, $task['is_active']); + $this->assertEquals(0, $task['date_completed']); + $this->assertEquals(time(), $task['date_modification']); + + $this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_OPEN)); + } +} diff --git a/tests/units/TaskTest.php b/tests/units/TaskTest.php index 06dfd5f1..2e478b42 100644 --- a/tests/units/TaskTest.php +++ b/tests/units/TaskTest.php @@ -4,6 +4,7 @@ require_once __DIR__.'/Base.php'; use Model\Task; use Model\TaskFinder; +use Model\TaskStatus; use Model\Project; use Model\ProjectPermission; use Model\Category; @@ -605,6 +606,7 @@ class TaskTest extends Base public function testEvents() { $t = new Task($this->container); + $ts = new TaskStatus($this->container); $p = new Project($this->container); // We create a project @@ -620,11 +622,11 @@ class TaskTest extends Base $this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CREATE_UPDATE)); // We close our task - $this->assertTrue($t->close(1)); + $this->assertTrue($ts->close(1)); $this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_CLOSE)); // We open our task - $this->assertTrue($t->open(1)); + $this->assertTrue($ts->open(1)); $this->assertTrue($this->container['event']->isEventTriggered(Task::EVENT_OPEN)); // We change the column of our task |