Skip to content

Commit bc9f4bc

Browse files
committed
VED-755: Refactor existing id_sync codebase
1 parent 2f9d5e4 commit bc9f4bc

File tree

3 files changed

+23
-23
lines changed

3 files changed

+23
-23
lines changed

lambdas/id_sync/src/id_sync.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ def handler(event_data: Dict[str, Any], _context) -> Dict[str, Any]:
2626

2727
logger.info("id_sync processing event with %d records", len(records))
2828

29-
# Process records in order. Let any unexpected exception bubble to the outer handler
30-
# so tests that expect a wrapped IdSyncException keep working.
3129
results = [process_record(record) for record in records]
3230
nhs_numbers = [result["nhs_number"] for result in results]
3331
error_count = sum(1 for result in results if result.get("status") == "error")
@@ -36,9 +34,11 @@ def handler(event_data: Dict[str, Any], _context) -> Dict[str, Any]:
3634
raise IdSyncException(message=f"Processed {len(records)} records with {error_count} errors",
3735
nhs_numbers=nhs_numbers)
3836

39-
response = {"status": "success",
40-
"message": f"Successfully processed {len(records)} records",
41-
"nhs_numbers": nhs_numbers}
37+
response = {
38+
"status": "success",
39+
"message": f"Successfully processed {len(records)} records",
40+
"nhs_numbers": nhs_numbers
41+
}
4242

4343
logger.info("id_sync handler completed: %s", response)
4444
return response

lambdas/id_sync/src/pds_details.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
safe_tmp_dir = tempfile.mkdtemp(dir="/tmp") # NOSONAR
1414

1515

16+
# Get Patient details from external service PDS using NHS number from MNS notification
1617
def pds_get_patient_details(nhs_number: str) -> dict:
1718
try:
1819
logger.info(f"get patient details. nhs_number: {nhs_number}")
@@ -34,6 +35,7 @@ def pds_get_patient_details(nhs_number: str) -> dict:
3435
raise IdSyncException(message=msg, exception=e)
3536

3637

38+
# Extract Patient identifier value from PDS patient details
3739
def pds_get_patient_id(nhs_number: str) -> str:
3840
"""
3941
Get PDS patient ID from NHS number.
Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
1-
'''
2-
record Processor
3-
'''
41
from common.clients import logger
5-
from typing import Optional
2+
from typing import Dict, Any
63
from pds_details import pds_get_patient_id
74
from ieds_db_operations import ieds_check_exist, ieds_update_patient_id
85
import json
96
import 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

Comments
 (0)