meal-order-manager/functions/sync_roster/handler.py
Adam Moussa 440117c9a1
Fix ruff lint and format violations, update README (#5)
Apply ruff check --fix and ruff format across all Python files to
pass CI pipeline. Remove unused imports (os, sys), fix f-strings
without placeholders. Update README to reflect sync-roster Lambda,
corrected shared layer path, and current project structure.
2026-05-12 19:31:27 -04:00

63 lines
1.7 KiB
Python

import os
from shared.db import get_roster, put_roster
from shared.slack import get_channel_members, get_user_info
def lambda_handler(event, context):
channel_id = os.environ.get("SLACK_CHANNEL_ID") or __import__(
"shared.secrets", fromlist=["get_parameter"]
).get_parameter(os.environ["SLACK_CHANNEL_PARAM"])
member_ids = get_channel_members(channel_id)
if not member_ids:
return {"status": "error", "message": "No members found in channel"}
employees = []
skipped = 0
for uid in member_ids:
info = get_user_info(uid)
if not info or info.get("is_bot") or info.get("id") == "USLACKBOT":
skipped += 1
continue
profile = info.get("profile", {})
name = profile.get("real_name") or info.get("real_name", "")
email = profile.get("email", "")
if not name or not email:
skipped += 1
continue
employees.append(
{
"name": name,
"email": email,
"slack_user_id": uid,
}
)
employees.sort(key=lambda e: e["name"])
existing = get_roster()
existing_set = {(e["name"], e["email"], e["slack_user_id"]) for e in existing}
new_set = {(e["name"], e["email"], e["slack_user_id"]) for e in employees}
if existing_set == new_set:
return {
"status": "no_change",
"employee_count": len(employees),
}
put_roster(employees)
added = new_set - existing_set
removed = existing_set - new_set
return {
"status": "synced",
"employee_count": len(employees),
"added": len(added),
"removed": len(removed),
"skipped": skipped,
}