Skip to content

Commit f84f669

Browse files
committed
Refactored update journey
1 parent c4ac34f commit f84f669

File tree

6 files changed

+65
-50
lines changed

6 files changed

+65
-50
lines changed

backend/src/fhir_controller.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,6 @@ def update_immunization(self, aws_event):
268268
imms_id,
269269
imms,
270270
existing_resource_version,
271-
imms_vax_type_perms,
272271
supplier_system
273272
)
274273
# Validate if the imms resource to be updated is a logically deleted resource-end
@@ -323,15 +322,13 @@ def update_immunization(self, aws_event):
323322
imms_id,
324323
imms,
325324
existing_resource_version,
326-
imms_vax_type_perms,
327325
supplier_system
328326
)
329327
else:
330328
outcome, resource, updated_version = self.fhir_service.update_immunization(
331329
imms_id,
332330
imms,
333331
existing_resource_version,
334-
imms_vax_type_perms,
335332
supplier_system
336333
)
337334

backend/src/fhir_repository.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,9 @@ def update_immunization(
185185
immunization: dict,
186186
patient: any,
187187
existing_resource_version: int,
188-
imms_vax_type_perms: list[str],
189188
supplier_system: str,
190189
) -> tuple[dict, int]:
191190
attr = RecordAttributes(immunization, patient)
192-
self._handle_permissions(imms_vax_type_perms, attr)
193191
update_exp = self._build_update_expression(is_reinstate=False)
194192

195193
self._check_duplicate_identifier(attr)
@@ -210,12 +208,9 @@ def reinstate_immunization(
210208
immunization: dict,
211209
patient: any,
212210
existing_resource_version: int,
213-
imms_vax_type_perms: list[str],
214211
supplier_system: str,
215-
216212
) -> tuple[dict, int]:
217213
attr = RecordAttributes(immunization, patient)
218-
self._handle_permissions(imms_vax_type_perms, attr)
219214
update_exp = self._build_update_expression(is_reinstate=True)
220215

221216
self._check_duplicate_identifier(attr)
@@ -236,11 +231,9 @@ def update_reinstated_immunization(
236231
immunization: dict,
237232
patient: any,
238233
existing_resource_version: int,
239-
imms_vax_type_perms: list[str],
240234
supplier_system: str,
241235
) -> tuple[dict, int]:
242236
attr = RecordAttributes(immunization, patient)
243-
self._handle_permissions(imms_vax_type_perms, attr)
244237
update_exp = self._build_update_expression(is_reinstate=False)
245238

246239
self._check_duplicate_identifier(attr)

backend/src/fhir_service.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -139,20 +139,25 @@ def update_immunization(
139139
imms_id: str,
140140
immunization: dict,
141141
existing_resource_version: int,
142-
imms_vax_type_perms: list[str],
143142
supplier_system: str,
144-
) -> tuple[UpdateOutcome, Immunization, int]:
143+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
144+
# TODO - raise ticket to refactor this and below 3. Should have one update method and call repo based on type
145145
immunization["id"] = imms_id
146146

147147
patient = self._validate_patient(immunization)
148148
if "diagnostics" in patient:
149-
return (None, patient, None)
149+
return None, patient, None
150+
151+
vaccination_type = get_vaccine_type(immunization)
152+
153+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
154+
raise UnauthorizedVaxError()
155+
150156
imms, updated_version = self.immunization_repo.update_immunization(
151157
imms_id,
152158
immunization,
153159
patient,
154160
existing_resource_version,
155-
imms_vax_type_perms,
156161
supplier_system
157162
)
158163

@@ -163,20 +168,24 @@ def reinstate_immunization(
163168
imms_id: str,
164169
immunization: dict,
165170
existing_resource_version: int,
166-
imms_vax_type_perms: list[str],
167171
supplier_system: str,
168-
) -> tuple[UpdateOutcome, Immunization, int]:
172+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
169173
immunization["id"] = imms_id
170174
patient = self._validate_patient(immunization)
171175
if "diagnostics" in patient:
172-
return (None, patient, None)
176+
return None, patient, None
177+
178+
vaccination_type = get_vaccine_type(immunization)
179+
180+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
181+
raise UnauthorizedVaxError()
182+
173183
imms, updated_version = self.immunization_repo.reinstate_immunization(
174184
imms_id,
175185
immunization,
176186
patient,
177187
existing_resource_version,
178-
imms_vax_type_perms,
179-
supplier_system,
188+
supplier_system
180189
)
181190

182191
return UpdateOutcome.UPDATE, Immunization.parse_obj(imms), updated_version
@@ -186,19 +195,23 @@ def update_reinstated_immunization(
186195
imms_id: str,
187196
immunization: dict,
188197
existing_resource_version: int,
189-
imms_vax_type_perms: list[str],
190198
supplier_system: str,
191-
) -> tuple[UpdateOutcome, Immunization, int]:
199+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
192200
immunization["id"] = imms_id
193201
patient = self._validate_patient(immunization)
194202
if "diagnostics" in patient:
195-
return (None, patient, None)
203+
return None, patient, None
204+
205+
vaccination_type = get_vaccine_type(immunization)
206+
207+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
208+
raise UnauthorizedVaxError()
209+
196210
imms, updated_version = self.immunization_repo.update_reinstated_immunization(
197211
imms_id,
198212
immunization,
199213
patient,
200214
existing_resource_version,
201-
imms_vax_type_perms,
202215
supplier_system,
203216
)
204217

backend/tests/test_fhir_controller.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1043,7 +1043,7 @@ def test_update_immunization(self,mock_get_permissions):
10431043
response = self.controller.update_immunization(aws_event)
10441044

10451045
self.service.update_immunization.assert_called_once_with(
1046-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1046+
imms_id, json.loads(imms), 1, "Test"
10471047
)
10481048
mock_get_permissions.assert_called_once_with("Test")
10491049
self.assertEqual(response["statusCode"], 200)
@@ -1240,7 +1240,7 @@ def test_update_deletedat_immunization_with_version(self, mock_get_supplier_perm
12401240
response = self.controller.update_immunization(aws_event)
12411241

12421242
self.service.reinstate_immunization.assert_called_once_with(
1243-
imms_id, json.loads(imms), 1, ["COVID19.CRUDS"], "Test"
1243+
imms_id, json.loads(imms), 1, "Test"
12441244
)
12451245
self.assertEqual(response["statusCode"], 200)
12461246
self.assertEqual(response["headers"]["E-Tag"], 2)
@@ -1268,7 +1268,7 @@ def test_update_deletedat_immunization_without_version(self, mock_get_supplier_p
12681268
response = self.controller.update_immunization(aws_event)
12691269

12701270
self.service.reinstate_immunization.assert_called_once_with(
1271-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1271+
imms_id, json.loads(imms), 1, "Test"
12721272
)
12731273
mock_get_supplier_permissions.assert_called_once_with("Test")
12741274
self.assertEqual(response["statusCode"], 200)
@@ -1485,7 +1485,7 @@ def test_update_immunization_when_reinstated_true(self, mock_get_permissions):
14851485
response = self.controller.update_immunization(aws_event)
14861486

14871487
self.service.update_reinstated_immunization.assert_called_once_with(
1488-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1488+
imms_id, json.loads(imms), 1, "Test"
14891489
)
14901490
self.assertEqual(response["statusCode"], 200)
14911491
self.assertEqual(response["headers"]["E-Tag"], int("3"))

backend/tests/test_fhir_repository.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,6 @@ def setUp(self):
321321
def test_update1(self):
322322
"""it should update record by replacing both Immunization and Patient"""
323323

324-
self.mock_redis_client.hget.return_value = "COVID19"
325324
imms_id = "an-imms-id"
326325
imms = create_covid_19_immunization_dict(imms_id)
327326
imms["patient"] = self.patient
@@ -340,7 +339,7 @@ def test_update1(self):
340339
# When
341340

342341
act_resource, updated_version = self.repository.update_immunization(
343-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
342+
imms_id, imms, self.patient, 1, "Test"
344343
)
345344

346345
# Then
@@ -376,7 +375,6 @@ def test_update1(self):
376375
def test_update_throws_error_when_response_can_not_be_handled(self):
377376
"""it should throw UnhandledResponse when the response from dynamodb can't be handled"""
378377

379-
self.mock_redis_client.hget.return_value = "COVID19"
380378
imms_id = "an-id"
381379
imms = create_covid_19_immunization_dict(imms_id)
382380
imms["patient"] = self.patient
@@ -389,15 +387,14 @@ def test_update_throws_error_when_response_can_not_be_handled(self):
389387
with self.assertRaises(UnhandledResponseError) as e:
390388
# When
391389

392-
self.repository.update_immunization(imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test")
390+
self.repository.update_immunization(imms_id, imms, self.patient, 1, "Test")
393391

394392
# Then
395393
self.assertDictEqual(e.exception.response, response)
396394

397395
def test_update_throws_error_when_identifier_already_in_dynamodb(self):
398396
"""it should throw IdentifierDuplicationError when trying to update an immunization with an identfier that is already stored"""
399397

400-
self.mock_redis_client.hget.return_value = "COVID19"
401398
imms_id = "an-id"
402399
imms = create_covid_19_immunization_dict(imms_id)
403400
imms["patient"] = self.patient
@@ -407,13 +404,12 @@ def test_update_throws_error_when_identifier_already_in_dynamodb(self):
407404
with self.assertRaises(IdentifierDuplicationError) as e:
408405
# When
409406

410-
self.repository.update_immunization(imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test")
407+
self.repository.update_immunization(imms_id, imms, self.patient, 1, "Test")
411408

412409
self.assertEqual(str(e.exception), f"The provided identifier: {identifier} is duplicated")
413410

414411
def test_reinstate_immunization_success(self):
415412
"""it should reinstate an immunization successfully"""
416-
self.mock_redis_client.hget.return_value = "COVID19"
417413
imms_id = "reinstate-id"
418414
imms = create_covid_19_immunization_dict(imms_id)
419415
imms["patient"] = self.patient
@@ -427,15 +423,14 @@ def test_reinstate_immunization_success(self):
427423

428424
with patch("time.time", return_value=123456):
429425
result, version = self.repository.reinstate_immunization(
430-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
426+
imms_id, imms, self.patient, 1, "Test"
431427
)
432428

433429
self.assertEqual(result, resource)
434430
self.assertEqual(version, 2)
435431

436432
def test_update_reinstated_immunization_success(self):
437433
"""it should update a reinstated immunization successfully"""
438-
self.mock_redis_client.hget.return_value = "COVID19"
439434
imms_id = "reinstated-id"
440435
imms = create_covid_19_immunization_dict(imms_id)
441436
imms["patient"] = self.patient
@@ -449,7 +444,7 @@ def test_update_reinstated_immunization_success(self):
449444

450445
with patch("time.time", return_value=123456):
451446
result, version = self.repository.update_reinstated_immunization(
452-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
447+
imms_id, imms, self.patient, 1, "Test"
453448
)
454449

455450
self.assertEqual(result, resource)
@@ -762,7 +757,7 @@ def run_update_immunization_test(self, imms_id, imms, resource, updated_dose_qua
762757
with patch("time.time") as mock_time:
763758
mock_time.return_value = now_epoch
764759
act_resource, act_version = self.repository.update_immunization(
765-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
760+
imms_id, imms, self.patient, 1, "Test"
766761
)
767762
self.assertDictEqual(act_resource, resource)
768763
self.assertEqual(act_version, 2)
@@ -802,7 +797,6 @@ def run_update_immunization_test(self, imms_id, imms, resource, updated_dose_qua
802797

803798
def test_decimal_on_update(self):
804799
"""it should update record when replacing doseQuantity and keep decimal precision"""
805-
self.mock_redis_client.hget.return_value = "COVID19"
806800
imms_id = "an-imms-id"
807801
imms = create_covid_19_immunization_dict(imms_id)
808802
imms["doseQuantity"] = 1.5556
@@ -814,7 +808,6 @@ def test_decimal_on_update(self):
814808

815809
def test_decimal_on_update_patient(self):
816810
"""it should update record by replacing both Immunization and Patient and dosequantity"""
817-
self.mock_redis_client.hget.return_value = "COVID19"
818811
imms_id = "an-imms-id"
819812
imms = create_covid_19_immunization_dict(imms_id)
820813
imms["doseQuantity"] = 1.590

0 commit comments

Comments
 (0)