Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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,
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