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 getPaginationParams(Request $request): array { $params = $request->getQueryParams(); $page = max(1, (int)($params['page'] ?? 1)); $perPage = min(50, max(1, (int)($params['per_page'] ?? 20))); return [ 'page' => $page, 'per_page' => $perPage, 'offset' => ($page - 1) * $perPage ]; } protected function getAuthUser(Request $request): ?array { return $request->getAttribute('user'); } protected function isAdmin(Request $request): bool { $user = $this->getAuthUser($request); return $user && ($user['is_admin'] ?? false); } }