"""Lambda validate_asset function module.""" from typing import Any from uuid import UUID from common.connectors import ows_product_staging_obo, s3 from common.schemas.bulk_session_asset import FileStatus from common.schemas.bulk_session_asset_update import BulkSessionAssetUpdate from common.schemas.s3_event import S3Event from common.schemas.s3_reference import S3Reference from pydantic import ValidationError from src.schemas.asset_validation_result import AssetValidationResult def handle( *, s3_reference: S3Reference, bulk_session_id: UUID, identity_uuid: UUID ) -> AssetValidationResult: """ The main handler function, executed by local dev as well as by Lambda function running inside Docker. Args: s3_reference: S3Reference an object containing information about the key and bucket of the s3 asset Returns: AssetValidationResult object containing details about the asset Raises: ValidationError: if the attributes do not conform to the AssetValidationResult schema. """ asset = ows_product_staging_obo.update_bulk_session_asset( BulkSessionAssetUpdate( bulk_session_id=bulk_session_id, s3_filename=s3_reference.key, file_status=FileStatus.validating, ), impersonated_identity_uuid=str(identity_uuid), ) asset_type = asset.file_type if not asset_type: return AssetValidationResult.model_validate({"is_valid": False}) return AssetValidationResult.model_validate( {"is_valid": True, "asset_type": asset_type} ) 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. """ try: s3_reference: S3Reference = S3Event(**event).to_reference() if not s3.object_exists(s3_reference): return AssetValidationResult.model_validate( {"is_valid": False} ).model_dump() metadata = s3.get_object_metadata(s3_reference) bulk_session_id = metadata.get("bulk_session_id", None) identity_uuid = metadata.get("identity_uuid", None) assert bulk_session_id assert identity_uuid return handle( s3_reference=s3_reference, bulk_session_id=UUID(bulk_session_id), identity_uuid=UUID(identity_uuid), ).model_dump() except ValidationError: return AssetValidationResult.model_validate({"is_valid": False}).model_dump()