Skip to content

Commit 8b4de36

Browse files
committed
Refactored update journey
1 parent c239cae commit 8b4de36

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
@@ -183,11 +183,9 @@ def update_immunization(
183183
immunization: dict,
184184
patient: any,
185185
existing_resource_version: int,
186-
imms_vax_type_perms: list[str],
187186
supplier_system: str,
188187
) -> tuple[dict, int]:
189188
attr = RecordAttributes(immunization, patient)
190-
self._handle_permissions(imms_vax_type_perms, attr)
191189
update_exp = self._build_update_expression(is_reinstate=False)
192190

193191
self._check_duplicate_identifier(attr)
@@ -208,12 +206,9 @@ def reinstate_immunization(
208206
immunization: dict,
209207
patient: any,
210208
existing_resource_version: int,
211-
imms_vax_type_perms: list[str],
212209
supplier_system: str,
213-
214210
) -> tuple[dict, int]:
215211
attr = RecordAttributes(immunization, patient)
216-
self._handle_permissions(imms_vax_type_perms, attr)
217212
update_exp = self._build_update_expression(is_reinstate=True)
218213

219214
self._check_duplicate_identifier(attr)
@@ -234,11 +229,9 @@ def update_reinstated_immunization(
234229
immunization: dict,
235230
patient: any,
236231
existing_resource_version: int,
237-
imms_vax_type_perms: list[str],
238232
supplier_system: str,
239233
) -> tuple[dict, int]:
240234
attr = RecordAttributes(immunization, patient)
241-
self._handle_permissions(imms_vax_type_perms, attr)
242235
update_exp = self._build_update_expression(is_reinstate=False)
243236

244237
self._check_duplicate_identifier(attr)

backend/src/fhir_service.py

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -136,20 +136,25 @@ def update_immunization(
136136
imms_id: str,
137137
immunization: dict,
138138
existing_resource_version: int,
139-
imms_vax_type_perms: list[str],
140139
supplier_system: str,
141-
) -> tuple[UpdateOutcome, Immunization, int]:
140+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
141+
# TODO - raise ticket to refactor this and below 3. Should have one update method and call repo based on type
142142
immunization["id"] = imms_id
143143

144144
patient = self._validate_patient(immunization)
145145
if "diagnostics" in patient:
146-
return (None, patient, None)
146+
return None, patient, None
147+
148+
vaccination_type = get_vaccine_type(immunization)
149+
150+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
151+
raise UnauthorizedVaxError()
152+
147153
imms, updated_version = self.immunization_repo.update_immunization(
148154
imms_id,
149155
immunization,
150156
patient,
151157
existing_resource_version,
152-
imms_vax_type_perms,
153158
supplier_system
154159
)
155160

@@ -160,20 +165,24 @@ def reinstate_immunization(
160165
imms_id: str,
161166
immunization: dict,
162167
existing_resource_version: int,
163-
imms_vax_type_perms: list[str],
164168
supplier_system: str,
165-
) -> tuple[UpdateOutcome, Immunization, int]:
169+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
166170
immunization["id"] = imms_id
167171
patient = self._validate_patient(immunization)
168172
if "diagnostics" in patient:
169-
return (None, patient, None)
173+
return None, patient, None
174+
175+
vaccination_type = get_vaccine_type(immunization)
176+
177+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
178+
raise UnauthorizedVaxError()
179+
170180
imms, updated_version = self.immunization_repo.reinstate_immunization(
171181
imms_id,
172182
immunization,
173183
patient,
174184
existing_resource_version,
175-
imms_vax_type_perms,
176-
supplier_system,
185+
supplier_system
177186
)
178187

179188
return UpdateOutcome.UPDATE, Immunization.parse_obj(imms), updated_version
@@ -183,19 +192,23 @@ def update_reinstated_immunization(
183192
imms_id: str,
184193
immunization: dict,
185194
existing_resource_version: int,
186-
imms_vax_type_perms: list[str],
187195
supplier_system: str,
188-
) -> tuple[UpdateOutcome, Immunization, int]:
196+
) -> tuple[Optional[UpdateOutcome], Immunization | dict, Optional[int]]:
189197
immunization["id"] = imms_id
190198
patient = self._validate_patient(immunization)
191199
if "diagnostics" in patient:
192-
return (None, patient, None)
200+
return None, patient, None
201+
202+
vaccination_type = get_vaccine_type(immunization)
203+
204+
if not self.authoriser.authorise(supplier_system, ApiOperationCode.UPDATE, {vaccination_type}):
205+
raise UnauthorizedVaxError()
206+
193207
imms, updated_version = self.immunization_repo.update_reinstated_immunization(
194208
imms_id,
195209
immunization,
196210
patient,
197211
existing_resource_version,
198-
imms_vax_type_perms,
199212
supplier_system,
200213
)
201214

backend/tests/test_fhir_controller.py

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

10751075
self.service.update_immunization.assert_called_once_with(
1076-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1076+
imms_id, json.loads(imms), 1, "Test"
10771077
)
10781078
mock_get_permissions.assert_called_once_with("Test")
10791079
self.assertEqual(response["statusCode"], 200)
@@ -1270,7 +1270,7 @@ def test_update_deletedat_immunization_with_version(self, mock_get_supplier_perm
12701270
response = self.controller.update_immunization(aws_event)
12711271

12721272
self.service.reinstate_immunization.assert_called_once_with(
1273-
imms_id, json.loads(imms), 1, ["COVID19.CRUDS"], "Test"
1273+
imms_id, json.loads(imms), 1, "Test"
12741274
)
12751275
self.assertEqual(response["statusCode"], 200)
12761276
self.assertEqual(response["headers"]["E-Tag"], 2)
@@ -1298,7 +1298,7 @@ def test_update_deletedat_immunization_without_version(self, mock_get_supplier_p
12981298
response = self.controller.update_immunization(aws_event)
12991299

13001300
self.service.reinstate_immunization.assert_called_once_with(
1301-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1301+
imms_id, json.loads(imms), 1, "Test"
13021302
)
13031303
mock_get_supplier_permissions.assert_called_once_with("Test")
13041304
self.assertEqual(response["statusCode"], 200)
@@ -1515,7 +1515,7 @@ def test_update_immunization_when_reinstated_true(self, mock_get_permissions):
15151515
response = self.controller.update_immunization(aws_event)
15161516

15171517
self.service.update_reinstated_immunization.assert_called_once_with(
1518-
imms_id, json.loads(imms), 1, ["COVID19.CRUD"], "Test"
1518+
imms_id, json.loads(imms), 1, "Test"
15191519
)
15201520
self.assertEqual(response["statusCode"], 200)
15211521
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
@@ -320,7 +320,6 @@ def setUp(self):
320320
def test_update1(self):
321321
"""it should update record by replacing both Immunization and Patient"""
322322

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

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

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

378-
self.mock_redis_client.hget.return_value = "COVID19"
379377
imms_id = "an-id"
380378
imms = create_covid_19_immunization_dict(imms_id)
381379
imms["patient"] = self.patient
@@ -388,15 +386,14 @@ def test_update_throws_error_when_response_can_not_be_handled(self):
388386
with self.assertRaises(UnhandledResponseError) as e:
389387
# When
390388

391-
self.repository.update_immunization(imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test")
389+
self.repository.update_immunization(imms_id, imms, self.patient, 1, "Test")
392390

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

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

399-
self.mock_redis_client.hget.return_value = "COVID19"
400397
imms_id = "an-id"
401398
imms = create_covid_19_immunization_dict(imms_id)
402399
imms["patient"] = self.patient
@@ -406,13 +403,12 @@ def test_update_throws_error_when_identifier_already_in_dynamodb(self):
406403
with self.assertRaises(IdentifierDuplicationError) as e:
407404
# When
408405

409-
self.repository.update_immunization(imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test")
406+
self.repository.update_immunization(imms_id, imms, self.patient, 1, "Test")
410407

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

413410
def test_reinstate_immunization_success(self):
414411
"""it should reinstate an immunization successfully"""
415-
self.mock_redis_client.hget.return_value = "COVID19"
416412
imms_id = "reinstate-id"
417413
imms = create_covid_19_immunization_dict(imms_id)
418414
imms["patient"] = self.patient
@@ -426,15 +422,14 @@ def test_reinstate_immunization_success(self):
426422

427423
with patch("time.time", return_value=123456):
428424
result, version = self.repository.reinstate_immunization(
429-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
425+
imms_id, imms, self.patient, 1, "Test"
430426
)
431427

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

435431
def test_update_reinstated_immunization_success(self):
436432
"""it should update a reinstated immunization successfully"""
437-
self.mock_redis_client.hget.return_value = "COVID19"
438433
imms_id = "reinstated-id"
439434
imms = create_covid_19_immunization_dict(imms_id)
440435
imms["patient"] = self.patient
@@ -448,7 +443,7 @@ def test_update_reinstated_immunization_success(self):
448443

449444
with patch("time.time", return_value=123456):
450445
result, version = self.repository.update_reinstated_immunization(
451-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
446+
imms_id, imms, self.patient, 1, "Test"
452447
)
453448

454449
self.assertEqual(result, resource)
@@ -761,7 +756,7 @@ def run_update_immunization_test(self, imms_id, imms, resource, updated_dose_qua
761756
with patch("time.time") as mock_time:
762757
mock_time.return_value = now_epoch
763758
act_resource, act_version = self.repository.update_immunization(
764-
imms_id, imms, self.patient, 1, ["COVID19.CRUD"], "Test"
759+
imms_id, imms, self.patient, 1, "Test"
765760
)
766761
self.assertDictEqual(act_resource, resource)
767762
self.assertEqual(act_version, 2)
@@ -801,7 +796,6 @@ def run_update_immunization_test(self, imms_id, imms, resource, updated_dose_qua
801796

802797
def test_decimal_on_update(self):
803798
"""it should update record when replacing doseQuantity and keep decimal precision"""
804-
self.mock_redis_client.hget.return_value = "COVID19"
805799
imms_id = "an-imms-id"
806800
imms = create_covid_19_immunization_dict(imms_id)
807801
imms["doseQuantity"] = 1.5556
@@ -813,7 +807,6 @@ def test_decimal_on_update(self):
813807

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

0 commit comments

Comments
 (0)