true]; if ($data !== null) { $responseData['data'] = $data; } return $this->json($response, $responseData, $status); } protected function error(Response $response, string $message, int $status = 400, array $errors = []): Response { $responseData = [ 'success' => false, 'error' => [ 'message' => $message, 'code' => $status ] ]; if (!empty($errors)) { $responseData['error']['details'] = $errors; } return $this->json($response, $responseData, $status); } protected function json(Response $response, $data, int $status = 200): Response { $response->getBody()->write(json_encode($data)); return $response ->withHeader('Content-Type', 'application/json') ->withStatus($status); } protected function getPaginationParams(Request $request): array { $params = $request->getQueryParams(); $page = max(1, (int)($params['page'] ?? 1)); $perPage = min(100, max(1, (int)($params['per_page'] ?? 20))); return [ 'page' => $page, 'per_page' => $perPage, 'offset' => ($page - 1) * $perPage ]; } }