Skip to content

Commit 3af1d02

Browse files
Merge pull request #614 from NHSDigital/feature/made14-NRL-718-ignore-date-on-update
[NRL-718] Always preserve original date field during pointer updates
2 parents f9c01e1 + d304c5c commit 3af1d02

File tree

3 files changed

+81
-5
lines changed

3 files changed

+81
-5
lines changed

api/producer/updateDocumentReference/tests/test_update_document_reference.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,65 @@ def test_update_document_reference_with_meta_lastupdated_ignored(
683683
assert updated_doc_pointer.created_on == existing_doc_pointer.created_on
684684

685685

686+
@mock_aws
687+
@mock_repository
688+
@freeze_time("2024-03-21T12:34:56.789")
689+
def test_update_document_reference_with_invalid_date_ignored(
690+
repository: DocumentPointerRepository,
691+
):
692+
doc_ref = load_document_reference("Y05868-736253002-Valid-with-date")
693+
doc_pointer = DocumentPointer.from_document_reference(doc_ref)
694+
repository.create(doc_pointer)
695+
696+
existing_doc_pointer = repository.get_by_id("Y05868-99999-99999-999999")
697+
assert existing_doc_pointer is not None
698+
699+
existing_doc_ref = DocumentReference.parse_raw(existing_doc_pointer.document)
700+
assert existing_doc_ref.docStatus == "final"
701+
702+
doc_ref.date = "2024-05-04T11:11:10.111Z"
703+
doc_ref.docStatus = "entered-in-error"
704+
705+
event = create_test_api_gateway_event(
706+
headers=create_headers(),
707+
path_parameters={"id": "Y05868-99999-99999-999999"},
708+
body=doc_ref.json(),
709+
)
710+
711+
result = handler(event, create_mock_context())
712+
713+
body = result.pop("body")
714+
715+
assert result == {"statusCode": "200", "headers": {}, "isBase64Encoded": False}
716+
parsed_body = json.loads(body)
717+
assert parsed_body == {
718+
"resourceType": "OperationOutcome",
719+
"issue": [
720+
{
721+
"severity": "information",
722+
"code": "informational",
723+
"details": {
724+
"coding": [
725+
{
726+
"code": "RESOURCE_UPDATED",
727+
"display": "Resource updated",
728+
"system": "https://fhir.nhs.uk/ValueSet/NRL-ResponseCode",
729+
}
730+
]
731+
},
732+
"diagnostics": "The DocumentReference has been updated",
733+
}
734+
],
735+
}
736+
737+
updated_doc_pointer = repository.get_by_id("Y05868-99999-99999-999999")
738+
assert updated_doc_pointer is not None
739+
740+
updated_doc_ref = DocumentReference.parse_raw(updated_doc_pointer.document)
741+
assert updated_doc_ref.docStatus == "entered-in-error"
742+
assert updated_doc_ref.date == "2024-03-20T00:00:01.000Z"
743+
744+
686745
@mock_aws
687746
@mock_repository
688747
def test_update_document_reference_existing_invalid_json(

api/producer/updateDocumentReference/update_document_reference.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,29 @@ def handler(
9090
diagnostics="An error occurred whilst parsing the existing document reference",
9191
)
9292

93+
preserved_fields = ["date"]
94+
for field in preserved_fields:
95+
provided_field = getattr(result.resource, field, None)
96+
existing_field = getattr(existing_resource, field, None)
97+
if provided_field and provided_field != existing_field:
98+
logger.log(
99+
LogReference.PROUPDATE007,
100+
field=field,
101+
provided=provided_field,
102+
)
103+
setattr(document_reference, field, existing_field)
104+
93105
immutable_fields = [
94106
"masterIdentifier",
95107
"id",
96108
"identifier",
97109
"status",
98110
"type",
99111
"subject",
100-
"date",
101112
"custodian",
102113
"relatesTo",
103114
"author",
104115
]
105-
106116
for field in immutable_fields:
107117
if getattr(result.resource, field) != getattr(existing_resource, field):
108118
logger.log(LogReference.PROUPDATE006, field=field)
@@ -111,10 +121,13 @@ def handler(
111121
expression=field,
112122
)
113123

114-
core_model.created_on = existing_model.created_on
115-
core_model.updated_on = update_time
124+
document_pointer_update = DocumentPointer.from_document_reference(
125+
document_reference
126+
)
127+
document_pointer_update.created_on = existing_model.created_on
128+
document_pointer_update.updated_on = update_time
116129

117-
repository.update(core_model)
130+
repository.update(document_pointer_update)
118131

119132
logger.log(LogReference.PROUPDATE999)
120133
return NRLResponse.RESOURCE_UPDATED()

layer/nrlf/core/log_references.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,10 @@ class LogReference(Enum):
352352
PROUPDATE006 = _Reference(
353353
"WARN", "Cannot update DocumentReference as immutable fields have changed"
354354
)
355+
PROUPDATE007 = _Reference(
356+
"WARN",
357+
"Update provided for DocumentReference with invalid preserved field, ignoring",
358+
)
355359
PROUPDATE999 = _Reference(
356360
"INFO", "Successfully completed producer updateDocumentReference"
357361
)

0 commit comments

Comments
 (0)