Files
motia/bitbylaw/steps/vmh/README.md

196 lines
5.6 KiB
Markdown

# VMH Webhook & Sync Steps
> **📚 Vollständige Sync-Dokumentation**: [../../docs/SYNC_OVERVIEW.md](../../docs/SYNC_OVERVIEW.md)
Dieser Ordner enthält die Webhook-Receiver für EspoCRM und den Event-basierten Synchronisations-Handler für Beteiligte-Entitäten.
## Übersicht
Die VMH-Steps implementieren eine vollständige Webhook-Pipeline:
1. **Webhook Receiver** empfangen Events von EspoCRM
2. **Redis Deduplication** verhindert Mehrfachverarbeitung
3. **Event Emission** triggert die Synchronisation
4. **Sync Handler** verarbeitet die Änderungen (✅ **Production Ready**)
## Webhook Receiver Steps
### 1. Create Webhook (`webhook/beteiligte_create_api_step.py`)
**Zweck:** Empfängt Create-Webhooks von EspoCRM für neue Beteiligte-Entitäten.
**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Create
- **Path:** `/vmh/webhook/beteiligte/create`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.create`
**Funktionalität:**
- Verarbeitet Batch-Payloads von EspoCRM
- Extrahiert Entity-IDs aus dem Payload
- Redis-basierte Deduplikation mit `vmh:beteiligte:create_pending`
- Emittiert Events für neue Entities
**Payload Format:**
```json
[
{
"id": "entity-123",
"name": "John Doe",
"createdAt": "2025-01-20T10:00:00Z"
}
]
```
**Response:**
```json
{
"status": "received",
"action": "create",
"new_ids_count": 1,
"total_ids_in_batch": 1
}
```
### 2. Update Webhook (`webhook/beteiligte_update_api_step.py`)
**Zweck:** Empfängt Update-Webhooks von EspoCRM für geänderte Beteiligte-Entitäten.
**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Update
- **Path:** `/vmh/webhook/beteiligte/update`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.update`
**Funktionalität:**
- Ähnlich zum Create-Webhook
- Verwendet `vmh:beteiligte:update_pending` für Deduplikation
- Emittiert `vmh.beteiligte.update` Events
### 3. Delete Webhook (`webhook/beteiligte_delete_api_step.py`)
**Zweck:** Empfängt Delete-Webhooks von EspoCRM für gelöschte Beteiligte-Entitäten.
**Konfiguration:**
- **Type:** api
- **Name:** VMH Webhook Beteiligte Delete
- **Path:** `/vmh/webhook/beteiligte/delete`
- **Method:** POST
- **Flows:** vmh
- **Emits:** `vmh.beteiligte.delete`
**Funktionalität:**
- Ähnlich zum Create-Webhook
- Verwendet `vmh:beteiligte:delete_pending` für Deduplikation
- Emittiert `vmh.beteiligte.delete` Events
## Sync Handler Step
### Event Sync Handler (`beteiligte_sync_event_step.py`)
**Zweck:** Zentraler Event-Handler für die Synchronisation von Beteiligte-Änderungen.
**Status:****Production Ready** - Vollständig implementiert
**Konfiguration:**
- **Type:** event
- **Name:** VMH Beteiligte Sync
- **Subscribes:**
- `vmh.beteiligte.create` - Neue Entities
- `vmh.beteiligte.update` - Änderungen
- `vmh.beteiligte.delete` - Löschungen
- `vmh.beteiligte.sync_check` - Cron-Checks (alle 15min)
- **Flows:** vmh
**Funktionalität:**
- ✅ Empfängt Events von allen Webhook-Receivern + Cron
- ✅ Redis Distributed Lock (verhindert Race Conditions)
- ✅ Beteiligte Sync (Stammdaten): rowId-basierte Change Detection
- ✅ Kommunikation Sync (Phone/Email/Fax): Hash-basierte Change Detection
- ✅ Konflikt-Handling: EspoCRM wins mit Notification
- ✅ Retry-Logic: Exponential Backoff (1min, 5min, 15min, 1h, 4h)
- ✅ Auto-Reset nach 24h bei permanently_failed
**Dokumentation:** Siehe [../../docs/SYNC_OVERVIEW.md](../../docs/SYNC_OVERVIEW.md)
## Redis Deduplication
### Queue-Struktur
- `vmh:beteiligte:create_pending` - IDs warten auf Create-Sync
- `vmh:beteiligte:update_pending` - IDs warten auf Update-Sync
- `vmh:beteiligte:delete_pending` - IDs warten auf Delete-Sync
### Deduplication Logic
1. Sammle alle Entity-IDs aus Webhook-Payload
2. Prüfe gegen bestehende Pending-Queue
3. Nur neue IDs werden zur Queue hinzugefügt und Events emittiert
4. Sync-Handler entfernt erfolgreich verarbeitete IDs
## Testing
### Webhook Simulation
```bash
# Create Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/create" \
-H "Content-Type: application/json" \
-d '[{"id": "test-123", "name": "Test Entity"}]'
# Update Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/update" \
-H "Content-Type: application/json" \
-d '[{"id": "test-123", "name": "Updated Entity"}]'
# Delete Webhook
curl -X POST "http://localhost:3000/vmh/webhook/beteiligte/delete" \
-H "Content-Type: application/json" \
-d '[{"id": "test-123"}]'
```
### Redis Monitoring
```bash
# Prüfe Pending-Queues
redis-cli SMEMBERS vmh:beteiligte:create_pending
redis-cli SMEMBERS vmh:beteiligte:update_pending
redis-cli SMEMBERS vmh:beteiligte:delete_pending
```
### Log Monitoring
```bash
motia logs | grep "VMH Webhook"
motia logs | grep "PLATZHALTER"
```
## Konfiguration
### Umgebungsvariablen
- `REDIS_HOST` - Redis Host
- `REDIS_PORT` - Redis Port
- `REDIS_DB_ADVOWARE_CACHE` - Redis Database für Caching
- `ESPOCRM_WEBHOOK_SECRET` - Webhook Secret für Authentifizierung
### Dependencies
- `config.py` - Konfigurationsmanagement
- `services/advoware.py` - Advoware API Client (für zukünftige Integration)
## Erweiterungen
### Geplante Features
- Vollständige EspoCRM-API-Integration im Sync-Handler
- Batch-Verarbeitung für große Datenmengen
- Retry-Logic für fehlgeschlagene Syncs
- Metriken und Monitoring
- Webhook-Authentifizierung mit Secrets
### Error Handling
- Detaillierte Fehlerlogs
- Graceful Handling von Redis-Verbindungsfehlern
- Payload-Validation
- Dead-Letter-Queues für fehlgeschlagene Events
### Security
- Webhook-Secret Validation
- Input-Sanitization
- Rate-Limiting für Webhook-Endpunkte