From 66ba2473af2e327c8c4e21db953a5001b3e483b9 Mon Sep 17 00:00:00 2001 From: Miguel Nogueira Date: Mon, 14 Apr 2025 00:05:48 +0100 Subject: [PATCH] feat: add getTask for fetching single task --- index.php | 7 +++++++ src/Controllers/TaskController.php | 23 ++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index 6651683..4a9d6fd 100644 --- a/index.php +++ b/index.php @@ -4,6 +4,7 @@ use Controllers\TaskController; use DI\Bridge\Slim\Bridge; use DI\Container; use Controllers\HomeFrontController; +use Slim\Handlers\Strategies\RequestResponseArgs; require_once __DIR__ . '/vendor/autoload.php'; @@ -11,9 +12,15 @@ $container = new Container(); $app = Bridge::create($container); $app->addBodyParsingMiddleware(); +// this strategy is preferable because we aren't using a lot of named placeholders +$routeCollector = $app->getRouteCollector(); +$routeCollector->setDefaultInvocationStrategy(new RequestResponseArgs()); + + $app->get('/', [HomeFrontController::class, 'home']); $app->get('/tasks', [TaskController::class, 'getTasks']); +$app->get('/tasks/{id}', [TaskController::class, 'getTask']); $app->post('/tasks', [TaskController::class, 'addTask']); diff --git a/src/Controllers/TaskController.php b/src/Controllers/TaskController.php index 98a66d6..ec7de62 100644 --- a/src/Controllers/TaskController.php +++ b/src/Controllers/TaskController.php @@ -5,6 +5,7 @@ namespace Controllers; use Carbon\Carbon; use Carbon\Exceptions\InvalidFormatException; use Exceptions\InvalidTaskDateException; +use Exceptions\TaskNotFoundException; use Models\Task; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; @@ -69,7 +70,7 @@ class TaskController $end = Carbon::parse($params['tasks']['end']); if ($start->gt($end) || $end->lt($start)) { - throw new \DomainException('Invalid task date. Start date must not be after end date.'); + throw new InvalidTaskDateException('Invalid task date. Start date must not be after end date.'); } } catch (InvalidFormatException | \DomainException $exception) @@ -134,4 +135,24 @@ class TaskController return $response; } + + public function getTask(ServerRequestInterface $request, ResponseInterface $response, string $id): ResponseInterface + { + try { + $payload['task'] = $this->repository->readById((int)$id)->persist(); + + $this->builder->setPayload($payload)->setOptionalMessage("Task retrieved."); + $response->getBody()->write($this->builder->build()); + + return $response; + + } catch (TaskNotFoundException $e) { + + $this->builder->setError()->setErrorMessage($e->getMessage())->setErrorCode(404); + $errorResponse = $response->withStatus(404, $e->getMessage()); + + $response->getBody()->write($this->builder->build()); + return $errorResponse; + } + } } \ No newline at end of file