11"""
2- - Parses the incoming AWS event into `AwsLambdaEvent` and iterate its `records`.
3- - Delegate each record to `process_record` and collect `nhs_number` from each result .
4- - If any record has status == "error" raise `IdSyncException` with aggregated nhs_numbers .
5- - Any unexpected error is wrapped into `IdSyncException(message="Error processing id_sync event")` .
2+ - Parses the incoming AWS event into `AwsLambdaEvent` and iterates its `records`.
3+ - Delegates each record to `process_record` with per-record exception isolation .
4+ - Returns {"batchItemFailures": [...]} for any failed records so SQS only re-drives the failing messages .
5+ - A handler-level exception (bad event schema etc.) re-raises to trigger full batch retry .
66"""
77
88from typing import Any
99
1010from common .aws_lambda_event import AwsLambdaEvent
1111from common .clients import STREAM_NAME , logger
1212from common .log_decorator import logging_decorator
13- from exceptions .id_sync_exception import IdSyncException
1413from record_processor import process_record
1514
1615
@@ -25,28 +24,32 @@ def handler(event_data: dict[str, Any], _context) -> dict[str, Any]:
2524
2625 logger .info ("id_sync processing event with %d records" , len (records ))
2726
28- error_count = 0
27+ batch_item_failures = []
2928
3029 for record in records :
31- result = process_record (record )
32-
33- if result .get ("status" ) == "error" :
34- error_count += 1
35-
36- if error_count > 0 :
37- raise IdSyncException (
38- message = f"Processed { len (records )} records with { error_count } errors" ,
39- )
30+ try :
31+ result = process_record (record )
32+ if result .get ("status" ) == "error" :
33+ message_id = record .get ("messageId" )
34+ logger .error (
35+ "id_sync record processing failed for messageId: %s — %s" ,
36+ message_id ,
37+ result .get ("message" ),
38+ )
39+ batch_item_failures .append ({"itemIdentifier" : message_id })
40+ except Exception :
41+ message_id = record .get ("messageId" )
42+ logger .exception ("Unexpected error processing messageId: %s" , message_id )
43+ batch_item_failures .append ({"itemIdentifier" : message_id })
44+
45+ if batch_item_failures :
46+ logger .error ("id_sync completed with %d/%d failures" , len (batch_item_failures ), len (records ))
47+ return {"batchItemFailures" : batch_item_failures }
4048
4149 response = {"status" : "success" , "message" : f"Successfully processed { len (records )} records" }
42-
4350 logger .info ("id_sync handler completed: %s" , response )
4451 return response
4552
46- except IdSyncException as e :
47- logger .exception (f"id_sync error: { e .message } " )
48- raise
4953 except Exception :
50- msg = "Error processing id_sync event"
51- logger .exception (msg )
52- raise IdSyncException (message = msg )
54+ logger .exception ("Unexpected error processing id_sync event" )
55+ raise
0 commit comments