afterhours-shift-manager/src/holiday-router/app.py

66 lines
2.1 KiB
Python
Raw Normal View History

"""Lambda handler — repoints 3CX call flow for a holiday day-shift.
A holiday is a day-only shift (08:00-17:00 ET), one HOLIDAY record per date.
At 08:00 this Lambda is invoked with ``{"action": "activate", "date": ...}`` and
at 17:00 with ``{"action": "deactivate", ...}``.
"""
import json
import logging
import os
import shared.sentry_init # noqa: F401
from shared.holiday_flow import activate, deactivate
from shared.schedule import ShiftSchedule
from shared.secrets import get_secret
from shared.three_cx_client import ThreeCXClient
logger = logging.getLogger()
logger.setLevel(logging.INFO)
def _make_client() -> ThreeCXClient:
secret_prefix = os.environ["TCX_SECRET_PREFIX"]
return ThreeCXClient(
domain=get_secret(f"{secret_prefix}domain"),
auth_mode="oauth",
client_id=get_secret(f"{secret_prefix}client-id"),
client_secret=get_secret(f"{secret_prefix}client-secret"),
)
def _activate(schedule: ShiftSchedule, date: str) -> dict:
return activate(schedule, date, client_factory=_make_client)
def _deactivate(schedule: ShiftSchedule, date: str) -> dict:
return deactivate(schedule, date, client_factory=_make_client)
def handler(event, context):
if os.environ.get("STAGE", "prod") != "prod":
logger.info("Skipping holiday router because STAGE is not prod")
return {"skipped": "non_prod"}
action = event.get("action")
date = event.get("date")
logger.info("Holiday router invoked: action=%s date=%s", action, date)
if not date:
return {"error": True, "reason": "missing_date"}
schedule = ShiftSchedule()
try:
if action == "activate":
result = _activate(schedule, date)
elif action == "deactivate":
result = _deactivate(schedule, date)
else:
return {"error": True, "reason": "unknown_action", "action": action}
except Exception:
logger.exception("Holiday router failed for action=%s date=%s", action, date)
return {"error": True, "action": action, "date": date}
logger.info("Result: %s", json.dumps(result, default=str))
return result