"""Lambda asgv-prepare-payload function module.""" import json from typing import Any, Mapping import boto3 import config from lambdacommon.common_config import logger from src.exceptions import AsgvSfnFeatureDisabledError from src.logic.feature_flag import check_asgv_sfn_enabled from src.logic.format_product import process_product from src.logic.output_s3_path import build_output_s3_path def _load_from_s3(s3_uri: str) -> dict[str, Any]: without_scheme = s3_uri.removeprefix("s3://") bucket, _, key = without_scheme.partition("/") s3 = boto3.client("s3") response = s3.get_object( Bucket=bucket, Key=key, ExpectedBucketOwner=config.EXPECTED_BUCKET_OWNER ) return json.loads(response["Body"].read()) def handler(event: Mapping[str, Any] | None, context: Any) -> dict[str, Any]: """Lambda entry point. Receives the raw GQL product payload from the sfn state and returns a cleaned, restructured version for Bedrock evaluation. Falls back to fetching product_metadata from S3 if not present inline. """ try: check_asgv_sfn_enabled() data = (event or {}).get("data") or {} product_metadata = data.get("product_metadata") if not product_metadata: s3_path = data.get("product_metadata_s3_url") if not s3_path: raise ValueError("Missing product_metadata in event") product_metadata = _load_from_s3(s3_path) review_queue_id = data.get("review_queue_id") return { "product_metadata": process_product(product_metadata), "output_s3_path": build_output_s3_path(product_metadata, review_queue_id), } except AsgvSfnFeatureDisabledError: raise except Exception as e: logger.exception(str(e)) raise e