196 lines
5.6 KiB
Markdown
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 |