97 lines
3.3 KiB
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,
|
|
];
|
|
}
|
|
}
|