Skip to content

Commit 7f36bd5

Browse files
Merge pull request #638 from NHSDigital/feature/eema1-NRL-738-AllowSyncFullPointerAccess
NRL-738 allow sync full pointer access
2 parents df992c3 + 4d5a68a commit 7f36bd5

File tree

17 files changed

+130
-70
lines changed

17 files changed

+130
-70
lines changed

api/consumer/readDocumentReference/tests/test_read_document_reference_consumer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ def test_read_document_reference_unauthorised_for_type(
110110
repository.create(doc_pointer)
111111

112112
event = create_test_api_gateway_event(
113-
headers=create_headers(pointer_types=[PointerTypes.EMERGENCY_HEALTHCARE_PLAN]),
113+
headers=create_headers(
114+
pointer_types=[PointerTypes.EMERGENCY_HEALTHCARE_PLAN.value]
115+
),
114116
path_parameters={"id": doc_pointer.id},
115117
)
116118

@@ -155,7 +157,7 @@ def test_document_reference_invalid_json(repository: DocumentPointerRepository):
155157
repository.create(doc_pointer)
156158

157159
event = create_test_api_gateway_event(
158-
headers=create_headers(pointer_types=[PointerTypes.MENTAL_HEALTH_PLAN]),
160+
headers=create_headers(pointer_types=[PointerTypes.MENTAL_HEALTH_PLAN.value]),
159161
path_parameters={"id": doc_pointer.id},
160162
)
161163

api/producer/createDocumentReference/tests/test_create_document_reference.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,8 @@ def test_create_document_reference_invalid_relatesto_type(
659659
event = create_test_api_gateway_event(
660660
headers=create_headers(
661661
pointer_types=[
662-
PointerTypes.EOL_COORDINATION_SUMMARY,
663-
PointerTypes.MENTAL_HEALTH_PLAN,
662+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
663+
PointerTypes.MENTAL_HEALTH_PLAN.value,
664664
]
665665
),
666666
body=doc_ref.json(exclude_none=True),
@@ -711,8 +711,8 @@ def test_create_document_reference_with_no_context_related_for_ssp_url(
711711
event = create_test_api_gateway_event(
712712
headers=create_headers(
713713
pointer_types=[
714-
PointerTypes.EOL_COORDINATION_SUMMARY,
715-
PointerTypes.MENTAL_HEALTH_PLAN,
714+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
715+
PointerTypes.MENTAL_HEALTH_PLAN.value,
716716
]
717717
),
718718
body=doc_ref.json(exclude_none=True),
@@ -770,8 +770,8 @@ def test_create_document_reference_with_no_asid_in_for_ssp_url(
770770
event = create_test_api_gateway_event(
771771
headers=create_headers(
772772
pointer_types=[
773-
PointerTypes.EOL_COORDINATION_SUMMARY,
774-
PointerTypes.MENTAL_HEALTH_PLAN,
773+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
774+
PointerTypes.MENTAL_HEALTH_PLAN.value,
775775
]
776776
),
777777
body=doc_ref.json(exclude_none=True),
@@ -829,8 +829,8 @@ def test_create_document_reference_with_invalid_asid_for_ssp_url(
829829
event = create_test_api_gateway_event(
830830
headers=create_headers(
831831
pointer_types=[
832-
PointerTypes.EOL_COORDINATION_SUMMARY,
833-
PointerTypes.MENTAL_HEALTH_PLAN,
832+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
833+
PointerTypes.MENTAL_HEALTH_PLAN.value,
834834
]
835835
),
836836
body=doc_ref.json(exclude_none=True),
@@ -893,8 +893,8 @@ def test_create_document_reference_supersede_deletes_old_pointers_replace(
893893
event = create_test_api_gateway_event(
894894
headers=create_headers(
895895
pointer_types=[
896-
PointerTypes.EOL_COORDINATION_SUMMARY,
897-
PointerTypes.MENTAL_HEALTH_PLAN,
896+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
897+
PointerTypes.MENTAL_HEALTH_PLAN.value,
898898
]
899899
),
900900
body=doc_ref.json(exclude_none=True),
@@ -958,8 +958,8 @@ def test_create_document_reference_supersede_succeeds_with_toggle(
958958
event = create_test_api_gateway_event(
959959
headers=create_headers(
960960
pointer_types=[
961-
PointerTypes.EOL_COORDINATION_SUMMARY,
962-
PointerTypes.MENTAL_HEALTH_PLAN,
961+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
962+
PointerTypes.MENTAL_HEALTH_PLAN.value,
963963
],
964964
nrl_permissions=["supersede-ignore-delete-fail"],
965965
),
@@ -1023,8 +1023,8 @@ def test_create_document_reference_supersede_fails_without_toggle(
10231023
event = create_test_api_gateway_event(
10241024
headers=create_headers(
10251025
pointer_types=[
1026-
PointerTypes.EOL_COORDINATION_SUMMARY,
1027-
PointerTypes.MENTAL_HEALTH_PLAN,
1026+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
1027+
PointerTypes.MENTAL_HEALTH_PLAN.value,
10281028
]
10291029
),
10301030
body=doc_ref.json(exclude_none=True),
@@ -1087,8 +1087,8 @@ def test_create_document_reference_create_relatesto_not_replaces(
10871087
event = create_test_api_gateway_event(
10881088
headers=create_headers(
10891089
pointer_types=[
1090-
PointerTypes.EOL_COORDINATION_SUMMARY,
1091-
PointerTypes.MENTAL_HEALTH_PLAN,
1090+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
1091+
PointerTypes.MENTAL_HEALTH_PLAN.value,
10921092
]
10931093
),
10941094
body=doc_ref.json(exclude_none=True),

api/producer/searchDocumentReference/tests/test_search_document_reference_producer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def test_search_document_reference_filters_by_type(
209209
headers=create_headers(),
210210
query_string_parameters={
211211
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
212-
"type": PointerTypes.MENTAL_HEALTH_PLAN,
212+
"type": PointerTypes.MENTAL_HEALTH_PLAN.value,
213213
},
214214
)
215215

@@ -237,7 +237,9 @@ def test_search_document_reference_filters_by_pointer_types(
237237
repository.create(doc_pointer)
238238

239239
event = create_test_api_gateway_event(
240-
headers=create_headers(pointer_types=[PointerTypes.EOL_COORDINATION_SUMMARY]),
240+
headers=create_headers(
241+
pointer_types=[PointerTypes.EOL_COORDINATION_SUMMARY.value]
242+
),
241243
query_string_parameters={
242244
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
243245
},

api/producer/searchPostDocumentReference/tests/test_search_post_document_reference_producer.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def test_search_document_reference_filters_by_type(
233233
body=json.dumps(
234234
{
235235
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",
236-
"type": PointerTypes.MENTAL_HEALTH_PLAN,
236+
"type": PointerTypes.MENTAL_HEALTH_PLAN.value,
237237
}
238238
),
239239
)
@@ -262,7 +262,9 @@ def test_search_document_reference_filters_by_pointer_types(
262262
repository.create(doc_pointer)
263263

264264
event = create_test_api_gateway_event(
265-
headers=create_headers(pointer_types=[PointerTypes.EOL_COORDINATION_SUMMARY]),
265+
headers=create_headers(
266+
pointer_types=[PointerTypes.EOL_COORDINATION_SUMMARY.value]
267+
),
266268
body=json.dumps(
267269
{
268270
"subject:identifier": "https://fhir.nhs.uk/Id/nhs-number|6700028191",

api/producer/upsertDocumentReference/tests/test_upsert_document_reference.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -748,8 +748,8 @@ def test_create_document_reference_invalid_relatesto_type(
748748
event = create_test_api_gateway_event(
749749
headers=create_headers(
750750
pointer_types=[
751-
PointerTypes.EOL_COORDINATION_SUMMARY,
752-
PointerTypes.MENTAL_HEALTH_PLAN,
751+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
752+
PointerTypes.MENTAL_HEALTH_PLAN.value,
753753
]
754754
),
755755
body=doc_ref.json(exclude_none=True),
@@ -800,8 +800,8 @@ def test_create_document_reference_with_no_context_related_for_ssp_url(
800800
event = create_test_api_gateway_event(
801801
headers=create_headers(
802802
pointer_types=[
803-
PointerTypes.EOL_COORDINATION_SUMMARY,
804-
PointerTypes.MENTAL_HEALTH_PLAN,
803+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
804+
PointerTypes.MENTAL_HEALTH_PLAN.value,
805805
]
806806
),
807807
body=doc_ref.json(exclude_none=True),
@@ -859,8 +859,8 @@ def test_create_document_reference_with_no_asid_in_for_ssp_url(
859859
event = create_test_api_gateway_event(
860860
headers=create_headers(
861861
pointer_types=[
862-
PointerTypes.EOL_COORDINATION_SUMMARY,
863-
PointerTypes.MENTAL_HEALTH_PLAN,
862+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
863+
PointerTypes.MENTAL_HEALTH_PLAN.value,
864864
]
865865
),
866866
body=doc_ref.json(exclude_none=True),
@@ -918,8 +918,8 @@ def test_create_document_reference_with_invalid_asid_for_ssp_url(
918918
event = create_test_api_gateway_event(
919919
headers=create_headers(
920920
pointer_types=[
921-
PointerTypes.EOL_COORDINATION_SUMMARY,
922-
PointerTypes.MENTAL_HEALTH_PLAN,
921+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
922+
PointerTypes.MENTAL_HEALTH_PLAN.value,
923923
]
924924
),
925925
body=doc_ref.json(exclude_none=True),
@@ -981,8 +981,8 @@ def test_create_document_reference_supersede_deletes_old_pointers_replace(
981981
event = create_test_api_gateway_event(
982982
headers=create_headers(
983983
pointer_types=[
984-
PointerTypes.EOL_COORDINATION_SUMMARY,
985-
PointerTypes.MENTAL_HEALTH_PLAN,
984+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
985+
PointerTypes.MENTAL_HEALTH_PLAN.value,
986986
]
987987
),
988988
body=doc_ref.json(exclude_none=True),
@@ -1045,8 +1045,8 @@ def test_create_document_reference_supersede_succeeds_with_toggle(
10451045
event = create_test_api_gateway_event(
10461046
headers=create_headers(
10471047
pointer_types=[
1048-
PointerTypes.EOL_COORDINATION_SUMMARY,
1049-
PointerTypes.MENTAL_HEALTH_PLAN,
1048+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
1049+
PointerTypes.MENTAL_HEALTH_PLAN.value,
10501050
],
10511051
nrl_permissions=["supersede-ignore-delete-fail"],
10521052
),
@@ -1110,8 +1110,8 @@ def test_create_document_reference_supersede_fails_without_toggle(
11101110
event = create_test_api_gateway_event(
11111111
headers=create_headers(
11121112
pointer_types=[
1113-
PointerTypes.EOL_COORDINATION_SUMMARY,
1114-
PointerTypes.MENTAL_HEALTH_PLAN,
1113+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
1114+
PointerTypes.MENTAL_HEALTH_PLAN.value,
11151115
]
11161116
),
11171117
body=doc_ref.json(exclude_none=True),
@@ -1173,8 +1173,8 @@ def test_create_document_reference_create_relatesto_not_replaces(
11731173
event = create_test_api_gateway_event(
11741174
headers=create_headers(
11751175
pointer_types=[
1176-
PointerTypes.EOL_COORDINATION_SUMMARY,
1177-
PointerTypes.MENTAL_HEALTH_PLAN,
1176+
PointerTypes.EOL_COORDINATION_SUMMARY.value,
1177+
PointerTypes.MENTAL_HEALTH_PLAN.value,
11781178
]
11791179
),
11801180
body=doc_ref.json(exclude_none=True),

api/producer/upsertDocumentReference/upsert_document_reference.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,13 @@ def _get_document_ids_to_supersede(
108108
for idx, relates_to in enumerate(resource.relatesTo):
109109
identifier = _validate_identifier(relates_to, idx)
110110
_validate_producer_id(identifier, metadata, idx)
111-
112-
if not can_ignore_delete_fail:
111+
if can_ignore_delete_fail:
112+
logger.log(
113+
LogReference.PROUPSERT006a,
114+
pointer_id=resource.id,
115+
relatesTo=resource.relatesTo,
116+
)
117+
else:
113118
existing_pointer = _check_existing_pointer(identifier, repository, idx)
114119
_validate_pointer_details(existing_pointer, core_model, identifier, idx)
115120

@@ -251,6 +256,7 @@ def handler(
251256
LogReference.PROUPSERT010,
252257
pointer_id=result.resource.id,
253258
ids_to_delete=ids_to_delete,
259+
can_ignore_delete_fail=can_ignore_delete_fail,
254260
)
255261
saved_model = repository.supersede(
256262
core_model, ids_to_delete, can_ignore_delete_fail

layer/nrlf/consumer/fhir/r4/model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ class RequestQueryCustodian(BaseModel):
395395

396396

397397
class RequestQueryType(BaseModel):
398-
__root__: Annotated[str, Field(example=PointerTypes.MENTAL_HEALTH_PLAN)]
398+
__root__: Annotated[str, Field(example=PointerTypes.MENTAL_HEALTH_PLAN.value)]
399399

400400

401401
class NextPageToken(BaseModel):

layer/nrlf/core/constants.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,13 @@ class Source(Enum):
3131
CONNECTION_METADATA = "nhsd-connection-metadata"
3232
PERMISSION_AUDIT_DATES_FROM_PAYLOAD = "audit-dates-from-payload"
3333
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL = "supersede-ignore-delete-fail"
34+
PERMISSION_ALLOW_ALL_POINTER_TYPES = "allow-all-pointer-types"
35+
3436

3537
PRODUCER_URL_PATH = "/nrl-producer-api/FHIR/R4/DocumentReference"
3638

3739

38-
class PointerTypes:
40+
class PointerTypes(Enum):
3941
MENTAL_HEALTH_PLAN = "http://snomed.info/sct|736253002"
4042
EMERGENCY_HEALTHCARE_PLAN = "http://snomed.info/sct|887701000000100"
4143
EOL_COORDINATION_SUMMARY = "http://snomed.info/sct|861421000000109"
@@ -44,3 +46,7 @@ class PointerTypes:
4446
CONTINGENCY_PLAN = "http://snomed.info/sct|325691000000100"
4547
EOL_CARE_PLAN = "http://snomed.info/sct|736373009"
4648
LLOYD_GEORGE_FOLDER = "http://snomed.info/sct|16521000000101"
49+
50+
@staticmethod
51+
def list():
52+
return list(map(lambda type: type.value, PointerTypes))

layer/nrlf/core/decorators.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from nrlf.core.authoriser import get_pointer_types
1616
from nrlf.core.codes import SpineErrorConcept
1717
from nrlf.core.config import Config
18+
from nrlf.core.constants import PERMISSION_ALLOW_ALL_POINTER_TYPES, PointerTypes
1819
from nrlf.core.dynamodb.repository import DocumentPointerRepository
1920
from nrlf.core.errors import OperationOutcomeError, ParseError
2021
from nrlf.core.logger import LogReference, logger
@@ -66,7 +67,10 @@ def load_connection_metadata(headers: Dict[str, str], config: Config):
6667
logger.log(LogReference.HANDLER002, headers=headers)
6768
metadata = parse_headers(headers)
6869
logger.log(LogReference.HANDLER003, metadata=metadata.dict())
69-
70+
if PERMISSION_ALLOW_ALL_POINTER_TYPES in metadata.nrl_permissions:
71+
logger.log(LogReference.HANDLER004a)
72+
metadata.pointer_types = PointerTypes.list()
73+
return metadata
7074
if metadata.enable_authorization_lookup:
7175
logger.log(LogReference.HANDLER004)
7276
pointer_types = get_pointer_types(metadata, config)

layer/nrlf/core/dynamodb/repository.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -422,15 +422,14 @@ def delete_by_id(self, id_: str, can_ignore_delete_fail: bool = False):
422422
partition_key = "D#" + "#".join([*ods_code_parts, document_id])
423423
try:
424424
self.table.delete_item(Key={"pk": partition_key, "sk": partition_key})
425-
except ClientError as exc:
425+
except Exception as exc:
426426
if can_ignore_delete_fail:
427427
logger.log(
428428
LogReference.REPOSITORY026a,
429429
exc_info=sys.exc_info(),
430430
stacklevel=5,
431431
error=str(exc),
432432
)
433-
return
434433

435434
def _query(self, **kwargs) -> Iterator[DocumentPointer]:
436435
"""

0 commit comments

Comments
 (0)