Merge pull request #1 from Sea-Haven-Industries/feature/dynamodb-shift-integration

Add DynamoDB integration for Slack shift manager
This commit is contained in:
Adam Moussa 2026-04-03 18:31:28 -04:00 • committed by GitHub
commit 9143c93386
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 66 additions and 4 deletions

View file

@ -41,21 +41,73 @@ def get_3cx_credentials() -> dict:
return creds
def check_dynamodb_override(date_str: str, day_name: str) -> str | None:
"""Check the afterhours-shifts DynamoDB table for a Slack-driven override.
Returns the extension if an override exists, None otherwise.
Only active when SHIFT_TABLE env var is set.
"""
table_name = os.environ.get("SHIFT_TABLE")
if not table_name:
return None
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table(table_name)
# Check date-specific override first
resp = table.get_item(Key={"PK": "OVERRIDE", "SK": date_str})
item = resp.get("Item")
if item:
ext = item["extension"]
if ext == "OPEN":
# Open shift with no pickup — use fallback from DynamoDB config or default 100
config_resp = table.get_item(Key={"PK": "CONFIG", "SK": "CONFIG"})
fallback = config_resp.get("Item", {}).get("fallback_extension", "100")
logger.info("DynamoDB override for %s: OPEN — using fallback Ext %s", date_str, fallback)
return fallback
logger.info("DynamoDB override for %s: Ext %s", date_str, ext)
return ext
# Check DynamoDB weekly schedule (takes precedence over YAML when SHIFT_TABLE is set)
resp = table.get_item(Key={"PK": "WEEKLY", "SK": day_name})
item = resp.get("Item")
if item:
ext = item["extension"]
logger.info("DynamoDB weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
return ext
return None
def resolve_extension(schedule: dict, now: datetime) -> str:
"""Determine which extension should handle after-hours calls today."""
"""Determine which extension should handle after-hours calls today.
Resolution order:
1. DynamoDB date override (Slack-driven pickup/drop)
2. DynamoDB weekly schedule (if SHIFT_TABLE is set)
3. YAML exception overrides
4. YAML weekly schedule
"""
date_str = now.strftime("%Y-%m-%d")
day_name = now.strftime("%A")
# Check DynamoDB first (Slack shift manager)
dynamo_ext = check_dynamodb_override(date_str, day_name)
if dynamo_ext is not None:
return dynamo_ext
# Fall back to YAML config
exceptions = schedule.get("exceptions") or {}
if date_str in exceptions:
ext = str(exceptions[date_str])
logger.info("Using exception override for %s: Ext %s", date_str, ext)
logger.info("Using YAML exception override for %s: Ext %s", date_str, ext)
return ext
day_name = now.strftime("%A")
weekly = schedule["weekly_schedule"]
if day_name not in weekly:
raise ValueError(f"No schedule entry for {day_name}")
ext = str(weekly[day_name])
logger.info("Using weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
logger.info("Using YAML weekly schedule for %s (%s): Ext %s", date_str, day_name, ext)
return ext

View file

@ -6,6 +6,10 @@ Parameters:
Timezone:
Type: String
Default: "America/New_York"
ShiftTableName:
Type: String
Default: "afterhours-shifts"
Description: DynamoDB table for Slack shift manager overrides
Globals:
Function:
@ -24,6 +28,7 @@ Resources:
Variables:
SSM_PREFIX: /3cx-scheduler
TZ: !Ref Timezone
SHIFT_TABLE: !Ref ShiftTableName
Policies:
- Statement:
- Effect: Allow
@ -41,6 +46,11 @@ Resources:
Condition:
StringEquals:
"kms:ViaService": !Sub "ssm.${AWS::Region}.amazonaws.com"
- Effect: Allow
Action:
- dynamodb:GetItem
Resource:
- !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${ShiftTableName}"
Events:
# EST: 8am ET = 13:00 UTC (Nov-Mar)
DailyScheduleEST: