queryResponse( fn(int $parsedLimit, int $parsedOffset): array => $this->tenantRules->queryRules( $status, $type, $action, $parsedLimit, $parsedOffset ), $limit, $offset ); } #[AuthenticatedRoute( '/firewall/rules/{ruleId}', name: 'firewall.tenant.rules.fetch', permissions: [TenantFirewallRuleService::PERMISSION_READ], )] public function tenantRule(string $ruleId): JsonResponse { return $this->ruleResponse($this->tenantRules->fetchRule($ruleId)); } #[AuthenticatedRoute( '/firewall/effective-policy', name: 'firewall.tenant.policy.effective', permissions: [TenantFirewallRuleService::PERMISSION_READ], )] public function effectivePolicy(): JsonResponse { return new JsonResponse($this->tenantRules->effectivePolicy()); } #[AuthenticatedRoute( '/firewall/system/rules', name: 'firewall.system.rules.list', permissions: [SystemFirewallRuleService::PERMISSION_READ], )] public function systemRules( string $status = 'active', ?string $type = null, ?string $action = null, string $limit = '50', string $offset = '0' ): JsonResponse { return $this->queryResponse( fn(int $parsedLimit, int $parsedOffset): array => $this->systemRules->queryRules( $status, $type, $action, $parsedLimit, $parsedOffset ), $limit, $offset ); } #[AuthenticatedRoute( '/firewall/system/rules/{ruleId}', name: 'firewall.system.rules.fetch', permissions: [SystemFirewallRuleService::PERMISSION_READ], )] public function systemRule(string $ruleId): JsonResponse { return $this->ruleResponse($this->systemRules->fetchRule($ruleId)); } private function queryResponse(callable $query, string $limit, string $offset): JsonResponse { try { if (!ctype_digit($limit) || !ctype_digit($offset)) { throw new \InvalidArgumentException('Pagination values must be non-negative integers.'); } return new JsonResponse($query((int)$limit, (int)$offset)); } catch (\InvalidArgumentException $error) { return new JsonResponse(['error' => $error->getMessage()], JsonResponse::HTTP_BAD_REQUEST); } } private function ruleResponse(?\JsonSerializable $rule): JsonResponse { if ($rule === null) { return new JsonResponse(['error' => 'Firewall rule not found.'], JsonResponse::HTTP_NOT_FOUND); } return new JsonResponse($rule); } }