domovoy/app/Controllers/DiscoveriesController.php

97 lines
3.3 KiB
PHP

<?php
declare(strict_types=1);
namespace Domovoy\Controllers;
use Domovoy\Repositories\DiscoveredHostRepository;
use Domovoy\Repositories\NetworkRangeRepository;
use Domovoy\Services\Inventory\DeviceService;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
class DiscoveriesController
{
public function __construct(
private DiscoveredHostRepository $discoveredHostRepository,
private NetworkRangeRepository $networkRangeRepository,
private DeviceService $deviceService
) {
}
public function index(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$filters = $this->filters($request);
$ranges = $this->networkRangeRepository->findAll();
$findings = $this->discoveredHostRepository->findFiltered(
$filters['range_id'],
$filters['scan_job_id'],
$filters['status'],
200,
$filters['sort'],
$filters['dir']
);
ob_start();
$username = $_SESSION['username'] ?? 'User';
require dirname(__DIR__, 2) . '/templates/discoveries/index.php';
$body = ob_get_clean();
$response->getBody()->write($body);
return $response;
}
public function table(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$filters = $this->filters($request);
$findings = $this->discoveredHostRepository->findFiltered(
$filters['range_id'],
$filters['scan_job_id'],
$filters['status'],
200,
$filters['sort'],
$filters['dir']
);
ob_start();
require dirname(__DIR__, 2) . '/templates/discoveries/_table.php';
$body = ob_get_clean();
$response->getBody()->write($body);
return $response;
}
public function merge(ServerRequestInterface $request, ResponseInterface $response): ResponseInterface
{
$data = $request->getParsedBody();
$hostId = isset($data['host_id']) ? (int)$data['host_id'] : 0;
$deviceId = isset($data['device_id']) ? (int)$data['device_id'] : 0;
if ($hostId > 0 && $deviceId > 0) {
$this->deviceService->mergeDiscoveredHost($hostId, $deviceId);
}
$referer = $request->getHeaderLine('Referer') ?: '/discoveries';
return $response
->withHeader('Location', $referer)
->withStatus(302);
}
/**
* @return array{range_id: ?int, scan_job_id: ?int, status: ?string, sort: string, dir: string}
*/
private function filters(ServerRequestInterface $request): array
{
$query = $request->getQueryParams();
$status = (string)($query['status'] ?? 'new');
$sort = (string)($query['sort'] ?? 'ip');
$dir = strtolower((string)($query['dir'] ?? 'asc')) === 'desc' ? 'desc' : 'asc';
return [
'range_id' => isset($query['range_id']) && $query['range_id'] !== '' ? (int)$query['range_id'] : null,
'scan_job_id' => isset($query['scan_job_id']) && $query['scan_job_id'] !== '' ? (int)$query['scan_job_id'] : null,
'status' => $status === 'all' ? null : $status,
'sort' => $sort,
'dir' => $dir,
];
}
}