mirror of
https://github.com/azaion/satellite-provider.git
synced 2026-06-21 20:51:14 +00:00
e3cd388577
Step 13 (Update Docs) for cycle 2. Most cross-cutting docs were already updated during Step 10 (architecture.md, glossary.md, components/03_tile_downloader, modules/api_program.md, data_model.md, contracts/api/uav-tile-upload.md). This commit completes the remaining module-level + module-layout updates and writes the cycle-2 ripple log. * modules/common_configs.md: + UavQualityConfig section and appsettings-section row (UavQuality). * modules/common_dtos.md: + UavTileMetadata, UavTileBatchMetadataPayload, UavTileBatchUploadResponse, UavTileUploadResultItem, UavTileUploadStatus, UavTileRejectReasons (closed enumeration v1.0.0). * module-layout.md: refresh Common (+ UavQualityConfig + UAV DTOs), TileDownloader (+ UavTileQualityGate, UavTileUploadHandler, + SixLabors.ImageSharp 3.1.11 PackageReference), and WebApi (+ Authentication/*, DTOs/UavTileBatchUploadRequest, + JwtBearer 8.0.21 PackageReference). Updates the "Last Updated" stamp to cycle 2. * modules/tests_unit.md: replace the obsolete "only a dummy test" description; add cycle-2 AZ-487 / AZ-488 test classes (AuthenticationServiceCollectionExtensionsTests, JwtTokenFactoryTests, UavTileQualityGateTests, UavTileUploadHandlerTests, UavTileFilePathTests, PermissionsRequirementTests) + new ProjectReference / package references. * modules/tests_integration.md: + JwtIntegrationTests, UavUploadTests (incl. wall-clock-seeded coordinate counter rationale from the Step 11 fix), and the StubAndErrorContractTests update for the removed 501 stub. * ripple_log_cycle2.md (new): cycle-2 reverse-dependency scan results showing every importer of the new symbols resolves inside the three already-updated components (WebApi, TileDownloader, Common). No unexpected ripple, no heuristic fallback needed. Co-authored-by: Cursor <cursoragent@cursor.com>
3.9 KiB
3.9 KiB
Module: Common/Configs
Purpose
Configuration POCOs that bind to appsettings.json sections via IOptions<T> pattern.
Public Interface
MapConfig
Service(string): map provider name (e.g., "GoogleMaps")ApiKey(string): API key for the map provider
StorageConfig
TilesDirectory(string): base path for tile storage (default:/tiles)ReadyDirectory(string): base path for output files (default:/ready)GetTileSubdirectoryPath(int zoomLevel, int tileX, int tileY) → string: computes bucketed subdirectory path ({tiles}/{zoom}/{xBucket}/{yBucket}) using integer division by 1000GetTileFilePath(int zoomLevel, int tileX, int tileY, string timestamp) → string: computes full file path with timestamped filename (tile_{z}_{x}_{y}_{ts}.jpg)
ProcessingConfig
MaxConcurrentDownloads(int, default: 4): semaphore limit for parallel tile downloadsMaxConcurrentRegions(int, default: 3): parallel region processing workersDefaultZoomLevel(int, default: 20): fallback zoom levelQueueCapacity(int, default: 100): bounded channel capacity for region request queueDelayBetweenRequestsMs(int, default: 50): throttle delay between Google Maps requestsSessionTokenReuseCount(int, default: 100): tiles per session token before rotation
DatabaseConfig
ConnectionString(string): DB connection string (unused — connection string is resolved directly fromIConfigurationinProgram.cs)
UavQualityConfig
Knobs for the 5-rule UAV tile quality gate (UavTileQualityGate) and the multipart upload envelope. Bound from the UavQuality section in appsettings.json.
MinBytes(int, default:5 * 1024= 5 KiB): lower bound for Rule 2 (SIZE_OUT_OF_BAND).MaxBytes(int, default:5 * 1024 * 1024= 5 MiB): upper bound for Rule 2; also drivesKestrelServerOptions.Limits.MaxRequestBodySize = MaxBatchSize * MaxBytesandFormOptions.MultipartBodyLengthLimitinProgram.cs.MaxAgeDays(int, default: 7): Rule 4 cutoff forCAPTURED_AT_TOO_OLD.CapturedAtFutureSkewSeconds(int, default: 30): Rule 4 forward clock-skew tolerance forCAPTURED_AT_FUTURE.MinLuminanceVariance(double, default: 10.0): Rule 5 threshold forIMAGE_TOO_UNIFORMmeasured on a downsampledL8image.MaxBatchSize(int, default: 100): hard cap on per-request batch length; violations return 400 envelope-level (see AC-8, RL-05).LuminanceSampleSize(int, default: 32): edge length of the square downsample fed into Rule 5; keeps the per-item gate cost bounded.
Internal Logic
StorageConfig.GetTileSubdirectoryPath buckets tiles by dividing X/Y coordinates by 1000, preventing filesystem performance degradation from too many files in one directory.
Dependencies
None (pure POCOs, no internal imports).
Consumers
Program.cs— binds from config sections viabuilder.Services.Configure<T>()GoogleMapsDownloaderV2— readsMapConfig,StorageConfig,ProcessingConfigviaIOptions<T>RegionService— readsStorageConfigRegionProcessingService— readsProcessingConfigRouteProcessingService— readsStorageConfigRegionRequestQueue— receivesQueueCapacityas constructor param
Data Models
No domain entities; these are configuration DTOs.
Configuration
These classes define the configuration shape consumed by all services.
| Config Class | appsettings Section |
|---|---|
| MapConfig | MapConfig |
| StorageConfig | StorageConfig |
| ProcessingConfig | ProcessingConfig |
| DatabaseConfig | (not wired — connection string read directly) |
| UavQualityConfig | UavQuality (added in AZ-488; consumed by UavTileQualityGate, UavTileUploadHandler, and Program.cs request-size limits) |
External Integrations
None.
Security
MapConfig.ApiKey holds the Google Maps API key. In production, injected via environment variable MapConfig__ApiKey.
Tests
No dedicated tests.