Lines
80.00%
24 / 30
Methods
25.00%
1 / 4
Classes
0.00%
0 / 1
| Name | Lines | Methods | CRAP | ||||
|---|---|---|---|---|---|---|---|
| __invoke | 100.00% | 14 / 14 | 100.00% | 1 / 1 | 3 | ||
| getExceptionContext | 0.00% | 0 / 2 | 0.00% | 0 / 1 | 2 | ||
| readResponse | 0.00% | 0 / 1 | 0.00% | 0 / 1 | 2 | ||
| createJsonResponse | 76.92% | 10 / 13 | 0.00% | 0 / 1 | 7.60 | ||
| 11 | abstract class BaseController extends \BO\Slim\Controller | |
| 12 | { | |
| 13 | #[\Override] | |
| 14 | public function __invoke(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface | |
| 15 | { | |
| 16 | try { | |
| 17 | $request = $this->initRequest($request); | |
| 18 | $noCacheResponse = \BO\Slim\Render::withLastModified($response, time(), '0'); | |
| 19 | return $this->readResponse($request, $noCacheResponse, $args); | |
| 20 | } catch (\RuntimeException $e) { | |
| 21 | // Extract error details from the exception message | |
| 22 | [$errorCode, $errorMessage] = explode(': ', $e->getMessage(), 2); | |
| 23 | return $this->createJsonResponse($response, [ | |
| 24 | 'errors' => [ | |
| 25 | [ | |
| 26 | 'errorCode' => $errorCode, | |
| 27 | 'errorMessage' => $errorMessage, | |
| 28 | 'statusCode' => $e->getCode() | |
| 29 | ] | |
| 30 | ] | |
| 31 | ], $e->getCode() ?: 500); | |
| 32 | } | |
| 33 | } | |
| 34 | ||
| 35 | /** @psalm-api */ | |
| 36 | protected function getExceptionContext(): string | |
| 37 | { | |
| 38 | $className = (new \ReflectionClass($this))->getShortName(); | |
| 39 | return str_replace('Controller', '', $className); | |
| 40 | } | |
| 41 | ||
| 42 | /** | |
| 43 | * Hook method for handling responses in child controllers. | |
| 44 | * Child classes should override this method to implement their specific response logic. | |
| 45 | * | |
| 46 | * @param RequestInterface $request The HTTP request | |
| 47 | * @param ResponseInterface $response The HTTP response | |
| 48 | * @param array $args Route parameters | |
| 49 | * @return ResponseInterface The modified response | |
| 50 | */ | |
| 51 | public function readResponse(RequestInterface $request, ResponseInterface $response, array $args): ResponseInterface | |
| 52 | { | |
| 53 | return parent::__invoke($request, $response, $args); | |
| 54 | } | |
| 55 | ||
| 56 | protected function createJsonResponse(ResponseInterface $response, array $content, int $statusCode): ResponseInterface | |
| 57 | { | |
| 58 | if ($statusCode < 100 || $statusCode > 599) { | |
| 59 | throw new \InvalidArgumentException('Invalid HTTP status code'); | |
| 60 | } | |
| 61 | ||
| 62 | $response = $response->withStatus($statusCode) | |
| 63 | ->withHeader('Content-Type', 'application/json; charset=utf-8'); | |
| 64 | if (isset($content['errors'])) { | |
| 65 | foreach ($content['errors'] as &$error) { | |
| 66 | if (isset($error['errorCode'])) { | |
| 67 | $error = ErrorMessages::get($error['errorCode']); | |
| 68 | } | |
| 69 | } | |
| 70 | } | |
| 71 | ||
| 72 | try { | |
| 73 | $json = json_encode($content, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); | |
| 74 | } catch (\JsonException $e) { | |
| 75 | throw new \RuntimeException('Failed to encode JSON response: ' . $e->getMessage(), 0, $e); | |
| 76 | } | |
| 77 | ||
| 78 | $response->getBody()->write($json); | |
| 79 | return $response; | |
| 80 | } | |
| 81 | } |