Files
satellite-provider/_docs/02_document/modules/dataaccess_migrator.md
T
Oleksandr Bezdieniezhnykh 51b572108a
ci/woodpecker/push/01-test Pipeline was successful
ci/woodpecker/push/02-build-push Pipeline was successful
[AZ-484] Cycle 1 Steps 12-16: docs, security, perf, deploy report
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>
2026-05-11 10:03:05 +03:00

2.4 KiB

Module: DataAccess/DatabaseMigrator

Purpose

Runs DbUp-based SQL migrations against PostgreSQL on application startup. Ensures the database schema is up to date before the API begins serving requests.

Public Interface

DatabaseMigrator

  • Constructor: DatabaseMigrator(string connectionString, ILogger<DatabaseMigrator>? logger)
  • RunMigrations() → bool: creates the database if missing (EnsureDatabase.For.PostgresqlDatabase), then runs all embedded SQL scripts matching .Migrations. from the DataAccess assembly. Returns true on success.

Internal Logic

  • Uses DbUp.DeployChanges fluent API targeting PostgreSQL
  • Scripts are embedded resources filtered by path containing .Migrations.
  • Logs to console via DbUp's built-in LogToConsole()
  • On failure, logs the error and returns false

Dependencies

  • NuGet: dbup-postgresql (6.0.3)
  • Microsoft.Extensions.Logging
  • Embedded SQL resources from SatelliteProvider.DataAccess/Migrations/

Consumers

  • Program.cs — instantiated directly (not via DI) and called during startup. If migration fails, the application throws and does not start.

Migrations (13 scripts)

  1. 001_CreateTilesTable.sql
  2. 002_CreateRegionsTable.sql
  3. 003_CreateIndexes.sql
  4. 004_AddVersionColumn.sql
  5. 005_CreateRoutesTables.sql
  6. 006_AddStitchTilesToRegions.sql
  7. 007_AddRouteMapFields.sql
  8. 008_AddGeofenceFlagToRouteRegions.sql
  9. 009_AddGeofencePolygonIndex.sql
  10. 010_AddTilesZipToRoutes.sql
  11. 011_AddTileCoordinates.sql
  12. 012_DropTileVersionConstraint.sql — drops the legacy 5-col (latitude, longitude, tile_zoom, tile_size_meters, version) unique index, replaces with 4-col idx_tiles_unique_location (preparation for AZ-484).
  13. 013_AddTileSourceAndCapturedAt.sql — AZ-484 multi-source tile storage. Transactional. Adds source (VARCHAR(32) NOT NULL DEFAULT 'google_maps') and captured_at (TIMESTAMP NOT NULL) columns; backfills existing rows with source='google_maps', captured_at=created_at; drops idx_tiles_unique_location and creates 5-col idx_tiles_unique_location_source on (latitude, longitude, tile_zoom, tile_size_meters, source). Idempotent against partial replays.

Configuration

Receives connection string directly as constructor parameter.

External Integrations

PostgreSQL — DDL operations via DbUp.

Security

None directly, but controls schema evolution.

Tests

No dedicated tests.