Skip to content

Commit a0f63e8

Browse files
committed
sanity check
1 parent dfb2314 commit a0f63e8

File tree

4 files changed

+34
-47
lines changed

4 files changed

+34
-47
lines changed

backend/src/fhir_controller.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -431,9 +431,6 @@ def search_immunizations(self, aws_event: APIGatewayProxyEventV1) -> dict:
431431
for vaccine_type in search_params.immunization_targets
432432
if ApiOperationCode.SEARCH in expanded_permissions.get(vaccine_type.lower(), [])
433433
]
434-
# vax_type_perms = _expand_permissions(imms_vax_type_perms, ApiOperationCode.SEARCH)
435-
# vax_type_perm = [ vaccine_type for vaccine_type in search_params.immunization_targets
436-
# if f"{vaccine_type.lower()}.{ApiOperationCode.SEARCH}" in vax_type_perms ]
437434
if not vax_type_perm:
438435
raise UnauthorizedVaxError
439436
except UnauthorizedVaxError as unauthorized:
@@ -670,5 +667,5 @@ def create_response(status_code, body=None, headers=None):
670667
def _identify_supplier_system(aws_event):
671668
supplier_system = aws_event["headers"]["SupplierSystem"]
672669
if not supplier_system:
673-
raise UnauthorizedSystemError("SupplierSystem header is missing or empty.")
670+
return self.create_response(403, unauthorized.to_operation_outcome())
674671
return supplier_system

backend/src/fhir_repository.py

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -106,28 +106,23 @@ def get_immunization_by_identifier(
106106

107107
def get_immunization_by_id(self, imms_id: str, imms_vax_type_perms: str) -> Optional[dict]:
108108
response = self.table.get_item(Key={"PK": _make_immunization_pk(imms_id)})
109+
item = response.get("Item")
109110

110-
if "Item" in response:
111-
resp = dict()
112-
if "DeletedAt" in response["Item"]:
113-
if response["Item"]["DeletedAt"] == "reinstated":
114-
vaccine_type = self._vaccine_type(response["Item"]["PatientSK"])
115-
if not validate_permissions(imms_vax_type_perms,ApiOperationCode.READ, [vaccine_type]):
116-
raise UnauthorizedVaxError()
117-
resp["Resource"] = json.loads(response["Item"]["Resource"])
118-
resp["Version"] = response["Item"]["Version"]
119-
return resp
120-
else:
121-
return None
122-
else:
123-
vaccine_type = self._vaccine_type(response["Item"]["PatientSK"])
124-
if not validate_permissions(imms_vax_type_perms,ApiOperationCode.READ, [vaccine_type]):
125-
raise UnauthorizedVaxError()
126-
resp["Resource"] = json.loads(response["Item"]["Resource"])
127-
resp["Version"] = response["Item"]["Version"]
128-
return resp
129-
else:
111+
if not item:
130112
return None
113+
if item.get("DeletedAt") and item["DeletedAt"] != "reinstated":
114+
return None
115+
116+
# Get vaccine type + validate permissions
117+
vaccine_type = self._vaccine_type(item["PatientSK"])
118+
if not validate_permissions(imms_vax_type_perms, ApiOperationCode.READ, [vaccine_type]):
119+
raise UnauthorizedVaxError()
120+
121+
# Build response
122+
return {
123+
"Resource": json.loads(item["Resource"]),
124+
"Version": item["Version"]
125+
}
131126

132127
def get_immunization_by_id_all(self, imms_id: str, imms: dict) -> Optional[dict]:
133128
response = self.table.get_item(Key={"PK": _make_immunization_pk(imms_id)})
@@ -355,36 +350,39 @@ def _perform_dynamo_update(
355350
)
356351

357352
def delete_immunization(
358-
self, imms_id: str, imms_vax_type_perms: str, supplier_system: str
359-
) -> dict:
353+
self, imms_id: str, imms_vax_type_perms: str, supplier_system: str) -> dict:
360354
now_timestamp = int(time.time())
355+
361356
try:
362-
resp = self.table.get_item(Key={"PK": _make_immunization_pk(imms_id)})
363-
364-
if "Item" in resp:
365-
if "DeletedAt" in resp["Item"]:
366-
if resp["Item"]["DeletedAt"] == "reinstated":
367-
pass
368-
vaccine_type = self._vaccine_type(resp["Item"]["PatientSK"])
357+
item = self.table.get_item(Key={"PK": _make_immunization_pk(imms_id)}).get("Item")
358+
if not item:
359+
raise ResourceNotFoundError(resource_type="Immunization", resource_id=imms_id)
360+
361+
if item.get("DeletedAt") == "reinstated":
362+
vaccine_type = self._vaccine_type(item["PatientSK"])
369363
if not validate_permissions(imms_vax_type_perms, ApiOperationCode.DELETE, [vaccine_type]):
370364
raise UnauthorizedVaxError()
371365

366+
# Proceed with delete update
372367
response = self.table.update_item(
373368
Key={"PK": _make_immunization_pk(imms_id)},
374-
UpdateExpression="SET DeletedAt = :timestamp, Operation = :operation, SupplierSystem = :supplier_system",
369+
UpdateExpression=(
370+
"SET DeletedAt = :timestamp, Operation = :operation, SupplierSystem = :supplier_system"
371+
),
375372
ExpressionAttributeValues={
376373
":timestamp": now_timestamp,
377374
":operation": "DELETE",
378375
":supplier_system": supplier_system,
379376
},
380377
ReturnValues="ALL_NEW",
381-
ConditionExpression=Attr("PK").eq(_make_immunization_pk(imms_id))
382-
& (Attr("DeletedAt").not_exists() | Attr("DeletedAt").eq("reinstated")),
378+
ConditionExpression=(
379+
Attr("PK").eq(_make_immunization_pk(imms_id)) &
380+
(Attr("DeletedAt").not_exists() | Attr("DeletedAt").eq("reinstated"))
381+
),
383382
)
383+
384384
return self._handle_dynamo_response(response)
385-
386385
except botocore.exceptions.ClientError as error:
387-
# Either resource didn't exist or it has already been deleted. See ConditionExpression in the request
388386
if error.response["Error"]["Code"] == "ConditionalCheckFailedException":
389387
raise ResourceNotFoundError(resource_type="Immunization", resource_id=imms_id)
390388
else:

backend/tests/.coverage

-52 KB
Binary file not shown.

backend/tests/test_fhir_repository.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -523,19 +523,11 @@ def test_unauthorised_vax_delete(self):
523523
"Resource": json.dumps({"foo": "bar"}),
524524
"Version": 1,
525525
"PatientSK": "FLU#2516525251",
526+
"DeletedAt": "reinstated"
526527
}
527528
}
528529
)
529530

530-
self.repository.table.update_item.return_value = {
531-
"ResponseMetadata": {
532-
"HTTPStatusCode": 200
533-
},
534-
"Attributes": {
535-
"Resource": json.dumps({"id": "valid-id", "status": "deleted"})
536-
}
537-
}
538-
539531
with self.assertRaises(UnauthorizedVaxError) as e:
540532
self.repository.delete_immunization(imms_id, ["COVID19.CRUD"], "Test")
541533

0 commit comments

Comments
 (0)