Skip to content

Commit 8dd57bc

Browse files
[PRMP-730] create, post/put/base fhir doc ref services refactoring (#873)
1 parent df15512 commit 8dd57bc

23 files changed

+1144
-1404
lines changed

lambdas/handlers/create_document_reference_handler.py

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import sys
44

55
from enums.feature_flags import FeatureFlags
6+
from enums.lambda_error import LambdaError
67
from enums.logging_app_interaction import LoggingAppInteraction
8+
from models.document_reference import CreateEventModel
9+
from pydantic import ValidationError
710
from services.create_document_reference_service import CreateDocumentReferenceService
811
from services.feature_flags_service import FeatureFlagService
912
from utils.audit_logging_setup import LoggingService
@@ -12,12 +15,14 @@
1215
from utils.decorators.override_error_check import override_error_check
1316
from utils.decorators.set_audit_arg import set_request_context_for_logging
1417
from utils.decorators.validate_patient_id import validate_patient_id
15-
from utils.lambda_response import ApiGatewayResponse
16-
from utils.request_context import request_context
1718
from utils.document_reference_common_validations import (
19+
normalize_event_body_to_dict,
1820
process_event_body,
1921
validate_matching_patient_ids,
2022
)
23+
from utils.lambda_exceptions import DocumentRefException
24+
from utils.lambda_response import ApiGatewayResponse
25+
from utils.request_context import request_context
2126

2227
sys.path.append(os.path.join(os.path.dirname(__file__)))
2328

@@ -43,29 +48,36 @@
4348
def lambda_handler(event, context):
4449
request_context.app_interaction = LoggingAppInteraction.UPLOAD_RECORD.value
4550

46-
FeatureFlagService().validate_feature_flag(
47-
FeatureFlags.UPLOAD_LAMBDA_ENABLED.value
48-
)
51+
feature_flag_service = FeatureFlagService()
52+
feature_flag_service.validate_feature_flag(FeatureFlags.UPLOAD_LAMBDA_ENABLED.value)
4953

5054
logger.info("Starting document reference creation process")
51-
nhs_number_query = event["queryStringParameters"]["patientId"]
5255

53-
nhs_number_body, doc_list = process_event_body(
54-
event
55-
)
56+
normalize_event_body_to_dict(event)
57+
try:
58+
validated_event = CreateEventModel.model_validate(event)
59+
60+
nhs_number_query = validated_event.query_string_parameters["patientId"]
61+
62+
nhs_number_body, doc_list = process_event_body(validated_event)
63+
64+
validate_matching_patient_ids(nhs_number_query, nhs_number_body)
5665

57-
validate_matching_patient_ids(
58-
nhs_number_query, nhs_number_body
59-
)
66+
request_context.patient_nhs_no = nhs_number_query
6067

61-
request_context.patient_nhs_no = nhs_number_query
68+
logger.info("Processed upload documents from request")
69+
create_doc_ref_service = CreateDocumentReferenceService()
6270

63-
logger.info("Processed upload documents from request")
64-
create_doc_ref_service = CreateDocumentReferenceService()
71+
url_references = create_doc_ref_service.create_document_reference_request(
72+
nhs_number_query, doc_list
73+
)
6574

66-
url_references = create_doc_ref_service.create_document_reference_request(
67-
nhs_number_query, doc_list
68-
)
75+
except ValidationError as e:
76+
logger.error(
77+
f"Failed to parse Document Reference: {str(e)}",
78+
{"Results": "Validation failure during document reference create"},
79+
)
80+
raise DocumentRefException(400, LambdaError.DocRefNoParse)
6981

7082
return ApiGatewayResponse(
7183
200, json.dumps(url_references), "POST"
Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions
2-
from utils.decorators.override_error_check import override_error_check
3-
from services.feature_flags_service import FeatureFlagService
1+
import json
2+
43
from enums.feature_flags import FeatureFlags
4+
from enums.lambda_error import LambdaError
5+
from enums.logging_app_interaction import LoggingAppInteraction
6+
from services.feature_flags_service import FeatureFlagService
57
from services.get_document_reference_service import GetDocumentReferenceService
8+
from utils.audit_logging_setup import LoggingService
9+
from utils.decorators.ensure_env_var import ensure_environment_variables
10+
from utils.decorators.handle_lambda_exceptions import handle_lambda_exceptions
11+
from utils.decorators.override_error_check import override_error_check
12+
from utils.decorators.set_audit_arg import set_request_context_for_logging
613
from utils.decorators.validate_patient_id import validate_patient_id
7-
from utils.lambda_exceptions import FeatureFlagsException
8-
from enums.lambda_error import LambdaError
914
from utils.lambda_exceptions import GetDocumentRefException
1015
from utils.lambda_response import ApiGatewayResponse
11-
from utils.decorators.ensure_env_var import ensure_environment_variables
12-
from utils.decorators.set_audit_arg import set_request_context_for_logging
13-
from enums.logging_app_interaction import LoggingAppInteraction
14-
from utils.audit_logging_setup import LoggingService
1516
from utils.request_context import request_context
16-
import json
1717

1818
logger = LoggingService(__name__)
1919

20+
2021
@validate_patient_id
2122
@handle_lambda_exceptions
2223
@set_request_context_for_logging
@@ -36,20 +37,24 @@ def lambda_handler(event: dict[str, any], context):
3637
request_context.app_interaction = LoggingAppInteraction.VIEW_LG_RECORD.value
3738

3839
feature_flag_service = FeatureFlagService()
39-
feature_flag_service.validate_feature_flag(FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED)
40-
40+
feature_flag_service.validate_feature_flag(
41+
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_3_ENABLED
42+
)
43+
4144
logger.info("Starting document fetch by ID process")
4245

4346
try:
4447
document_id = event["pathParameters"]["id"]
4548
nhs_number = event["queryStringParameters"]["patientId"]
4649
except KeyError:
47-
raise GetDocumentRefException(400, LambdaError.DocumentReferenceMissingParameters)
48-
50+
raise GetDocumentRefException(
51+
400, LambdaError.DocumentReferenceMissingParameters
52+
)
53+
4954
service = GetDocumentReferenceService()
5055

5156
document_info = service.get_document_url_by_id(document_id, nhs_number)
5257

5358
return ApiGatewayResponse(
5459
status_code=200, body=json.dumps(document_info), methods="GET"
55-
).create_api_gateway_response()
60+
).create_api_gateway_response()

lambdas/handlers/update_document_reference_handler.py

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import json
22

3-
from pydantic import ValidationError
4-
53
from enums.feature_flags import FeatureFlags
64
from enums.lambda_error import LambdaError
75
from enums.logging_app_interaction import LoggingAppInteraction
86
from models.document_reference import UpdateEventModel
7+
from pydantic import ValidationError
98
from services.feature_flags_service import FeatureFlagService
109
from services.update_document_reference_service import UpdateDocumentReferenceService
1110
from utils.audit_logging_setup import LoggingService
@@ -17,7 +16,7 @@
1716
from utils.document_reference_common_validations import (
1817
normalize_event_body_to_dict,
1918
process_event_body,
20-
validate_matching_patient_ids
19+
validate_matching_patient_ids,
2120
)
2221
from utils.lambda_exceptions import DocumentRefException
2322
from utils.lambda_response import ApiGatewayResponse
@@ -46,32 +45,26 @@ def lambda_handler(event, context):
4645
request_context.app_interaction = LoggingAppInteraction.UPDATE_RECORD.value
4746

4847
feature_flag_service = FeatureFlagService()
49-
feature_flag_service.validate_feature_flag(
50-
FeatureFlags.UPLOAD_LAMBDA_ENABLED.value
51-
)
48+
feature_flag_service.validate_feature_flag(FeatureFlags.UPLOAD_LAMBDA_ENABLED.value)
5249

5350
feature_flag_service.validate_feature_flag(
5451
FeatureFlags.UPLOAD_DOCUMENT_ITERATION_2_ENABLED.value
5552
)
5653

5754
logger.info("Starting document reference update process")
5855

59-
event_dict = normalize_event_body_to_dict(event)
56+
normalize_event_body_to_dict(event)
6057

6158
try:
62-
validated_event = UpdateEventModel.model_validate(event_dict)
63-
59+
validated_event = UpdateEventModel.model_validate(event)
60+
6461
nhs_number_query = validated_event.query_string_parameters["patientId"]
6562
doc_ref_id = validated_event.path_parameters["id"]
6663

67-
nhs_number_body, document = process_event_body(
68-
validated_event.model_dump()
69-
)
64+
nhs_number_body, document = process_event_body(validated_event)
65+
66+
validate_matching_patient_ids(nhs_number_query, nhs_number_body)
7067

71-
validate_matching_patient_ids(
72-
nhs_number_query, nhs_number_body
73-
)
74-
7568
request_context.patient_nhs_no = nhs_number_query
7669

7770
logger.info("Processed update documents from request")
@@ -86,9 +79,7 @@ def lambda_handler(event, context):
8679
f"Failed to parse Document Reference: {str(e)}",
8780
{"Results": "Validation failure during document reference update"},
8881
)
89-
raise DocumentRefException(
90-
400, LambdaError.DocRefNoParse
91-
)
82+
raise DocumentRefException(400, LambdaError.DocRefNoParse)
9283

9384
return ApiGatewayResponse(
9485
200, json.dumps(url_responses), "PUT"

lambdas/models/document_reference.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,21 @@ class Subject(BaseModel):
4545
identifier: Identifier
4646

4747

48-
class UpdateBody(BaseModel):
48+
class DocumentReferenceBody(BaseModel):
4949
model_config = ConfigDict(validate_by_alias=True, alias_generator=to_camel)
5050
resource_type: str
5151
subject: Subject
52-
content: list[SingleAttachment]
5352
created: str
5453

5554

55+
class UpdateDocumentReferenceBody(DocumentReferenceBody):
56+
content: list[SingleAttachment]
57+
58+
59+
class CreateDocumentReferenceBody(DocumentReferenceBody):
60+
content: list[Attachment]
61+
62+
5663
class GenericEventModel(BaseModel):
5764
model_config = ConfigDict(
5865
validate_by_alias=True,
@@ -62,11 +69,15 @@ class GenericEventModel(BaseModel):
6269
)
6370
http_method: str
6471
query_string_parameters: dict
65-
path_parameters: dict
72+
path_parameters: dict | None = None
6673

6774

6875
class UpdateEventModel(GenericEventModel):
69-
body: UpdateBody
76+
body: UpdateDocumentReferenceBody
77+
78+
79+
class CreateEventModel(GenericEventModel):
80+
body: CreateDocumentReferenceBody
7081

7182

7283
class UploadDocumentReference(BaseModel):

lambdas/models/fhir/R4/fhir_document_reference.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
)
1414
from pydantic import BaseModel, Field
1515
from utils.exceptions import FhirDocumentReferenceException
16-
1716
from utils.ods_utils import PCSE_ODS_CODE
1817

1918
# Constants
@@ -134,8 +133,7 @@ def extract_nhs_number_from_fhir(self) -> str:
134133
if (
135134
self.subject
136135
and self.subject.identifier
137-
and self.subject.identifier.system
138-
== "https://fhir.nhs.uk/Id/nhs-number"
136+
and self.subject.identifier.system == "https://fhir.nhs.uk/Id/nhs-number"
139137
):
140138
return self.subject.identifier.value
141139
else:
@@ -267,10 +265,12 @@ def create_fhir_document_reference_object(
267265
"ods-organization-code", document.custodian or self.custodian
268266
)
269267
),
270-
meta=Meta(versionId=document.version)
268+
meta=Meta(versionId=document.version),
271269
)
272270

273-
def create_fhir_document_reference_object_basic(self, original_id: str, original_version) -> DocumentReference:
271+
def create_fhir_document_reference_object_basic(
272+
self, original_id: str, original_version
273+
) -> DocumentReference:
274274
return DocumentReference(
275275
resourceType="DocumentReference",
276276
id=f"{original_id}",
@@ -286,5 +286,5 @@ def create_fhir_document_reference_object_basic(self, original_id: str, original
286286
)
287287
)
288288
],
289-
meta=Meta(versionId=original_version)
290-
)
289+
meta=Meta(versionId=original_version),
290+
)

0 commit comments

Comments
 (0)