- 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.
277 lines
9.6 KiB
Markdown
277 lines
9.6 KiB
Markdown
# Motia Migration Status
|
|
|
|
**🎉 MIGRATION 100% KOMPLETT**
|
|
|
|
> 📋 Detaillierte Analyse: [MIGRATION_COMPLETE_ANALYSIS.md](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/`)
|
|
1. `crm-bbl-vmh-reset-nextcall_step.py`
|
|
2. `event_step.py`
|
|
3. `hello_step.py`
|
|
|
|
#### BitByLaw Steps (`/opt/motia-iii/old-motia/bitbylaw/steps/`)
|
|
|
|
**Advoware Calendar Sync** (`advoware_cal_sync/`):
|
|
- `calendar_sync_all_step.py`
|
|
- `calendar_sync_api_step.py`
|
|
- `calendar_sync_cron_step.py`
|
|
- `calendar_sync_event_step.py`
|
|
- `audit_calendar_sync.py`
|
|
- `calendar_sync_utils.py` (utility module)
|
|
|
|
**Advoware Proxy** (`advoware_proxy/`):
|
|
- `advoware_api_proxy_get_step.py`
|
|
- `advoware_api_proxy_post_step.py`
|
|
- `advoware_api_proxy_put_step.py`
|
|
- `advoware_api_proxy_delete_step.py`
|
|
|
|
**VMH Integration** (`vmh/`):
|
|
- `beteiligte_sync_cron_step.py`
|
|
- `beteiligte_sync_event_step.py`
|
|
- `bankverbindungen_sync_event_step.py`
|
|
- `webhook/bankverbindungen_create_api_step.py`
|
|
- `webhook/bankverbindungen_update_api_step.py`
|
|
- `webhook/bankverbindungen_delete_api_step.py`
|
|
- `webhook/beteiligte_create_api_step.py`
|
|
- `webhook/beteiligte_update_api_step.py`
|
|
- `webhook/beteiligte_delete_api_step.py`
|
|
|
|
### Supporting Services/Modules
|
|
|
|
From `/opt/motia-iii/old-motia/bitbylaw/`:
|
|
- `services/advoware.py` - Advoware API wrapper
|
|
- `config.py` - Configuration module
|
|
- Dependencies: PostgreSQL, Redis, Google Calendar API
|
|
|
|
## Migration Changes Required
|
|
|
|
### Key Structural Changes
|
|
|
|
#### 1. Config Format
|
|
```python
|
|
# 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
|
|
```python
|
|
# 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.body`
|
|
- `req.get('queryParams')` → `request.query_params`
|
|
- `req.get('pathParams')` → `request.path_params`
|
|
- `req.get('headers')` → `request.headers`
|
|
- Return dict → `ApiResponse` object
|
|
|
|
#### 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:
|
|
1. ✅ Example ticketing steps (already in new system)
|
|
2. ⏳ Advoware proxy steps (GET, POST, PUT, DELETE)
|
|
3. ⏳ 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.py` to use environment variables properly
|
|
- Update dependencies in `pyproject.toml`
|
|
|
|
### Dependencies to Review
|
|
From old `requirements.txt` and code analysis:
|
|
- `asyncpg` - PostgreSQL async driver
|
|
- `redis` - Redis client
|
|
- `google-api-python-client` - Google Calendar API
|
|
- `google-auth` - Google OAuth2
|
|
- `backoff` - Retry/backoff decorator
|
|
- `pytz` - Timezone handling
|
|
- `pydantic` - Already in new system
|
|
- `requests` / `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 ✅
|
|
|
|
**🎉 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:**
|
|
|
|
1. **Advoware Proxy** (Phase 1) → HTTP API für Advoware-Zugriff
|
|
2. **Webhooks** (Phase 2) → Emittieren Queue-Events
|
|
3. **Event Handler** (Phase 3) → Verarbeiten Events mit Stammdaten-Sync
|
|
4. **Kommunikation Sync** (Phase 4) → Bidirektionale Email/Phone-Synchronisation
|
|
5. **Adressen Sync** (Phase 5) → Bidirektionale Adressen-Synchronisation
|
|
6. **Calendar Sync** (Phase 6) → Google Calendar ↔ Advoware Bidirektional
|
|
7. **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:
|
|
|
|
1. **Webhooks** (Phase 2) → Emittieren Queue-Events
|
|
2. **Event Handler** (Phase 3) → Verarbeiten Events mit Stammdaten-Sync
|
|
3. **Kommunikation Sync** (Phase 4) → Bidirektionale Email/Phone-Synchronisation
|
|
4. **Adressen Sync** (Phase 5) → Bidirektionale Adressen-Synchronisation
|
|
5. **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
|