From b70619ab2d79e0672ff7f06e853779d75973e88d Mon Sep 17 00:00:00 2001 From: root Date: Fri, 24 Oct 2025 00:20:41 +0000 Subject: [PATCH] Update API step to trigger sync for specific employee with kuerzel --- .../calendar_sync_api_step.py | 54 ++++++++++++------- 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/bitbylaw/steps/advoware_cal_sync/calendar_sync_api_step.py b/bitbylaw/steps/advoware_cal_sync/calendar_sync_api_step.py index 420fcb8a..80053af7 100644 --- a/bitbylaw/steps/advoware_cal_sync/calendar_sync_api_step.py +++ b/bitbylaw/steps/advoware_cal_sync/calendar_sync_api_step.py @@ -2,15 +2,13 @@ import json import redis from config import Config -CALENDAR_SYNC_LOCK_KEY = 'calendar_sync_lock' - config = { 'type': 'api', 'name': 'Calendar Sync API Trigger', - 'description': 'API-Endpunkt zum manuellen Auslösen des Calendar Sync', + 'description': 'API-Endpunkt zum manuellen Auslösen des Calendar Sync für einen Mitarbeiter', 'path': '/advoware/calendar/sync', 'method': 'POST', - 'emits': ['calendar.sync.triggered'] + 'emits': ['calendar.sync.employee'] } async def handler(req, context): @@ -18,30 +16,49 @@ async def handler(req, context): # Konfiguration aus Request-Body body = req.get('body', {}) kuerzel = body.get('kuerzel') - full_content = body.get('full_content', True) - if not kuerzel: - context.logger.error("Calendar Sync API: kuerzel is required") return { 'status': 400, 'body': { - 'status': 'error', - 'message': 'kuerzel is required', + 'error': 'kuerzel required', + 'message': 'Bitte kuerzel im Body angeben' + } + } + + employee_lock_key = f'calendar_sync_lock_{kuerzel}' + + # Prüfe ob bereits ein Sync für diesen Mitarbeiter läuft + redis_client = redis.Redis( + host=Config.REDIS_HOST, + port=int(Config.REDIS_PORT), + db=int(Config.REDIS_DB_CALENDAR_SYNC), + socket_timeout=Config.REDIS_TIMEOUT_SECONDS + ) + + if redis_client.get(employee_lock_key): + context.logger.info(f"Calendar Sync API: Sync bereits aktiv für {kuerzel}, überspringe") + return { + 'status': 409, + 'body': { + 'status': 'conflict', + 'message': f'Calendar sync bereits aktiv für {kuerzel}', + 'kuerzel': kuerzel, 'triggered_by': 'api' } } - context.logger.info(f"Calendar Sync API called for {kuerzel}, full_content: {full_content}") + context.logger.info(f"Calendar Sync API aufgerufen für {kuerzel}") + + # Setze Lock für 30 Minuten + redis_client.set(employee_lock_key, 'api', ex=1800) + context.logger.info(f"Calendar Sync API: Lock gesetzt für {kuerzel}") - # Emit Event für den Sync mit kuerzel + # Emit Event für den Sync await context.emit({ - "topic": "calendar.sync.triggered", + "topic": "calendar.sync.employee", "data": { - "body": { - "kuerzel": kuerzel, - "full_content": full_content, - "triggered_by": "api" - } + "kuerzel": kuerzel, + "triggered_by": "api" } }) @@ -49,9 +66,8 @@ async def handler(req, context): 'status': 200, 'body': { 'status': 'triggered', - 'message': 'Calendar sync wurde ausgelöst', + 'message': f'Calendar sync wurde ausgelöst für {kuerzel}', 'kuerzel': kuerzel, - 'full_content': full_content, 'triggered_by': 'api' } }