"""Lambda generate_json function module.""" from typing import Any from uuid import UUID from common.connectors import ows_product_staging_obo, s3 from common.schemas.s3_event import S3Event from common.schemas.s3_reference import S3Reference from pydantic import ValidationError from src.schemas.generate_json_result import GenerateJsonResult def handle( *, bulk_session_id: UUID, bulk_session_metadata_file_id: UUID, filename: str, is_classical: bool, identity_uuid: str, ) -> GenerateJsonResult: """ The main handler function, executed by local dev as well as by Lambda function running inside Docker. Args: metadata_reference: S3Reference bucket/key for the metadata file to generate JSON for. bulk_session_id filename is_classical Returns: GenerateJsonResult object containing details about generating JSON. Raises: ValidationError: if the attributes do not conform to the GenerateJsonResult schema. """ ows_product_staging_obo.update_metadata_status( bulk_session_id, "generating_report", impersonated_identity_uuid=identity_uuid ) metadata_file = ows_product_staging_obo.finalize_metadata_file( bulk_session_id=bulk_session_id, bulk_session_metadata_file_id=bulk_session_metadata_file_id, is_classical=is_classical, impersonated_identity_uuid=identity_uuid, ) result = GenerateJsonResult.model_validate( { "is_valid": True, "metadata_file": metadata_file, } ) ows_product_staging_obo.update_with_success( bulk_session_id, success_file=metadata_file.s3_filename, impersonated_identity_uuid=identity_uuid, ) return result def handler(event: dict[str, Any], context: Any) -> dict[str, Any]: """ Lambda entry point. Args: event: Lambda event payload (should look like event.shadow.json) context: Lambda context. """ s3_reference: S3Reference = S3Event(**event).to_reference() if not s3.object_exists(s3_reference): return GenerateJsonResult.model_validate({"is_valid": False}).model_dump() metadata = s3.get_object_metadata(s3_reference) bulk_session_id = UUID(metadata["bulk_session_id"]) identity_uuid = metadata.get("identity_uuid", None) assert identity_uuid try: return handle( bulk_session_id=bulk_session_id, bulk_session_metadata_file_id=UUID( metadata["bulk_session_metadata_file_id"] ), identity_uuid=identity_uuid, filename=s3_reference.key, is_classical=event.get("validation", {}).get("is_classical", False), ).model_dump(mode="json") except ValidationError: ows_product_staging_obo.update_metadata_status( bulk_session_id, "failure", impersonated_identity_uuid=identity_uuid ) return GenerateJsonResult.model_validate({"is_valid": False}).model_dump()