Files
Investidor-V2/tools/portal-audit-geometry-consumers.php
nala 6ddafc95ba
tests / ci (push) Canceled after 0s
oportunidades 4
2026-10-10 07:03:59 +02:00

58 lines
3.7 KiB
PHP

<?php
use App\Services\TerritoryGeometry;
use Illuminate\Contracts\Console\Kernel;
use Illuminate\Support\Facades\DB;
// Read the preserved GIS QA only; no publication and no active connection.
$root = dirname(__DIR__);
$dir = $root.'/storage/app/private/investmoz-v2/portal-audit';
$pathQa = ($argv[1] ?? '') === 'path-qa';
$proof = json_decode(file_get_contents($pathQa ? $dir.'/../opportunity-resources-backup-proof.json' : $dir.'/resources-backup-proof-171209.json'), true, 512, JSON_THROW_ON_ERROR);
$target = $proof['restored_target'];
if (! ($proof['restore_verified'] ?? false) || ! preg_match('/^desk_restore_\d{8}_\d{6}_test$/D', $target['database']) || (! $pathQa && $target['database'] !== 'desk_restore_20261009_171209_test') || (int) $target['port'] !== 55441) {
throw new RuntimeException('Named preserved geometry QA required.');
}
foreach (['APP_ENV' => 'testing', 'DB_CONNECTION' => 'pgsql', 'DB_HOST' => '127.0.0.1', 'DB_PORT' => '55441', 'DB_DATABASE' => $target['database'], 'DB_USERNAME' => 'postgres', 'DB_PASSWORD' => '', 'DB_URL' => ''] as $key => $value) {
putenv($key.'='.$value);
$_ENV[$key] = $_SERVER[$key] = $value;
}
require $root.'/vendor/autoload.php';
$app = require $root.'/bootstrap/app.php';
$app->make(Kernel::class)->bootstrap();
$identity = DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port');
if ($identity->database !== $target['database'] || (int) $identity->port !== 55441) {
throw new RuntimeException('Refusing unexpected connection.');
}
DB::beginTransaction();
DB::statement('SET TRANSACTION READ ONLY');
$rows = DB::table('geo_geometries')->where('source_system', 'ine-cod-ab')->whereNull('deleted_at')->orderBy('id')->get(['id', 'geo_location_id']);
$results = [];
$service = app(TerritoryGeometry::class);
foreach ($rows as $row) {
$private = $service->context($row->geo_location_id, true);
$public = $service->context($row->geo_location_id, false);
if (! $private['selected_geometry_available'] || $public['context_geometry_count'] !== 0) {
throw new RuntimeException('Geometry recovery or privacy mismatch.');
}
$results[] = ['geometry_id' => $row->id, 'territory_id' => $row->geo_location_id, 'selected_available_manager' => true,
'context_geometry_count_manager' => $private['context_geometry_count'], 'public_context_count' => $public['context_geometry_count'],
'editions' => array_values(array_unique(array_column($private['areas'], 'source_date')))];
}
$examples = [];
foreach (['province', 'district', 'admin_post'] as $type) {
$example = DB::table('geo_geometries as g')->join('geo_locations as l', 'l.id', '=', 'g.geo_location_id')
->where('g.source_system', 'ine-cod-ab')->whereNull('g.deleted_at')->where('l.location_type', $type)
->orderBy('l.name')->first(['l.id', 'l.name', 'l.location_type']);
if ($example) {
$examples[] = $example;
}
}
DB::rollBack();
$result = ['captured_at' => gmdate('c'), 'target' => $target, 'read_only' => true, 'real_geometries_checked' => count($rows),
'results' => $results, 'active_writes' => 0, 'qa_writes' => 0, 'public_geometries_promoted' => 0, 'visual_verified' => false,
'selector_examples' => $examples,
'scope' => 'Service recovery of every retained real QA administrative boundary; synthetic HTTP profile authorization is demonstrated separately by PortalAuditConsumerLotTest'];
file_put_contents($dir.($pathQa ? '/geometry-consumers-path-qa.json' : '/geometry-consumers-lote3.json'), json_encode($result, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
echo json_encode(['checked' => count($rows), 'private_recovery' => 'passed', 'public_leak' => 0, 'active_writes' => 0, 'visual_verified' => false]).PHP_EOL;