summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Guillot <fred@kanboard.net>2017-05-22 15:33:16 -0400
committerFrederic Guillot <fred@kanboard.net>2017-05-22 15:33:16 -0400
commit54a751820f39e8891f775b8d9293349399b3e8c2 (patch)
tree777636eb37fd2dc3af959171a64eb14933641dec
parentf16ac8cd66b107f04db78a70521a959eca85159a (diff)
Add task and project API formatters
-rw-r--r--ChangeLog1
-rw-r--r--app/Api/Procedure/BaseProcedure.php45
-rw-r--r--app/Api/Procedure/MeProcedure.php2
-rw-r--r--app/Api/Procedure/ProjectProcedure.php15
-rw-r--r--app/Api/Procedure/TaskProcedure.php9
-rw-r--r--app/Core/Base.php4
-rw-r--r--app/Formatter/ProjectApiApiFormatter.php39
-rw-r--r--app/Formatter/ProjectsApiFormatter.php38
-rw-r--r--app/Formatter/TaskApiFormatter.php37
-rw-r--r--app/Formatter/TasksApiFormatter.php38
-rw-r--r--app/Formatter/UserMentionFormatter.php4
-rw-r--r--app/ServiceProvider/FormatterProvider.php4
-rw-r--r--tests/integration/ProjectProcedureTest.php5
-rw-r--r--tests/integration/TaskProcedureTest.php2
14 files changed, 186 insertions, 57 deletions
diff --git a/ChangeLog b/ChangeLog
index 478476ba..f4fb94c4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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()