register('GET', '/records/*', array($this, '_list')); $router->register('POST', '/records/*', array($this, 'create')); $router->register('GET', '/records/*/*', array($this, 'read')); $router->register('PUT', '/records/*/*', array($this, 'update')); $router->register('DELETE', '/records/*/*', array($this, 'delete')); $router->register('PATCH', '/records/*/*', array($this, 'increment')); $this->service = $service; $this->responder = $responder; } public function _list(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); $params = RequestUtils::getParams($request); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } return $this->responder->success($this->service->_list($table, $params)); } public function read(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } if ($this->service->getType($table) != 'table') { return $this->responder->error(ErrorCode::OPERATION_NOT_SUPPORTED, __FUNCTION__); } $id = RequestUtils::getPathSegment($request, 3); $params = RequestUtils::getParams($request); if (strpos($id, ',') !== false) { $ids = explode(',', $id); $result = []; for ($i = 0; $i < count($ids); $i++) { array_push($result, $this->service->read($table, $ids[$i], $params)); } return $this->responder->success($result); } else { $response = $this->service->read($table, $id, $params); if ($response === null) { return $this->responder->error(ErrorCode::RECORD_NOT_FOUND, $id); } return $this->responder->success($response); } } public function create(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } if ($this->service->getType($table) != 'table') { return $this->responder->error(ErrorCode::OPERATION_NOT_SUPPORTED, __FUNCTION__); } $record = $request->getParsedBody(); if ($record === null) { return $this->responder->error(ErrorCode::HTTP_MESSAGE_NOT_READABLE, ''); } $params = RequestUtils::getParams($request); if (is_array($record)) { $result = array(); foreach ($record as $r) { $result[] = $this->service->create($table, $r, $params); } return $this->responder->success($result); } else { return $this->responder->success($this->service->create($table, $record, $params)); } } public function update(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } if ($this->service->getType($table) != 'table') { return $this->responder->error(ErrorCode::OPERATION_NOT_SUPPORTED, __FUNCTION__); } $id = RequestUtils::getPathSegment($request, 3); $params = RequestUtils::getParams($request); $record = $request->getParsedBody(); if ($record === null) { return $this->responder->error(ErrorCode::HTTP_MESSAGE_NOT_READABLE, ''); } $ids = explode(',', $id); if (is_array($record)) { if (count($ids) != count($record)) { return $this->responder->error(ErrorCode::ARGUMENT_COUNT_MISMATCH, $id); } $result = array(); for ($i = 0; $i < count($ids); $i++) { $result[] = $this->service->update($table, $ids[$i], $record[$i], $params); } return $this->responder->success($result); } else { if (count($ids) != 1) { return $this->responder->error(ErrorCode::ARGUMENT_COUNT_MISMATCH, $id); } return $this->responder->success($this->service->update($table, $id, $record, $params)); } } public function delete(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } if ($this->service->getType($table) != 'table') { return $this->responder->error(ErrorCode::OPERATION_NOT_SUPPORTED, __FUNCTION__); } $id = RequestUtils::getPathSegment($request, 3); $params = RequestUtils::getParams($request); $ids = explode(',', $id); if (count($ids) > 1) { $result = array(); for ($i = 0; $i < count($ids); $i++) { $result[] = $this->service->delete($table, $ids[$i], $params); } return $this->responder->success($result); } else { return $this->responder->success($this->service->delete($table, $id, $params)); } } public function increment(ServerRequestInterface $request): ResponseInterface { $table = RequestUtils::getPathSegment($request, 2); if (!$this->service->hasTable($table)) { return $this->responder->error(ErrorCode::TABLE_NOT_FOUND, $table); } if ($this->service->getType($table) != 'table') { return $this->responder->error(ErrorCode::OPERATION_NOT_SUPPORTED, __FUNCTION__); } $id = RequestUtils::getPathSegment($request, 3); $record = $request->getParsedBody(); if ($record === null) { return $this->responder->error(ErrorCode::HTTP_MESSAGE_NOT_READABLE, ''); } $params = RequestUtils::getParams($request); $ids = explode(',', $id); if (is_array($record)) { if (count($ids) != count($record)) { return $this->responder->error(ErrorCode::ARGUMENT_COUNT_MISMATCH, $id); } $result = array(); for ($i = 0; $i < count($ids); $i++) { $result[] = $this->service->increment($table, $ids[$i], $record[$i], $params); } return $this->responder->success($result); } else { if (count($ids) != 1) { return $this->responder->error(ErrorCode::ARGUMENT_COUNT_MISMATCH, $id); } return $this->responder->success($this->service->increment($table, $id, $record, $params)); } } }