diff options
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | app/Api/Procedure/BaseProcedure.php | 45 | ||||
-rw-r--r-- | app/Api/Procedure/MeProcedure.php | 2 | ||||
-rw-r--r-- | app/Api/Procedure/ProjectProcedure.php | 15 | ||||
-rw-r--r-- | app/Api/Procedure/TaskProcedure.php | 9 | ||||
-rw-r--r-- | app/Core/Base.php | 4 | ||||
-rw-r--r-- | app/Formatter/ProjectApiApiFormatter.php | 39 | ||||
-rw-r--r-- | app/Formatter/ProjectsApiFormatter.php | 38 | ||||
-rw-r--r-- | app/Formatter/TaskApiFormatter.php | 37 | ||||
-rw-r--r-- | app/Formatter/TasksApiFormatter.php | 38 | ||||
-rw-r--r-- | app/Formatter/UserMentionFormatter.php | 4 | ||||
-rw-r--r-- | app/ServiceProvider/FormatterProvider.php | 4 | ||||
-rw-r--r-- | tests/integration/ProjectProcedureTest.php | 5 | ||||
-rw-r--r-- | tests/integration/TaskProcedureTest.php | 2 |
14 files changed, 186 insertions, 57 deletions
@@ -7,6 +7,7 @@ Improvements: * Add the possibility to pass API token as environment variable for Docker container * Add wildcard search for task reference field * Improve automated action TaskAssignColorOnDueDate to update task only when necessary +* Add task and project API formatters Bug fixes: diff --git a/app/Api/Procedure/BaseProcedure.php b/app/Api/Procedure/BaseProcedure.php index e31b3027..16ef5e05 100644 --- a/app/Api/Procedure/BaseProcedure.php +++ b/app/Api/Procedure/BaseProcedure.php @@ -21,51 +21,6 @@ abstract class BaseProcedure extends Base UserAuthorization::getInstance($this->container)->check($this->getClassName(), $procedure); } - protected function formatTask($task) - { - if (! empty($task)) { - $task['url'] = $this->helper->url->to('TaskViewController', 'show', array('task_id' => $task['id'], 'project_id' => $task['project_id']), '', true); - $task['color'] = $this->colorModel->getColorProperties($task['color_id']); - } - - return $task; - } - - protected function formatTasks($tasks) - { - if (! empty($tasks)) { - foreach ($tasks as &$task) { - $task = $this->formatTask($task); - } - } - - return $tasks; - } - - protected function formatProject($project) - { - if (! empty($project)) { - $project['url'] = array( - 'board' => $this->helper->url->to('BoardViewController', 'show', array('project_id' => $project['id']), '', true), - 'calendar' => $this->helper->url->to('CalendarController', 'show', array('project_id' => $project['id']), '', true), - 'list' => $this->helper->url->to('TaskListController', 'show', array('project_id' => $project['id']), '', true), - ); - } - - return $project; - } - - protected function formatProjects($projects) - { - if (! empty($projects)) { - foreach ($projects as &$project) { - $project = $this->formatProject($project); - } - } - - return $projects; - } - protected function filterValues(array $values) { foreach ($values as $key => $value) { diff --git a/app/Api/Procedure/MeProcedure.php b/app/Api/Procedure/MeProcedure.php index 3ba73fdd..5a64cdb3 100644 --- a/app/Api/Procedure/MeProcedure.php +++ b/app/Api/Procedure/MeProcedure.php @@ -62,6 +62,6 @@ class MeProcedure extends BaseProcedure $project_ids = $this->projectPermissionModel->getActiveProjectIds($this->userSession->getId()); $projects = $this->projectModel->getAllByIds($project_ids); - return $this->formatProjects($projects); + return $this->projectsApiFormatter->withProjects($projects)->format(); } } diff --git a/app/Api/Procedure/ProjectProcedure.php b/app/Api/Procedure/ProjectProcedure.php index e8a34cd3..c9ac0ae6 100644 --- a/app/Api/Procedure/ProjectProcedure.php +++ b/app/Api/Procedure/ProjectProcedure.php @@ -15,33 +15,34 @@ class ProjectProcedure extends BaseProcedure public function getProjectById($project_id) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getProjectById', $project_id); - return $this->formatProject($this->projectModel->getById($project_id)); + $project = $this->projectModel->getById($project_id); + return $this->projectApiFormatter->withProject($project)->format(); } public function getProjectByName($name) { $project = $this->projectModel->getByName($name); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getProjectByName', $project['id']); - return $this->formatProject($project); + return $this->projectApiFormatter->withProject($project)->format(); } public function getProjectByIdentifier($identifier) { - $project = $this->formatProject($this->projectModel->getByIdentifier($identifier)); + $project = $this->projectModel->getByIdentifier($identifier); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getProjectByIdentifier', $project['id']); - return $this->formatProject($project); + return $this->projectApiFormatter->withProject($project)->format(); } public function getProjectByEmail($email) { - $project = $this->formatProject($this->projectModel->getByEmail($email)); + $project = $this->projectModel->getByEmail($email); ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getProjectByEmail', $project['id']); - return $this->formatProject($project); + return $this->projectApiFormatter->withProject($project)->format(); } public function getAllProjects() { - return $this->formatProjects($this->projectModel->getAll()); + return $this->projectsApiFormatter->withProjects($this->projectModel->getAll())->format(); } public function removeProject($project_id) diff --git a/app/Api/Procedure/TaskProcedure.php b/app/Api/Procedure/TaskProcedure.php index 847d336f..b1ea0516 100644 --- a/app/Api/Procedure/TaskProcedure.php +++ b/app/Api/Procedure/TaskProcedure.php @@ -24,19 +24,22 @@ class TaskProcedure extends BaseProcedure public function getTask($task_id) { TaskAuthorization::getInstance($this->container)->check($this->getClassName(), 'getTask', $task_id); - return $this->formatTask($this->taskFinderModel->getById($task_id)); + $task = $this->taskFinderModel->getById($task_id); + return $this->taskApiFormatter->withTask($task)->format(); } public function getTaskByReference($project_id, $reference) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getTaskByReference', $project_id); - return $this->formatTask($this->taskFinderModel->getByReference($project_id, $reference)); + $task = $this->taskFinderModel->getByReference($project_id, $reference); + return $this->taskApiFormatter->withTask($task)->format(); } public function getAllTasks($project_id, $status_id = TaskModel::STATUS_OPEN) { ProjectAuthorization::getInstance($this->container)->check($this->getClassName(), 'getAllTasks', $project_id); - return $this->formatTasks($this->taskFinderModel->getAll($project_id, $status_id)); + $tasks = $this->taskFinderModel->getAll($project_id, $status_id); + return $this->tasksApiFormatter->withTasks($tasks)->format(); } public function getOverdueTasks() diff --git a/app/Core/Base.php b/app/Core/Base.php index c11faee2..bf89c00f 100644 --- a/app/Core/Base.php +++ b/app/Core/Base.php @@ -68,8 +68,12 @@ use Pimple\Container; * @property \Kanboard\Formatter\BoardTaskFormatter $boardTaskFormatter * @property \Kanboard\Formatter\GroupAutoCompleteFormatter $groupAutoCompleteFormatter * @property \Kanboard\Formatter\ProjectActivityEventFormatter $projectActivityEventFormatter + * @property \Kanboard\Formatter\ProjectApiFormatter $projectApiFormatter + * @property \Kanboard\Formatter\ProjectsApiFormatter $projectsApiFormatter * @property \Kanboard\Formatter\SubtaskListFormatter $subtaskListFormatter * @property \Kanboard\Formatter\SubtaskTimeTrackingCalendarFormatter $subtaskTimeTrackingCalendarFormatter + * @property \Kanboard\Formatter\TaskApiFormatter $taskApiFormatter + * @property \Kanboard\Formatter\TasksApiFormatter $tasksApiFormatter * @property \Kanboard\Formatter\TaskAutoCompleteFormatter $taskAutoCompleteFormatter * @property \Kanboard\Formatter\TaskICalFormatter $taskICalFormatter * @property \Kanboard\Formatter\TaskListFormatter $taskListFormatter diff --git a/app/Formatter/ProjectApiApiFormatter.php b/app/Formatter/ProjectApiApiFormatter.php new file mode 100644 index 00000000..5521d57c --- /dev/null +++ b/app/Formatter/ProjectApiApiFormatter.php @@ -0,0 +1,39 @@ +<?php + +namespace Kanboard\Formatter; + +use Kanboard\Core\Filter\FormatterInterface; + +/** + * Class ProjectApiFormatter + * + * @package Kanboard\Formatter + */ +class ProjectApiFormatter extends BaseFormatter implements FormatterInterface +{ + protected $project = null; + + public function withProject($project) + { + $this->project = $project; + return $this; + } + + /** + * Apply formatter + * + * @access public + * @return mixed + */ + public function format() + { + if (! empty($this->project)) { + $this->project['url'] = array( + 'board' => $this->helper->url->to('BoardViewController', 'show', array('project_id' => $this->project['id']), '', true), + 'list' => $this->helper->url->to('TaskListController', 'show', array('project_id' => $this->project['id']), '', true), + ); + } + + return $this->project; + } +} diff --git a/app/Formatter/ProjectsApiFormatter.php b/app/Formatter/ProjectsApiFormatter.php new file mode 100644 index 00000000..0bf97da4 --- /dev/null +++ b/app/Formatter/ProjectsApiFormatter.php @@ -0,0 +1,38 @@ +<?php + +namespace Kanboard\Formatter; + +use Kanboard\Core\Filter\FormatterInterface; + +/** + * Class ProjectsApiFormatter + * + * @package Kanboard\Formatter + */ +class ProjectsApiFormatter extends BaseFormatter implements FormatterInterface +{ + protected $projects = array(); + + public function withProjects($projects) + { + $this->projects = $projects; + return $this; + } + + /** + * Apply formatter + * + * @access public + * @return mixed + */ + public function format() + { + if (! empty($this->projects)) { + foreach ($this->projects as &$project) { + $project = $this->projectApiFormatter->withProject($project)->format(); + } + } + + return $this->projects; + } +} diff --git a/app/Formatter/TaskApiFormatter.php b/app/Formatter/TaskApiFormatter.php new file mode 100644 index 00000000..60840beb --- /dev/null +++ b/app/Formatter/TaskApiFormatter.php @@ -0,0 +1,37 @@ +<?php + +namespace Kanboard\Formatter; + +use Kanboard\Core\Filter\FormatterInterface; + +/** + * Class TaskApiFormatter + * + * @package Kanboard\Formatter + */ +class TaskApiFormatter extends BaseFormatter implements FormatterInterface +{ + protected $task = null; + + public function withTask($task) + { + $this->task = $task; + return $this; + } + + /** + * Apply formatter + * + * @access public + * @return mixed + */ + public function format() + { + if (! empty($this->task)) { + $this->task['url'] = $this->helper->url->to('TaskViewController', 'show', array('task_id' => $this->task['id'], 'project_id' => $this->task['project_id']), '', true); + $this->task['color'] = $this->colorModel->getColorProperties($this->task['color_id']); + } + + return $this->task; + } +} diff --git a/app/Formatter/TasksApiFormatter.php b/app/Formatter/TasksApiFormatter.php new file mode 100644 index 00000000..95b14095 --- /dev/null +++ b/app/Formatter/TasksApiFormatter.php @@ -0,0 +1,38 @@ +<?php + +namespace Kanboard\Formatter; + +use Kanboard\Core\Filter\FormatterInterface; + +/** + * Class TasksApiFormatter + * + * @package Kanboard\Formatter + */ +class TasksApiFormatter extends BaseFormatter implements FormatterInterface +{ + protected $tasks = array(); + + public function withTasks($tasks) + { + $this->tasks = $tasks; + return $this; + } + + /** + * Apply formatter + * + * @access public + * @return mixed + */ + public function format() + { + if (! empty($this->tasks)) { + foreach ($this->tasks as &$task) { + $task = $this->taskApiFormatter->withTask($task)->format(); + } + } + + return $this->tasks; + } +} diff --git a/app/Formatter/UserMentionFormatter.php b/app/Formatter/UserMentionFormatter.php index 395fc463..9ea76881 100644 --- a/app/Formatter/UserMentionFormatter.php +++ b/app/Formatter/UserMentionFormatter.php @@ -2,13 +2,15 @@ namespace Kanboard\Formatter; +use Kanboard\Core\Filter\FormatterInterface; + /** * Class UserMentionFormatter * * @package Kanboard\Formatter * @author Frederic Guillot */ -class UserMentionFormatter extends BaseFormatter +class UserMentionFormatter extends BaseFormatter implements FormatterInterface { protected $users = array(); diff --git a/app/ServiceProvider/FormatterProvider.php b/app/ServiceProvider/FormatterProvider.php index a31bf357..efc85d06 100644 --- a/app/ServiceProvider/FormatterProvider.php +++ b/app/ServiceProvider/FormatterProvider.php @@ -22,8 +22,12 @@ class FormatterProvider implements ServiceProviderInterface 'BoardTaskFormatter', 'GroupAutoCompleteFormatter', 'ProjectActivityEventFormatter', + 'ProjectApiFormatter', + 'ProjectsApiFormatter', 'SubtaskListFormatter', 'SubtaskTimeTrackingCalendarFormatter', + 'TaskApiFormatter', + 'TasksApiFormatter', 'TaskAutoCompleteFormatter', 'TaskICalFormatter', 'TaskListFormatter', diff --git a/tests/integration/ProjectProcedureTest.php b/tests/integration/ProjectProcedureTest.php index 69c2464f..b55cfee2 100644 --- a/tests/integration/ProjectProcedureTest.php +++ b/tests/integration/ProjectProcedureTest.php @@ -28,6 +28,8 @@ class ProjectProcedureTest extends BaseProcedureTest $this->assertNotNull($project); $this->assertEquals($this->projectName, $project['name']); $this->assertEquals('Description', $project['description']); + $this->assertArrayHasKey('board', $project['url']); + $this->assertArrayHasKey('list', $project['url']); } public function assertGetProjectByName() @@ -43,6 +45,9 @@ class ProjectProcedureTest extends BaseProcedureTest { $projects = $this->app->getAllProjects(); $this->assertNotEmpty($projects); + $this->assertInternalType('array', $projects); + $this->assertArrayHasKey('board', $projects[0]['url']); + $this->assertArrayHasKey('list', $projects[0]['url']); } public function assertGetProjectActivity() diff --git a/tests/integration/TaskProcedureTest.php b/tests/integration/TaskProcedureTest.php index f456ae52..54527939 100644 --- a/tests/integration/TaskProcedureTest.php +++ b/tests/integration/TaskProcedureTest.php @@ -28,6 +28,7 @@ class TaskProcedureTest extends BaseProcedureTest $this->assertNotNull($task); $this->assertEquals('red', $task['color_id']); $this->assertEquals($this->taskTitle, $task['title']); + $this->assertArrayHasKey('url', $task); } public function assertGetTaskByReference() @@ -45,6 +46,7 @@ class TaskProcedureTest extends BaseProcedureTest $tasks = $this->app->getAllTasks($this->projectId); $this->assertInternalType('array', $tasks); $this->assertNotEmpty($tasks); + $this->assertArrayHasKey('url', $tasks[0]); } public function assertOpenCloseTask() |