diff --git a/lambdas/handlers/bulk_upload_metadata_processor_handler.py b/lambdas/handlers/bulk_upload_metadata_processor_handler.py index 39891f36e..64b7759ad 100644 --- a/lambdas/handlers/bulk_upload_metadata_processor_handler.py +++ b/lambdas/handlers/bulk_upload_metadata_processor_handler.py @@ -1,3 +1,5 @@ +import urllib.parse + from enums.lloyd_george_pre_process_format import LloydGeorgePreProcessFormat from services.bulk_upload.metadata_general_preprocessor import ( MetadataGeneralPreprocessor, @@ -13,6 +15,7 @@ from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions from utils.decorators.override_error_check import override_error_check from utils.decorators.set_audit_arg import set_request_context_for_logging +from utils.exceptions import BulkUploadMetadataException logger = LoggingService(__name__) @@ -24,6 +27,11 @@ ) @handle_lambda_exceptions def lambda_handler(event, _context): + if "source" in event and event.get("source") == "aws.s3": + logger.info("Handling EventBridge event from S3") + handle_expedite_event(event) + return + practice_directory = event.get("practiceDirectory", "") raw_pre_format_type = event.get( "preFormatType", LloydGeorgePreProcessFormat.GENERAL @@ -63,3 +71,20 @@ def get_formatter_service(raw_pre_format_type): f"Invalid preFormatType: '{raw_pre_format_type}', defaulting to {LloydGeorgePreProcessFormat.GENERAL}." ) return MetadataGeneralPreprocessor + + +def handle_expedite_event(event): + try: + key_string = event["detail"]["object"]["key"] + key = urllib.parse.unquote_plus(key_string, encoding="utf-8") + if key.startswith("expedite/"): + logger.info("Processing file from expedite folder") + return # To be added upon by ticket PRMP-540 + else: + failure_msg = f"Unexpected directory or file location received from EventBridge: {key_string}" + logger.error(failure_msg) + raise BulkUploadMetadataException(failure_msg) + except KeyError as e: + failure_msg = f"Failed due to missing key: {str(e)}" + logger.error(failure_msg) + raise BulkUploadMetadataException(failure_msg) diff --git a/lambdas/tests/unit/handlers/test_bulk_upload_metadata_processor_handler.py b/lambdas/tests/unit/handlers/test_bulk_upload_metadata_processor_handler.py index b7029f5be..d65717e5b 100644 --- a/lambdas/tests/unit/handlers/test_bulk_upload_metadata_processor_handler.py +++ b/lambdas/tests/unit/handlers/test_bulk_upload_metadata_processor_handler.py @@ -14,6 +14,17 @@ def mock_metadata_service(mocker): return mocked_instance +def eventbridge_event_with_s3_key(key: str): + return { + "source": "aws.s3", + "detail": { + "object":{ + "key": key, + }, + } + } + + def test_metadata_processor_lambda_handler_valid_event( set_env, context, mock_metadata_service ): @@ -28,3 +39,37 @@ def test_metadata_processor_lambda_handler_empty_event( lambda_handler({}, context) mock_metadata_service.process_metadata.assert_not_called() + + +def test_s3_event_with_expedite_key_processes( + set_env, context, mock_metadata_service, caplog +): + event = eventbridge_event_with_s3_key( + "expedite%2F1of1_Lloyd_George_Record_[John Michael SMITH]_[1234567890]_[15-05-1990].pdf" + ) + lambda_handler(event, context) + + assert any( + f"Handling EventBridge event from S3" + in r.message + for r in caplog.records + ) + assert any( + "Processing file from expedite folder" in r.message for r in caplog.records + ) + + +def test_s3_event_with_non_expedite_key_is_rejected( + set_env, context, mock_metadata_service, caplog +): + key_string = "uploads/1of1_Lloyd_George_Record_[John Michael SMITH]_[1234567890]_[15-05-1990].pdf" + event = eventbridge_event_with_s3_key(key_string) + + lambda_handler(event, context) + + assert any( + f"Unexpected directory or file location received from EventBridge: {key_string}" + in r.message + for r in caplog.records + ) + mock_metadata_service.process_metadata.assert_not_called()