From cbcf132955800b848a15da980bda6ab502629c5b Mon Sep 17 00:00:00 2001 From: Matthew Ross Date: Sat, 23 Apr 2016 15:17:37 -0400 Subject: [PATCH] Initial Boards API implementation Created initial Activity model and DbLogger class for logging changes to the database (to be used in activity displays). Includes initial unit tests for Boards implementation. --- src/api/controllers/BaseController.php | 3 ++ src/api/controllers/Boards.php | 66 ++++++++++++++++++++++++++ src/api/models/Activity.php | 29 +++++++++++ src/api/models/BaseModel.php | 9 +++- src/api/models/Board.php | 10 ++++ src/api/models/DbLogger.php | 18 +++++++ test/api/BoardsTest.php | 35 +++++++++++--- test/api/Mocks.php | 8 ++++ 8 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 src/api/models/Activity.php create mode 100644 src/api/models/DbLogger.php diff --git a/src/api/controllers/BaseController.php b/src/api/controllers/BaseController.php index 6d749ce..b775c15 100644 --- a/src/api/controllers/BaseController.php +++ b/src/api/controllers/BaseController.php @@ -1,12 +1,15 @@ apiJson = new ApiJson(); $this->logger = $container->get('logger'); + $this->dbLogger = new DbLogger(); $this->container = $container; } diff --git a/src/api/controllers/Boards.php b/src/api/controllers/Boards.php index fa0423d..a14c47a 100644 --- a/src/api/controllers/Boards.php +++ b/src/api/controllers/Boards.php @@ -39,12 +39,78 @@ class Boards extends BaseController { } public function addBoard($request, $response, $args) { + $board = Board::fromJson($this->container, $request->getBody()); + $board->save(); + + if ($board->id === 0) { + $this->logger->addError('Add Board: ', [$board]); + $this->apiJson->addAlert('error', 'Error adding board. ' . + 'Please check your entries and try again.'); + + return $this->jsonResponse($response); + } + + // TODO: Get existing user to log user_id and name + $this->dbLogger->logChange($this->container, 0, + ' added board ' . $board->name, '', $board, 'board', $board->id); + + $this->apiJson->setSuccess(); + $this->apiJson->addAlert('success', + 'Board ' . $board->name . ' added.'); + + return $this->jsonResponse($response); } public function updateBoard($request, $response, $args) { + $board = new Board($this->container, (int)$args['id']); + $update = Board::fromJson($request->getBody()); + + if ($board->id !== $update->id) { + $this->logger->addError('Update Board: ', [$board, $update]); + $this->apiJson->addAlert('error', 'Error updating board. ' . + 'Please check your entries and try again.'); + + return $this->jsonResponse($response); + } + + $update->save(); + + // TODO: Get existing user to log user_id and name + $this->dbLogger->logChange($this->container, 0, + ' updated board ' . $update->name, $board, $update, + 'board', $board->id); + + $this->apiJson->setSuccess(); + $this->apiJson->addAlert('success', + 'Board ' . $update->name . ' updated.'); + + return $this->jsonResponse($response); } public function removeBoard($request, $response, $args) { + $id = (int)$args['id']; + $board = new Board($this->container, $id); + + if ($board->id !== $id) { + $this->logger->addError('Remove Board: ', [$board]); + $this->apiJson->addAlert('error', 'Error removing board. ' . + 'No board found for ID ' . $id . '.'); + + return $this->jsonResponse($response); + } + + $before = $board; + $board->delete(); + + // TODO: Get existing user to log user_id and name + $this->dbLogger->logChange($this->container, 0, + ' removed board ' . $before->name, $before, '', 'board', $id); + + $this->apiJson->setSuccess(); + $this->apiJson->addAlert('success', + 'Board ' . $before->name . ' updated.'); + + return $this->jsonResponse($response); } } diff --git a/src/api/models/Activity.php b/src/api/models/Activity.php new file mode 100644 index 0000000..ea50229 --- /dev/null +++ b/src/api/models/Activity.php @@ -0,0 +1,29 @@ +loadFromBean($bean); + + return $instance; + } + + public function updateBean() { + } + + public function loadFromBean($bean) { + } +} + diff --git a/src/api/models/BaseModel.php b/src/api/models/BaseModel.php index a3decca..65250d1 100644 --- a/src/api/models/BaseModel.php +++ b/src/api/models/BaseModel.php @@ -15,8 +15,13 @@ abstract class BaseModel { public function save() { $this->updateBean(); - R::store($this->bean); - $this->loadFromBean($this->bean); + + try { + R::store($this->bean); + $this->loadFromBean($this->bean); + } catch (Exception $ex) { + $this->logger->addError('Save Error: ', [$this->bean]); + } } public function delete() { diff --git a/src/api/models/Board.php b/src/api/models/Board.php index 7594fd0..0c27ada 100644 --- a/src/api/models/Board.php +++ b/src/api/models/Board.php @@ -22,11 +22,21 @@ class Board extends BaseModel { return $instance; } + public static function fromJson($container, $json) { + $instance = new self($container, 0, true); + $instance->loadFromJson($json); + + return $instance; + } + public function updateBean() { } public function loadFromBean($bean) { } + public function loadFromJson($json) { + } + } diff --git a/src/api/models/DbLogger.php b/src/api/models/DbLogger.php new file mode 100644 index 0000000..a93db20 --- /dev/null +++ b/src/api/models/DbLogger.php @@ -0,0 +1,18 @@ +user_id = $user_id; + $activity->log_text = $log_text; + $activity->before = $before; + $activity->after = $after; + $activity->item_type = $item_type; + $activity->item_id = $item_id; + + $activity->save(); + } +} + diff --git a/test/api/BoardsTest.php b/test/api/BoardsTest.php index 394965e..513031b 100644 --- a/test/api/BoardsTest.php +++ b/test/api/BoardsTest.php @@ -2,6 +2,7 @@ require_once 'Mocks.php'; class BoardsTest extends PHPUnit_Framework_TestCase { + private $boards; public static function setupBeforeClass() { try { @@ -15,19 +16,19 @@ class BoardsTest extends PHPUnit_Framework_TestCase { } } - public function testGetAllBoards() { - $boards = new Boards(new ContainerMock()); + public function setup() { + $this->boards = new Boards(new ContainerMock()); + } + public function testGetAllBoards() { $expected = new ApiJson(); $expected->addAlert('info', 'No boards in database.'); $this->assertEquals($expected, - $boards->getAllBoards(null, new ResponseMock(), null)); + $this->boards->getAllBoards(null, new ResponseMock(), null)); } public function testGetBoard() { - $boards = new Boards(new ContainerMock()); - $expected = new ApiJson(); $expected->addAlert('error', 'No board found for ID 1.'); @@ -35,7 +36,29 @@ class BoardsTest extends PHPUnit_Framework_TestCase { $args['id'] = '1'; $this->assertEquals($expected, - $boards->getBoard(null, new ResponseMock(), $args)); + $this->boards->getBoard(null, new ResponseMock(), $args)); + } + + public function testAddBoard() { + $expected = new ApiJson(); + $expected->addAlert('error', 'Error adding board. ' . + 'Please check your entries and try again.'); + + $this->assertEquals($expected, + $this->boards->addBoard(new RequestMock(), + new ResponseMock(), null)); + } + + public function testRemoveBoard() { + $expected = new ApiJson(); + $expected->addAlert('error', 'Error removing board. ' . + 'No board found for ID 1.'); + + $args = []; + $args['id'] = '1'; + + $this->assertEquals($expected, + $this->boards->removeBoard(null, new ResponseMock(), $args)); } } diff --git a/test/api/Mocks.php b/test/api/Mocks.php index 4d617a8..36c388b 100644 --- a/test/api/Mocks.php +++ b/test/api/Mocks.php @@ -27,6 +27,14 @@ class ContainerMock { } +class RequestMock { + + public function getBody() { + return '{}'; + } + +} + class ResponseMock { public function withJson($apiJson) {