""" Uploads the latest scraped menu JSON to DynamoDB. Used by the GitHub Actions weekly workflow after scraping. """ import json import os import sys from datetime import datetime from decimal import Decimal from pathlib import Path import boto3 PROJECT_ROOT = Path(__file__).resolve().parents[1] OUTPUT_DIR = PROJECT_ROOT / "output" TABLE_NAME = os.environ.get("TABLE_NAME", "meal-order-manager-orders") def convert_floats(obj): if isinstance(obj, float): return Decimal(str(obj)) if isinstance(obj, dict): return {k: convert_floats(v) for k, v in obj.items()} if isinstance(obj, list): return [convert_floats(i) for i in obj] return obj def main(): files = sorted(OUTPUT_DIR.glob("menu-*.json"), reverse=True) if not files: print("Error: No menu JSON found. Run scrape_menu.py first.", file=sys.stderr) sys.exit(1) with open(files[0]) as f: menu = json.load(f) week = datetime.now().strftime("%Y-W%U") table = boto3.resource("dynamodb").Table(TABLE_NAME) import time item = { "PK": f"WEEK#{week}", "SK": "MENU", "form_status": "open", "scraped_at": menu.get("scraped_at"), "menu_url": menu.get("menu_url"), "meal_count": menu.get("meal_count"), "meals": convert_floats(menu.get("meals", [])), "ttl": int(time.time()) + (90 * 86400), } table.put_item(Item=item) print(f"Uploaded menu for {week} to DynamoDB ({len(menu.get('meals', []))} meals)") if __name__ == "__main__": main()