Files
satellite-provider/_docs/02_document/modules/dataaccess_tile_repository.md
T
Oleksandr Bezdieniezhnykh b0fffa6d42 [AZ-284] Autodev baseline + testability refactor
Phase A baseline outputs from /autodev (Steps 1-5):
- Problem & solution docs (_docs/00_problem, _docs/01_solution)
- Codebase documentation (_docs/02_document) incl. architecture,
  module-layout, glossary, system-flows, baseline compliance scan
- Test specs (blackbox, performance, resilience, security, resource,
  traceability matrix)
- Test task decomposition (_docs/02_tasks/todo): AZ-285..AZ-290
- Testability refactor (_docs/04_refactoring/01-testability-refactoring):
  - TC-01 Move DownloadedTileInfoV2 + new ExistingTileInfo to Common.DTO
  - TC-02 Replace dead ISatelliteDownloader API with real signatures
  - TC-03 GoogleMapsDownloaderV2 implements ISatelliteDownloader
  - TC-04 TileService depends on ISatelliteDownloader (mockable)
  - TC-05 DI + endpoints use ISatelliteDownloader
- Test runner scripts (scripts/run-tests.sh, run-performance-tests.sh)
- Autodev state pointer (_docs/_autodev_state.md)

Prepares the codebase for AZ-285..AZ-290 unit/integration test work.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-10 04:44:08 +03:00

2.1 KiB
Raw Blame History

Module: DataAccess/Repositories/TileRepository

Purpose

Dapper-based repository for the tiles table. Handles CRUD operations and spatial queries for satellite tile records.

Public Interface

ITileRepository (interface)

  • GetByIdAsync(Guid id) → Task<TileEntity?>
  • GetByTileCoordinatesAsync(int tileZoom, int tileX, int tileY) → Task<TileEntity?>: finds tile by slippy map coordinates, returns latest version
  • FindExistingTileAsync(double lat, double lon, double tileSizeMeters, int zoomLevel, int version) → Task<TileEntity?>: fuzzy coordinate match (tolerance: 0.0001° lat/lon, 1m tile size)
  • GetTilesByRegionAsync(double lat, double lon, double sizeMeters, int zoomLevel) → Task<IEnumerable<TileEntity>>: spatial bounding box query with expanded range to cover tile edges
  • InsertAsync(TileEntity tile) → Task<Guid>: upsert — ON CONFLICT (latitude, longitude, tile_zoom, tile_size_meters, version) DO UPDATE file_path, tile_x, tile_y, updated_at
  • UpdateAsync(TileEntity tile) → Task<int>
  • DeleteAsync(Guid id) → Task<int>

TileRepository (implementation)

Constructs a new NpgsqlConnection per method call (no connection pooling at the repository level; Npgsql pools connections internally).

Internal Logic

  • GetTilesByRegionAsync calculates a bounding box by expanding the requested region by 2 × tile size to ensure edge tiles are included. Uses meters-to-degrees approximation (111,000 m/degree latitude, adjusted for longitude).
  • InsertAsync uses an upsert pattern to handle duplicate tile downloads gracefully.
  • GetByTileCoordinatesAsync orders by version DESC and takes the latest.

Dependencies

  • NuGet: Dapper, Npgsql
  • SatelliteProvider.DataAccess.Models.TileEntity
  • Microsoft.Extensions.Logging

Consumers

  • TileService — all read/write operations
  • Program.cs (ServeTile, GetTileByLatLon handlers) — GetByTileCoordinatesAsync, InsertAsync

Data Models

Operates on TileEntity.

Configuration

Receives connection string via constructor.

External Integrations

PostgreSQL — SQL queries via Dapper + Npgsql.

Security

None.

Tests

No dedicated repository tests.