Skip to content

Commit db54ece

Browse files
committed
NRL-703 change logic to always delete if perm exists and catch exception and log
1 parent 97bc7cd commit db54ece

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

api/producer/upsertDocumentReference/upsert_document_reference.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ def handler(
108108

109109
if result.resource.relatesTo:
110110
logger.log(LogReference.PROUPSERT006, relatesTo=result.resource.relatesTo)
111-
has_delete_target = True
112111

113112
for idx, relates_to in enumerate(result.resource.relatesTo):
114113
if not (identifier := getattr(relates_to.target.identifier, "value", None)):
@@ -129,22 +128,16 @@ def handler(
129128
diagnostics="The relatesTo target identifier value does not include the expected ODS code for this organisation",
130129
expression=f"relatesTo[{idx}].target.identifier.value",
131130
)
132-
133-
if not (existing_pointer := repository.get_by_id(identifier)):
134-
if (
135-
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL
136-
not in metadata.nrl_permissions
137-
):
131+
if PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL not in metadata.nrl_permissions:
132+
if not (existing_pointer := repository.get_by_id(identifier)):
138133
logger.log(
139134
LogReference.PROCREATE007c, related_identifier=identifier
140135
)
141136
return SpineErrorResponse.BAD_REQUEST(
142137
diagnostics="The relatesTo target document does not exist",
143138
expression=f"relatesTo[{idx}].target.identifier.value",
144139
)
145-
has_delete_target = False
146140

147-
if has_delete_target:
148141
if existing_pointer.nhs_number != core_model.nhs_number:
149142
logger.log(
150143
LogReference.PROUPSERT007d, related_identifier=identifier
@@ -163,7 +156,7 @@ def handler(
163156
expression=f"relatesTo[{idx}].target.identifier.value",
164157
)
165158

166-
if relates_to.code == "replaces" and has_delete_target:
159+
if relates_to.code == "replaces":
167160
logger.log(
168161
LogReference.PROUPSERT008,
169162
relates_to_code=relates_to.code,
@@ -177,7 +170,9 @@ def handler(
177170
pointer_id=result.resource.id,
178171
ids_to_delete=ids_to_delete,
179172
)
180-
saved_model = repository.supersede(core_model, ids_to_delete)
173+
saved_model = repository.supersede(
174+
core_model, ids_to_delete, metadata.nrl_permissions
175+
)
181176
logger.log(LogReference.PROUPSERT999)
182177
return NRLResponse.RESOURCE_SUPERSEDED(resource_id=saved_model.id)
183178

layer/nrlf/core/dynamodb/repository.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
from nrlf.core.boto import get_dynamodb_resource, get_dynamodb_table
99
from nrlf.core.codes import SpineErrorConcept
10+
from nrlf.core.constants import PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL
1011
from nrlf.core.dynamodb.model import DocumentPointer, DynamoDBModel
1112
from nrlf.core.errors import OperationOutcomeError
1213
from nrlf.core.logger import LogReference, logger
@@ -374,12 +375,18 @@ def save(self, item: DocumentPointer) -> DocumentPointer:
374375
return self.update(item)
375376

376377
def supersede(
377-
self, item: DocumentPointer, ids_to_delete: List[str]
378+
self,
379+
item: DocumentPointer,
380+
ids_to_delete: List[str],
381+
nrl_permissions: list[str] = [],
378382
) -> DocumentPointer:
379383
""" """
380384
saved_item = self.create(item)
385+
can_ignore_delete_fail = (
386+
PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL in nrl_permissions
387+
)
381388
for id_ in ids_to_delete:
382-
self.delete_by_id(id_)
389+
self.delete_by_id(id_, can_ignore_delete_fail)
383390

384391
return saved_item
385392

@@ -411,12 +418,34 @@ def delete(self, item: DocumentPointer) -> None:
411418
details=SpineErrorConcept.from_code("INTERNAL_SERVER_ERROR"),
412419
) from exc
413420

414-
def delete_by_id(self, id_: str):
421+
def delete_by_id(self, id_: str, can_ignore_delete_fail: bool):
415422
""" """
416423
producer_id, document_id = id_.split("-", 1)
417424
ods_code_parts = producer_id.split(".")
418425
partition_key = "D#" + "#".join([*ods_code_parts, document_id])
419-
self.table.delete_item(Key={"pk": partition_key, "sk": partition_key})
426+
try:
427+
self.table.delete_item(Key={"pk": partition_key, "sk": partition_key})
428+
except ClientError as exc:
429+
if can_ignore_delete_fail:
430+
logger.log(
431+
LogReference.REPOSITORY026a,
432+
exc_info=sys.exc_info(),
433+
stacklevel=5,
434+
error=str(exc),
435+
)
436+
return
437+
logger.log(
438+
LogReference.REPOSITORY026,
439+
exc_info=sys.exc_info(),
440+
stacklevel=5,
441+
error=str(exc),
442+
)
443+
raise OperationOutcomeError(
444+
status_code="500",
445+
severity="error",
446+
code="exception",
447+
details=SpineErrorConcept.from_code("INTERNAL_SERVER_ERROR"),
448+
) from exc
420449

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

layer/nrlf/core/log_references.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,9 @@ class LogReference(Enum):
101101

102102
REPOSITORY025 = _Reference("DEBUG", "Deleting resource from DynamoDB")
103103
REPOSITORY026 = _Reference("EXCEPTION", "Failed to delete resource from DynamoDB")
104+
REPOSITORY026a = _Reference(
105+
"EXCEPTION", "Ignoring failure to delete resource from DynamoDB"
106+
)
104107
REPOSITORY027 = _Reference("INFO", "Successfully deleted item from DynamoDB")
105108
REPOSITORY028 = _Reference("INFO", "Received page of search results")
106109
REPOSITORY028a = _Reference("DEBUG", "Received page of search results with result")

0 commit comments

Comments
 (0)