- Implemented calendar_sync_utils.py for shared utility functions including DB connection, Google Calendar service initialization, Redis client setup, and employee sync operations. - Created beteiligte_sync_cron_step.py to handle periodic sync of Beteiligte entities, checking for new, modified, failed, and stale records, and emitting sync events accordingly.
9.6 KiB
Motia Migration Status
🎉 MIGRATION 100% KOMPLETT
📋 Detaillierte Analyse: MIGRATION_COMPLETE_ANALYSIS.md
Quick Stats
- ✅ 21 von 21 Steps migriert (100%)
- ✅ 11 von 11 Service-Module migriert (100%)
- ✅ ~9.000 Zeilen Code migriert (100%)
- ✅ 14 HTTP Endpoints aktiv
- ✅ 9 Queue Events konfiguriert
- ✅ 2 Cron Jobs (VMH: alle 15 Min., Calendar: alle 15 Min.)
Overview
Migrating from old-motia v0.17 (Node.js + Python hybrid) to Motia III v1.0-RC (pure Python).
Old System Analysis
Location
- Old system:
/opt/motia-iii/old-motia/ - Old project dir:
/opt/motia-iii/old-motia/bitbylaw/
Steps Found in Old System
Root Steps (/opt/motia-iii/old-motia/steps/)
crm-bbl-vmh-reset-nextcall_step.pyevent_step.pyhello_step.py
BitByLaw Steps (/opt/motia-iii/old-motia/bitbylaw/steps/)
Advoware Calendar Sync (advoware_cal_sync/):
calendar_sync_all_step.pycalendar_sync_api_step.pycalendar_sync_cron_step.pycalendar_sync_event_step.pyaudit_calendar_sync.pycalendar_sync_utils.py(utility module)
Advoware Proxy (advoware_proxy/):
advoware_api_proxy_get_step.pyadvoware_api_proxy_post_step.pyadvoware_api_proxy_put_step.pyadvoware_api_proxy_delete_step.py
VMH Integration (vmh/):
beteiligte_sync_cron_step.pybeteiligte_sync_event_step.pybankverbindungen_sync_event_step.pywebhook/bankverbindungen_create_api_step.pywebhook/bankverbindungen_update_api_step.pywebhook/bankverbindungen_delete_api_step.pywebhook/beteiligte_create_api_step.pywebhook/beteiligte_update_api_step.pywebhook/beteiligte_delete_api_step.py
Supporting Services/Modules
From /opt/motia-iii/old-motia/bitbylaw/:
services/advoware.py- Advoware API wrapperconfig.py- Configuration module- Dependencies: PostgreSQL, Redis, Google Calendar API
Migration Changes Required
Key Structural Changes
1. Config Format
# OLD
config = {
"type": "api", # or "event", "cron"
"name": "StepName",
"path": "/endpoint",
"method": "GET",
"cron": "0 5 * * *",
"subscribes": ["topic"],
"emits": ["other-topic"]
}
# NEW
from motia import http, queue, cron
config = {
"name": "StepName",
"flows": ["flow-name"],
"triggers": [
http("GET", "/endpoint")
# or queue("topic", input=schema)
# or cron("0 0 5 * * *") # 6-field!
],
"enqueues": ["other-topic"]
}
2. Handler Signature
# OLD - API
async def handler(req, context):
body = req.get('body', {})
await context.emit({"topic": "x", "data": {...}})
return {"status": 200, "body": {...}}
# NEW - API
from motia import ApiRequest, ApiResponse, FlowContext
async def handler(request: ApiRequest, ctx: FlowContext) -> ApiResponse:
body = request.body
await ctx.enqueue({"topic": "x", "data": {...}})
return ApiResponse(status=200, body={...})
# OLD - Event/Queue
async def handler(data, context):
context.logger.info(data['field'])
# NEW - Queue
async def handler(input_data: dict, ctx: FlowContext):
ctx.logger.info(input_data['field'])
# OLD - Cron
async def handler(context):
context.logger.info("Running")
# NEW - Cron
async def handler(input_data: dict, ctx: FlowContext):
ctx.logger.info("Running")
3. Method Changes
context.emit()→ctx.enqueue()req.get('body')→request.bodyreq.get('queryParams')→request.query_paramsreq.get('pathParams')→request.path_paramsreq.get('headers')→request.headers- Return dict →
ApiResponseobject
4. Cron Format
- OLD: 5-field
"0 5 * * *"(minute hour day month weekday) - NEW: 6-field
"0 0 5 * * *"(second minute hour day month weekday)
Migration Strategy
Phase 1: Simple Steps (Priority)
Start with simple API proxy steps as they're straightforward:
- ✅ Example ticketing steps (already in new system)
- ⏳ Advoware proxy steps (GET, POST, PUT, DELETE)
- ⏳ Simple webhook handlers
Phase 2: Complex Integration Steps
Steps with external dependencies: 4. ⏳ VMH sync steps (beteiligte, bankverbindungen) 5. ⏳ Calendar sync steps (most complex - Google Calendar + Redis + PostgreSQL)
Phase 3: Supporting Infrastructure
- Migrate
services/modules (advoware.py wrapper) - Migrate
config.pyto use environment variables properly - Update dependencies in
pyproject.toml
Dependencies to Review
From old requirements.txt and code analysis:
asyncpg- PostgreSQL async driverredis- Redis clientgoogle-api-python-client- Google Calendar APIgoogle-auth- Google OAuth2backoff- Retry/backoff decoratorpytz- Timezone handlingpydantic- Already in new systemrequests/aiohttp- HTTP clients for Advoware API
Migration Roadmap
✅ COMPLETED
| Phase | Module | Lines | Status |
|---|---|---|---|
| 1 | Advoware Proxy (GET, POST, PUT, DELETE) | ~400 | ✅ Complete |
| 1 | advoware.py, advoware_service.py |
~800 | ✅ Complete |
| 2 | VMH Webhook Steps (6 endpoints) | ~900 | ✅ Complete |
| 2 | espocrm.py, espocrm_mapper.py |
~900 | ✅ Complete |
| 2 | bankverbindungen_mapper.py, beteiligte_sync_utils.py, notification_utils.py |
~1200 | ✅ Complete |
| 3 | VMH Sync Event Steps (2 handlers + 1 cron) | ~1000 | ✅ Complete |
| 4 | Kommunikation Sync (kommunikation_mapper.py, kommunikation_sync_utils.py) |
~1333 | ✅ Complete |
| 5 | Adressen Sync (adressen_mapper.py, adressen_sync.py) |
~964 | ✅ Complete |
| 6 | Google Calendar Sync (calendar_sync_*.py, calendar_sync_utils.py) |
~1500 | ✅ Complete |
Total migrated: ~9.000 lines of production code
✅ Phase 6 COMPLETED: Google Calendar Sync
Advoware Calendar Sync - Google Calendar ↔ Advoware Sync:
- ✅
calendar_sync_cron_step.py- Cron-Trigger (alle 15 Min.) - ✅
calendar_sync_all_step.py- Bulk-Sync Handler mit Redis-basierter Priorisierung - ✅
calendar_sync_event_step.py- Queue-Event Handler (1053 Zeilen komplexe Sync-Logik!) - ✅
calendar_sync_api_step.py- HTTP API für manuellen Trigger - ✅
calendar_sync_utils.py- Hilfs-Funktionen (DB, Google Service, Redis, Logging)
Dependencies:
- ✅
google-api-python-client- Google Calendar API - ✅
google-auth- Google OAuth2 - ✅
asyncpg- PostgreSQL async driver - ✅
backoff- Retry/backoff decorator
Features:
- ✅ Bidirektionale Synchronisation (Google ↔ Advoware)
- ✅ 4-Phase Sync-Algorithmus (New Adv→Google, New Google→Adv, Deletes, Updates)
- ✅ PostgreSQL als Sync-State Hub (calendar_sync Tabelle)
- ✅ Redis-basiertes Rate Limiting (Token Bucket für Google API)
- ✅ Distributed Locking per Employee
- ✅ Automatische Calendar-Creation mit ACL
- ✅ Recurring Events Support (RRULE)
- ✅ Timezone-Handling (Europe/Berlin)
- ✅ Backoff-Retry für API-Fehler
- ✅ Write-Protection für Advoware
- ✅ Source-System-Wins & Last-Change-Wins Strategien
⏳ REMAINING
Keine! Die Migration ist zu 100% abgeschlossen.
Completed
- ✅ Analysis of old system structure
- ✅ MIGRATION_GUIDE.md reviewed
- ✅ Migration patterns documented
- ✅ New system has example ticketing steps
- ✅ Phase 1: Advoware Proxy Steps migrated (GET, POST, PUT, DELETE)
- ✅ Advoware API service module migrated (services/advoware.py)
- ✅ Phase 2: VMH Integration - Webhook Steps migrated (6 endpoints)
- ✅ EspoCRM API service module migrated (services/espocrm.py)
- ✅ All endpoints registered and running:
- Advoware Proxy:
- `GET /advoware/proxy6 Complete ✅
- Advoware Proxy:
🎉 ALLE PHASEN ABGESCHLOSSEN! 100% MIGRATION ERFOLGREICH!
Phase 6 - Google Calendar Sync:
- ✅
calendar_sync_cron_step.py(Cron-Trigger alle 15 Min.) - ✅
calendar_sync_all_step.py(Bulk-Handler mit Redis-Priorisierung) - ✅
calendar_sync_event_step.py(1053 Zeilen - 4-Phase Sync-Algorithmus) - ✅
calendar_sync_api_step.py(HTTP API für manuelle Triggers) - ✅
calendar_sync_utils.py(DB, Google Service, Redis Client)
Sync-Architektur komplett:
- Advoware Proxy (Phase 1) → HTTP API für Advoware-Zugriff
- Webhooks (Phase 2) → Emittieren Queue-Events
- Event Handler (Phase 3) → Verarbeiten Events mit Stammdaten-Sync
- Kommunikation Sync (Phase 4) → Bidirektionale Email/Phone-Synchronisation
- Adressen Sync (Phase 5) → Bidirektionale Adressen-Synchronisation
- Calendar Sync (Phase 6) → Google Calendar ↔ Advoware Bidirektional
- Cron Jobs (Phase 3 & 6) → Regelmäßige Sync-Checks & Auto-Retries
Die vollständige Synchronisations- und Integrations-Pipeline ist nun zu 100% Phase 5 - Adressen Sync:
- ✅
adressen_mapper.py(267 Zeilen - CAdressen ↔ Advoware Adressen) - ✅
adressen_sync.py(697 Zeilen - CREATE/UPDATE mit READ-ONLY Detection)
Sync-Architektur komplett:
- Webhooks (Phase 2) → Emittieren Queue-Events
- Event Handler (Phase 3) → Verarbeiten Events mit Stammdaten-Sync
- Kommunikation Sync (Phase 4) → Bidirektionale Email/Phone-Synchronisation
- Adressen Sync (Phase 5) → Bidirektionale Adressen-Synchronisation
- Cron Job (Phase 3) → Regelmäßige Sync-Checks & Auto-Retries
Die vollständige Synchronisations-Pipeline ist nun einsatzbereit!
Notes
- Old system was Node.js + Python hybrid (Python steps as child processes)
- New system is pure Python (standalone SDK)
- No need for Node.js/npm anymore
- iii engine handles all infrastructure (queues, state, HTTP, cron)
- Console replaced Workbench