Skip to content

feat(migration): durable batch import engine foundation (TEL-67) - #297

Merged
telivity-otaip merged 5 commits into
mainfrom
cursor/migration-engine-foundation-9233
Aug 11, 2026
Merged

feat(migration): durable batch import engine foundation (TEL-67)#297
telivity-otaip merged 5 commits into
mainfrom
cursor/migration-engine-foundation-9233

Conversation

@telivity-otaip

Copy link
Copy Markdown
Collaborator

Summary

Implements the migration engine foundation for hands-off PMS migration (Linear TEL-67).

  • Migration jobs API (/api/v1/migration/jobs): create async import jobs, poll status with per-row results, resume from checkpoint after failure
  • BullMQ queue haip-migration-steps on Redis — retries with exponential backoff, DB status rows (mirrors webhook delivery pattern)
  • Schema migration_legacy_id_map — maps project_id + entity + legacy_id → haip uuid for cross-step references
  • Import registry extended with rooms (physical rooms) and open-folio-balances (single adjustment posting, not historical replay)
  • Reservation import accepts optional legacy guest/room-type/rate-plan ids, dryRun, and idempotent dedupe via legacy id map + externalConfirmation + channelCode

API

Method Route Description
POST /api/v1/migration/jobs?propertyId= Create migration job
GET /api/v1/migration/jobs/:id?propertyId= Poll job + row results
POST /api/v1/migration/jobs/:id/resume?propertyId= Resume from checkpoint

Supported entities: guests, room-types, rate-plans, rooms, open-folio-balances, reservations.

Testing

  • 28 unit tests across migration, import, and reservation-import modules — all passing
  • pnpm db:migrate creates new tables idempotently via push-schema

Multi-tenancy

All routes require propertyId query param; all DB queries are property-scoped per CLAUDE.md.

Linear Issue: TEL-67

Open in Web Open in Cursor 

Introduce migration jobs API with BullMQ step processing, checkpoint resume,
per-row results, and migration_legacy_id_map for legacy PMS id resolution.

- New migration module: create/poll/resume jobs via /api/v1/migration/*
- BullMQ queue haip-migration-steps with retry/backoff (webhook pattern)
- Schema: migration_jobs, migration_row_results, migration_legacy_id_map
- Import registry: physical rooms + open-folio-balance (adjustment posting)
- Reservation import: legacy guest/room-type/rate-plan refs, dryRun, dedupe

Co-authored-by: telivity-otaip <telivity-otaip@users.noreply.github.com>
@telivity-otaip
telivity-otaip marked this pull request as ready for review August 11, 2026 00:57
cursoragent and others added 4 commits August 11, 2026 01:00
…ep processor

Persist checkpoint on legacy-id skip path via shared helper, and use
bracket notation for row['legacyId'] index-signature access.

Co-authored-by: telivity-otaip <telivity-otaip@users.noreply.github.com>
Combine migration job engine (TEL-67) with main's encrypted source
credential vault. Merge migration module/controller/schema exports;
renumber engine SQL migration to 0020 to avoid 0019 clash.

Co-authored-by: telivity-otaip <telivity-otaip@users.noreply.github.com>
Release smoke failed because MigrationStepProcessorService could not
resolve ReservationImportService when bootstrapping AppModule.

Co-authored-by: telivity-otaip <telivity-otaip@users.noreply.github.com>
CI Test job failed sync-test-count --check (1474/209 vs 1490/212).

Co-authored-by: telivity-otaip <telivity-otaip@users.noreply.github.com>
@telivity-otaip
telivity-otaip merged commit 1940a65 into main Aug 11, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants