Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions api/consumer/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,6 @@ paths:
- $ref: "#/components/parameters/category"
- $ref: "#/components/parameters/nextPageToken"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -516,7 +515,6 @@ paths:
parameters:
- $ref: "#/components/parameters/id"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -1644,12 +1642,6 @@ components:
invalid:
summary: Unknown
value: XYZ
odsCodeExtension:
name: NHSD-End-User-Organisation
description: Organisation extension code
in: header
schema:
$ref: "#/components/schemas/RequestHeaderOrganisationExtensionCode"
requestId:
name: X-Request-ID
description: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,14 +64,11 @@ def _check_permissions(
"""
Check the requester has permissions to create the DocumentReference
"""
custodian_parts = tuple(
filter(None, (core_model.custodian, core_model.custodian_suffix))
)
if metadata.ods_code_parts != custodian_parts:
if metadata.ods_code != core_model.custodian:
logger.log(
LogReference.PROCREATE004,
ods_code_parts=metadata.ods_code_parts,
custodian_parts=custodian_parts,
LogReference.PROUPSERT004,
ods_code=metadata.ods_code,
custodian=core_model.custodian,
)
return SpineErrorResponse.UNPROCESSABLE_ENTITY(
diagnostics="The custodian of the provided DocumentReference does not match the expected ODS code for this organisation",
Expand Down Expand Up @@ -138,11 +135,11 @@ def _validate_producer_id(identifier, metadata, idx):
Validate that there is an ODS code in the relatesTo target identifier
"""
producer_id = identifier.split("-", 1)[0]
if metadata.ods_code_parts != tuple(producer_id.split("|")):
if metadata.ods_code != producer_id:
logger.log(
LogReference.PROCREATE007b,
related_identifier=identifier,
ods_code_parts=metadata.ods_code_parts,
ods_code=metadata.ods_code,
)
_raise_operation_outcome_error(
"The relatesTo target identifier value does not include the expected ODS code for this organisation",
Expand Down Expand Up @@ -229,8 +226,7 @@ def handler(
logger.log(LogReference.PROCREATE000)
logger.log(LogReference.PROCREATE001, resource=body)

id_prefix = "|".join(metadata.ods_code_parts)
body.id = f"{id_prefix}-{uuid4()}"
body.id = f"{metadata.ods_code}-{uuid4()}"

validator = DocumentReferenceValidator()
result = validator.validate(body)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ def handler(
pointer_id = urllib.parse.unquote(path.id)
producer_id, _ = pointer_id.split("-", 1)

if metadata.ods_code_parts != tuple(producer_id.split(".")):
if metadata.ods_code != producer_id:
logger.log(
LogReference.PRODELETE001,
ods_code_parts=metadata.ods_code_parts,
ods_code=metadata.ods_code,
producer_id=producer_id,
)
return SpineErrorResponse.AUTHOR_CREDENTIALS_ERROR(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ def handler(
parsed_id = urllib.parse.unquote(path.id)

producer_id = parsed_id.split("-", maxsplit=1)[0]
if metadata.ods_code_parts != tuple(producer_id.split(".")):
if metadata.ods_code != producer_id:
logger.log(
LogReference.PROREAD001,
ods_code_parts=metadata.ods_code_parts,
ods_code=metadata.ods_code,
producer_id=producer_id,
)
return SpineErrorResponse.AUTHOR_CREDENTIALS_ERROR(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,13 @@ def handler(
logger.log(
LogReference.PROSEARCH003,
custodian=metadata.ods_code,
custodian_suffix=metadata.ods_code_extension,
nhs_number=params.nhs_number,
pointer_types=pointer_types,
categories=params.category.root.split(",") if params.category else [],
)

for result in repository.search(
custodian=metadata.ods_code,
custodian_suffix=metadata.ods_code_extension,
nhs_number=params.nhs_number,
pointer_types=pointer_types,
categories=params.category.root.split(",") if params.category else [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,15 +74,13 @@ def handler(
logger.log(
LogReference.PROPOSTSEARCH003,
custodian=metadata.ods_code,
custodian_suffix=metadata.ods_code_extension,
nhs_number=body.nhs_number,
pointer_types=pointer_types,
categories=categories,
)

for result in repository.search(
custodian=metadata.ods_code,
custodian_suffix=metadata.ods_code_extension,
nhs_number=body.nhs_number,
pointer_types=pointer_types,
categories=categories,
Expand Down
13 changes: 0 additions & 13 deletions api/producer/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,6 @@ paths:
$ref: "#/components/requestBodies/DocumentReference"
parameters:
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
x-amazon-apigateway-integration:
Expand Down Expand Up @@ -408,7 +407,6 @@ paths:
- $ref: "#/components/parameters/category"
- $ref: "#/components/parameters/nextPageToken"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -610,7 +608,6 @@ paths:
operationId: upsertDocumentReference
parameters:
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -687,7 +684,6 @@ paths:
operationId: searchPostDocumentReference
parameters:
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
requestBody:
Expand Down Expand Up @@ -902,7 +898,6 @@ paths:
parameters:
- $ref: "#/components/parameters/id"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -1005,7 +1000,6 @@ paths:
parameters:
- $ref: "#/components/parameters/id"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -1084,7 +1078,6 @@ paths:
parameters:
- $ref: "#/components/parameters/id"
- $ref: "#/components/parameters/odsCode"
- $ref: "#/components/parameters/odsCodeExtension"
- $ref: "#/components/parameters/requestId"
- $ref: "#/components/parameters/correlationId"
responses:
Expand Down Expand Up @@ -2247,12 +2240,6 @@ components:
invalid:
summary: Unknown
value: XYZ
odsCodeExtension:
name: NHSD-End-User-Organisation
description: Organisation extension code
in: header
schema:
$ref: "#/components/schemas/RequestHeaderOrganisationExtensionCode"
requestId:
name: X-Request-ID
description: |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ def test_update_document_reference_happy_path(repository: DocumentPointerReposit

existing_doc_pointer = repository.get_by_id("Y05868-99999-99999-999999")
assert existing_doc_pointer is not None

existing_doc_ref = DocumentReference.model_validate_json(
existing_doc_pointer.document
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,10 @@ def handler(

core_model = DocumentPointer.from_document_reference(document_reference)

if metadata.ods_code_parts != tuple(core_model.producer_id.split("|")):
if metadata.ods_code != core_model.producer_id:
logger.log(
LogReference.PROUPDATE004,
metadata_ods_code_parts=metadata.ods_code_parts,
metadata_ods_code=metadata.ods_code,
producer_id=core_model.producer_id,
)
return SpineErrorResponse.AUTHOR_CREDENTIALS_ERROR(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,14 +62,11 @@ def _check_permissions(
"""
Check the requester has permissions to create the DocumentReference
"""
custodian_parts = tuple(
filter(None, (core_model.custodian, core_model.custodian_suffix))
)
if metadata.ods_code_parts != custodian_parts:
if metadata.ods_code != core_model.custodian:
logger.log(
LogReference.PROUPSERT004,
ods_code_parts=metadata.ods_code_parts,
custodian_parts=custodian_parts,
ods_code=metadata.ods_code,
custodian=core_model.custodian,
)
return SpineErrorResponse.UNPROCESSABLE_ENTITY(
diagnostics="The custodian of the provided DocumentReference does not match the expected ODS code for this organisation",
Expand Down Expand Up @@ -141,11 +138,11 @@ def _validate_producer_id(identifier, metadata, idx):
Validate that there is an ODS code in the relatesTo target identifier
"""
producer_id = identifier.split("-", 1)[0]
if metadata.ods_code_parts != tuple(producer_id.split("|")):
if metadata.ods_code != producer_id:
logger.log(
LogReference.PROUPSERT007b,
related_identifier=identifier,
ods_code_parts=metadata.ods_code_parts,
ods_code=metadata.ods_code,
)
_raise_operation_outcome_error(
"The relatesTo target identifier value does not include the expected ODS code for this organisation",
Expand Down Expand Up @@ -233,10 +230,10 @@ def handler(

core_model = _create_core_model(result.resource, metadata)

if metadata.ods_code_parts != tuple(core_model.producer_id.split("|")):
if metadata.ods_code != core_model.producer_id:
logger.log(
LogReference.PROUPSERT003,
ods_code_parts=metadata.ods_code_parts,
ods_code=metadata.ods_code,
producer_id=core_model.producer_id,
)
return SpineErrorResponse.UNPROCESSABLE_ENTITY(
Expand Down
12 changes: 2 additions & 10 deletions layer/nrlf/core/authoriser.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,8 @@ def get_pointer_types(

app_id = connection_metadata.nrl_app_id
ods_code = connection_metadata.ods_code
ods_code_extension = connection_metadata.ods_code_extension

if ods_code_extension:
key = f"{app_id}/{ods_code}.{ods_code_extension}.json"
else:
key = f"{app_id}/{ods_code}.json"
key = f"{app_id}/{ods_code}.json"

logger.log(LogReference.S3PERMISSIONS001, bucket=config.AUTH_STORE, key=key)
s3_client = get_s3_client()
Expand Down Expand Up @@ -63,12 +59,8 @@ def parse_permissions_file(

app_id = connection_metadata.nrl_app_id
ods_code = connection_metadata.ods_code
ods_code_extension = connection_metadata.ods_code_extension

if ods_code_extension:
key = f"{app_id}/{ods_code}.{ods_code_extension}.json"
else:
key = f"{app_id}/{ods_code}.json"
key = f"{app_id}/{ods_code}.json"

file_path = f"/opt/python/nrlf_permissions/{key}"

Expand Down
41 changes: 1 addition & 40 deletions layer/nrlf/core/dynamodb/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class DocumentPointer(DynamoDBModel):
id: str
nhs_number: str
custodian: str
custodian_suffix: Optional[str] = None
producer_id: str
category_id: str
category: str
Expand Down Expand Up @@ -159,36 +158,6 @@ def from_document_reference(
)
return core_model

@model_validator(mode="before")
@classmethod
def extract_custodian_suffix(cls, values: Dict[str, Any]) -> Dict[str, Any]:
"""
Extract the custodian suffix if it is not provided and the custodian
is in the format <custodian>.<custodian_suffix>
"""
logger.log(LogReference.DOCPOINTER001)

custodian = values.get("custodian")
custodian_suffix = values.get("custodian_suffix")

if custodian and not custodian_suffix:
split_custodian = custodian.split(".")

if len(split_custodian) == 2:
custodian, custodian_suffix = split_custodian
values["custodian"] = custodian

if custodian_suffix is not None:
values["custodian_suffix"] = custodian_suffix

logger.log(
LogReference.DOCPOINTER002,
custodian=values["custodian"],
custodian_suffix=values.get("custodian_suffix"),
)

return values

@model_validator(mode="before")
@classmethod
def inject_producer_id(cls, values: Dict[str, Any]) -> Dict[str, Any]:
Expand Down Expand Up @@ -242,16 +211,8 @@ def validate_producer_id(

id_ = values.get("id")
custodian = values.get("custodian_id")
custodian_suffix = values.get("custodian_suffix")

if custodian and custodian_suffix:
if tuple(producer_id.split(".")) != (custodian, custodian_suffix):
raise ValueError(
f"Producer ID {producer_id} (extracted from '{id_}') is not correctly formed. "
"It is expected to be composed in the form '<custodian_id>.<custodian_suffix>'"
)

elif custodian and producer_id != custodian:
if custodian and producer_id != custodian:
raise ValueError(
f"Producer ID {producer_id} (extracted from '{id_}')"
" does not match the Custodian ID."
Expand Down
10 changes: 0 additions & 10 deletions layer/nrlf/core/dynamodb/repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ def search(
self,
nhs_number: str,
custodian: Optional[str] = None,
custodian_suffix: Optional[str] = None,
pointer_types: Optional[List[str]] = [],
categories: Optional[List[str]] = [],
) -> Iterator[DocumentPointer]:
Expand Down Expand Up @@ -274,15 +273,6 @@ def search(
filter_expressions.append("custodian = :custodian")
expression_values[":custodian"] = custodian

if custodian_suffix:
logger.log(
LogReference.REPOSITORY016,
expression="custodian_suffix = :custodian_suffix",
values=["custodian_suffix"],
)
filter_expressions.append("custodian_suffix = :custodian_suffix")
expression_values[":custodian_suffix"] = custodian_suffix

query = {
"IndexName": "patient_gsi",
"KeyConditionExpression": " AND ".join(key_conditions),
Expand Down
Loading