Files
map-asset-gateway/demo/demo_push_result.ps1
T
Harmon 73ad03fa59 Rewrite the gateway around health, retries, slicing and a Windows service
Scanner
- manifest lookup is now depth-bounded and prunes numeric zoom directories, so
  a scan no longer walks the whole tile payload
- rescans only report a version as updated when something actually changed
- overlapping runs are refused instead of interleaving their bookkeeping

Hot path
- token authorisation loads only that token grants and throttles the
  last_used_at write instead of touching it on every tile
- SQLite runs in WAL with a busy timeout and a real connection pool
- the catalog lookup used by /tiles no longer loads every basemap

Security
- the admin surface requires ADMIN_TOKEN (bearer) or ADMIN_USER/ADMIN_PASSWORD
  (basic), and the service refuses to bind off-host without credentials
- CORS is an explicit allow-list; newly minted tokens never reach a redirect URL
- client tokens are redacted from the access log

Operations
- resource health inspection flags a moved or deleted tile root before a 404
- pushes retry with backoff and can be re-queued by hand; the schedule lives in
  the database so a restart does not lose it
- access log plus /metrics counters

Image slicing
- tile_jobs drive the GDAL bundled with QGIS via scripts/gdal2tiles-qgis.bat
- layer_sources remembers what a layer is made of: submit one source to append
  a flight, or all of them to rebuild the layer as a VRT mosaic with no tile
  seams; the console exposes both, including a one-click rebuild
- slicing is available to integrations through a narrow slice token scope
  (submit, poll, idempotent by code, completion callback)

Console
- rebuilt around a fixed rail and single-view navigation with health and
  outstanding work leading, instead of one long scrolling page

Windows service
- native install/start/stop/status with crash recovery, auto-start and a
  rotating log file, so no NSSM wrapper is needed
- start-all.bat and stop-all.bat are removed: they killed the process by port
  with taskkill, which fought the service restart policy

Verified with 49 tests and live runs against real tile data and real GDAL.
2026-10-16 10:35:30 +08:00

73 lines
2.1 KiB
PowerShell

param(
[string]$ProjectCode = "default",
[string]$ResultCode = "",
[string]$ResultID = "",
[string]$TargetSystemCode = "",
[string]$CallbackUrl = "",
[string]$StyleVersionID = "",
[string]$RequestedBy = "demo-user",
[bool]$WaitForJob = $true,
[bool]$IncludeArtifacts = $true,
[int]$TimeoutSec = 180
)
. (Join-Path $PSScriptRoot "common.ps1")
Import-RsDemoEnvironment
if (-not $ResultID -and -not $ResultCode) {
throw "ResultID or ResultCode is required"
}
$result = if ($ResultID) {
Invoke-RsApi -Method "GET" -Path ("/api/v1/results/{0}" -f $ResultID)
} else {
Get-RsResultByCode -ProjectCode $ProjectCode -Code $ResultCode
}
if (-not $StyleVersionID) {
if ($result.delivery -and $result.delivery.style_version -and $result.delivery.style_version.id) {
$StyleVersionID = $result.delivery.style_version.id
} elseif ($result.styles -and $result.styles.Count -gt 0) {
$StyleVersionID = $result.styles[0].id
}
}
if (-not $StyleVersionID) {
throw "No style version is bound to the target result"
}
$body = @{
requested_by = $RequestedBy
style_version_id = $StyleVersionID
include_artifacts = $IncludeArtifacts
}
if ($TargetSystemCode) {
$body.target_system_code = $TargetSystemCode
}
if ($CallbackUrl) {
$body.callback_url = $CallbackUrl
}
if (-not $TargetSystemCode -and -not $CallbackUrl) {
$body.callback_url = "http://127.0.0.1:8920/callback"
}
$push = Invoke-RsApi -Method "POST" -Path ("/api/v1/results/{0}/pushes" -f $result.id) -Body $body
$job = $null
if ($WaitForJob) {
$job = Wait-RsJob -JobID $push.job.id -TimeoutSec $TimeoutSec
}
[ordered]@{
api_base_url = Get-RsApiBaseUrl
result_id = $result.id
result_code = $result.code
style_version_id = $StyleVersionID
target_system_code = $push.target_system_code
callback_url = $push.callback_url
publish_id = $push.publish_id
job_id = $push.job.id
job_status = if ($job) { $job.status } else { $push.job.status }
resource_kind = $push.resource_kind
} | ConvertTo-Json -Depth 8