74696bbeb3
Signed-off-by: Sebastian Krupinski <krupinski01@gmail.com>
122 lines
3.7 KiB
PHP
122 lines
3.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace KTXC\Controllers;
|
|
|
|
use KTXC\Http\Response\JsonResponse;
|
|
use KTXC\Service\SystemFirewallRuleService;
|
|
use KTXC\Service\TenantFirewallRuleService;
|
|
use KTXF\Controller\ControllerAbstract;
|
|
use KTXF\Routing\Attributes\AuthenticatedRoute;
|
|
|
|
final class FirewallController extends ControllerAbstract
|
|
{
|
|
public function __construct(
|
|
private readonly TenantFirewallRuleService $tenantRules,
|
|
private readonly SystemFirewallRuleService $systemRules,
|
|
) {
|
|
}
|
|
|
|
#[AuthenticatedRoute(
|
|
'/firewall/rules',
|
|
name: 'firewall.tenant.rules.list',
|
|
permissions: [TenantFirewallRuleService::PERMISSION_READ],
|
|
)]
|
|
public function tenantRules(
|
|
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->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);
|
|
}
|
|
}
|