1- '''
2- record Processor
3- '''
41from common .clients import logger
5- from typing import Optional
2+ from typing import Dict , Any
63from pds_details import pds_get_patient_id
74from ieds_db_operations import ieds_check_exist , ieds_update_patient_id
85import json
96import ast
107
118
12- def process_record (event_record ):
9+ def process_record (event_record ) -> Dict [ str , Any ] :
1310
1411 logger .info ("process_record. Processing record: %s" , event_record )
1512 body_text = event_record .get ('body' , '' )
16- # convert body to json
1713 if isinstance (body_text , str ):
1814 try :
19- # Try JSON first
2015 body = json .loads (body_text )
2116 except json .JSONDecodeError :
2217 try :
23- # Fall back to Python dict syntax
2418 body = ast .literal_eval (body_text )
2519 except (ValueError , SyntaxError ):
2620 logger .error ("Failed to parse body: %s" , body_text )
@@ -30,26 +24,25 @@ def process_record(event_record):
3024 nhs_number = body .get ("subject" )
3125 logger .info ("process record NHS number: %s" , nhs_number )
3226 if nhs_number :
27+ if not _is_valid_nhs (nhs_number ):
28+ logger .error ("Invalid NHS number format: %s" , nhs_number )
29+ return {"status" : "error" , "message" : "Invalid NHS number format" , "nhs_number" : nhs_number }
3330 return process_nhs_number (nhs_number )
3431 else :
3532 logger .info ("No NHS number found in event record" )
3633 return {"status" : "error" , "message" : "No NHS number found in event record" }
3734
3835
39- def process_nhs_number (nhs_number : str ) -> Optional [str ]:
36+ def process_nhs_number (nhs_number : str ) -> Dict [str , Any ]:
4037 # get patient details from PDS
41- logger .info (f"process_nhs_number. Processing NHS number: { nhs_number } " )
42- patient_details_id = pds_get_patient_id (nhs_number )
38+ new_nhs_number = pds_get_patient_id (nhs_number )
4339
4440 base_log_data = {"nhs_number" : nhs_number }
45- if patient_details_id :
46- logger .info (f"process_nhs_number. Patient details ID: { patient_details_id } " )
47- # if patient NHS != id, update patient index of vax events to new number
48- if patient_details_id != nhs_number and patient_details_id :
49- logger .info (f"process_nhs_number. Update patient ID from { nhs_number } to { patient_details_id } " )
41+ if new_nhs_number :
42+ if new_nhs_number != nhs_number :
43+ logger .info ("process_nhs_number. Update patient ID from %s to %s" , nhs_number , new_nhs_number )
5044 if ieds_check_exist (nhs_number ):
51- logger .info ("process_nhs_number. IEDS record found, updating patient ID" )
52- response = ieds_update_patient_id (nhs_number , patient_details_id )
45+ response = ieds_update_patient_id (nhs_number , new_nhs_number )
5346 else :
5447 logger .info ("process_nhs_number. No ieds record found for: %s" , nhs_number )
5548 response = {"status" : "success" , "message" : f"No records returned for ID: { nhs_number } " }
@@ -59,3 +52,8 @@ def process_nhs_number(nhs_number: str) -> Optional[str]:
5952 response = {"status" : "success" , "message" : f"No patient ID found for NHS number: { nhs_number } " }
6053 response .update (base_log_data )
6154 return response
55+
56+
57+ def _is_valid_nhs (nhs : str ) -> bool :
58+ """Basic validation: NHS number must be 10 digits. (Optional: add MOD11 check later)"""
59+ return isinstance (nhs , str ) and nhs .isdigit () and len (nhs ) == 10
0 commit comments