mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 12:31:13 +00:00
51b572108a
Captures the post-implementation autodev gates for AZ-484 multi-source tile storage: - Step 12 (Test-Spec Sync): added 7 AC rows (AZ-484 AC-1..AC-7) and a PT-07 NFR row to traceability-matrix.md; added PT-07 scenario to performance-tests.md. - Step 13 (Update Docs): refreshed data_model.md (tiles columns + indexes + selection rule + UPSERT contract + migrations 012/013), module-layout.md (Common/Enums section with L-001 guidance, DataAccess imports-from now lists 6 sites), 6 module / component docs to reflect the new repo signatures, source/captured_at fields, and Dapper enum bypass workaround. ripple_log_cycle1.md records zero out-of-scope ripple. - Step 14 (Security Audit): PASS_WITH_WARNINGS - 0 Critical, 0 High, 5 Medium, 5 Low. AZ-484 itself added zero new findings. Hardening items (Postgres default creds, .env in build context, GMaps key rotation, ASP.NET Core 8.0.21 -> 8.0.25, rate limiter) recorded for separate tickets. - Step 15 (Performance Test): all PT-01..PT-07 scenarios Unverified (non-blocking); PT-07 baseline-comparison harness deferred to a leftover for next cycle. - Step 16 (Deploy): cycle deploy report covering migration safety, rollback path, post-deploy verification, security caveats. Co-authored-by: Cursor <cursoragent@cursor.com>
3.6 KiB
3.6 KiB
Module: Services/TileService
Purpose
Orchestrates tile downloading and persistence. Bridges the downloader (Google Maps) with the tile repository (PostgreSQL), handling in-memory caching, entity creation, and metadata mapping. Single ownership point for all tile read/write business logic — both region-batch and single-tile API endpoints route through this service.
csproj: SatelliteProvider.Services.TileDownloader/TileService.cs
Public Interface
TileService (implements ITileService)
DownloadAndStoreTilesAsync(double lat, double lon, double sizeMeters, int zoomLevel, CancellationToken) → Task<List<TileMetadata>>:- Queries existing tiles in the region from the repository — most-recent across sources per
(latitude, longitude, tile_zoom, tile_size_meters)(AZ-484 selection rule applied byTileRepository.GetTilesByRegionAsyncviaDISTINCT ON) - Calls
ISatelliteDownloader.GetTilesWithMetadataAsyncwith existing tiles to skip - Creates
TileEntityfor each newly downloaded tile and inserts via repository (per-source UPSERT keyed on(latitude, longitude, tile_zoom, tile_size_meters, source)) - Returns combined list of existing + new tile metadata
- Queries existing tiles in the region from the repository — most-recent across sources per
GetTileAsync(Guid id) → Task<TileMetadata?>: single tile lookupGetTilesByRegionAsync(double lat, double lon, double sizeMeters, int zoomLevel) → Task<IEnumerable<TileMetadata>>: query tiles in a regionGetOrDownloadTileAsync(int z, int x, int y, CancellationToken) → Task<TileBytes>(AZ-310): cache → repository → downloader fallback for single Z/X/Y servingDownloadAndStoreSingleTileAsync(double latitude, double longitude, int zoomLevel, CancellationToken) → Task<TileMetadata>(AZ-311): download one tile by lat/lon, persist, return metadata
Internal Logic
- New rows write
Version = nullandMapsVersion = null(post-AZ-357 / AZ-373); theversionandmaps_versioncolumns are retained for backward compatibility with pre-existing rows - AZ-484:
BuildTileEntitystamps every newly downloaded row withSource = TileSourceConverter.ToWireValue(TileSource.GoogleMaps)(wire value"google_maps") andCapturedAt = DateTime.UtcNow. The Google Maps download path is the only producer of'google_maps'rows; UAV ingestion (separate task) is the only producer of'uav'rows. MapToMetadata(TileEntity) → TileMetadata: entity-to-DTO mapping (static helper);MapsVersionis no longer projected ontoTileMetadata/DownloadTileResponse.SourceandCapturedAtare not currently projected to the public DTO (no API contract change observable for AZ-484).TileSizePixelssourced fromMapConfig.TileSizePixels(default 256, post-AZ-371); image type fixed at"jpg"IMemoryCachekeyed by(z, x, y)with 1h absolute / 30min sliding expiration; populated on first hit and on downloader fallback
Dependencies
ISatelliteDownloader(resolved via DI; concrete isGoogleMapsDownloaderV2)ITileRepositoryIMemoryCache(registered byAddTileDownloader())SatelliteProvider.Common.DTO— GeoPoint, TileMetadata, TileBytesSatelliteProvider.Common.Enums—TileSource,TileSourceConverter(AZ-484)SatelliteProvider.DataAccess.Models— TileEntity
Consumers
RegionService.ProcessRegionAsync— downloads and retrieves tiles for a region
Data Models
Transforms between TileEntity (persistence) and TileMetadata (DTO).
Configuration
None directly; relies on GoogleMapsDownloaderV2's configuration.
External Integrations
Indirect: Google Maps (via downloader), PostgreSQL (via repository).
Security
None.
Tests
No dedicated tests.