1- from nrlf .core .constants import PERMISSION_AUDIT_DATES_FROM_PAYLOAD
1+ from nrlf .core .constants import (
2+ PERMISSION_AUDIT_DATES_FROM_PAYLOAD ,
3+ PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL ,
4+ )
25from nrlf .core .decorators import request_handler
36from nrlf .core .dynamodb .repository import DocumentPointer , DocumentPointerRepository
47from nrlf .core .logger import LogReference , logger
@@ -105,6 +108,7 @@ def handler(
105108
106109 if result .resource .relatesTo :
107110 logger .log (LogReference .PROUPSERT006 , relatesTo = result .resource .relatesTo )
111+ has_delete_target = True
108112
109113 for idx , relates_to in enumerate (result .resource .relatesTo ):
110114 if not (identifier := getattr (relates_to .target .identifier , "value" , None )):
@@ -127,27 +131,39 @@ def handler(
127131 )
128132
129133 if not (existing_pointer := repository .get_by_id (identifier )):
130- logger .log (LogReference .PROUPSERT007c , related_identifier = identifier )
131- return SpineErrorResponse .BAD_REQUEST (
132- diagnostics = "The relatesTo target document does not exist" ,
133- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
134- )
135-
136- if existing_pointer .nhs_number != core_model .nhs_number :
137- logger .log (LogReference .PROUPSERT007d , related_identifier = identifier )
138- return SpineErrorResponse .BAD_REQUEST (
139- diagnostics = "The relatesTo target document NHS number does not match the NHS number in the request" ,
140- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
141- )
142-
143- if existing_pointer .type != core_model .type :
144- logger .log (LogReference .PROUPSERT007e , related_identifier = identifier )
145- return SpineErrorResponse .BAD_REQUEST (
146- diagnostics = "The relatesTo target document type does not match the type in the request" ,
147- expression = f"relatesTo[{ idx } ].target.identifier.value" ,
148- )
149-
150- if relates_to .code == "replaces" :
134+ if (
135+ PERMISSION_SUPERSEDE_IGNORE_DELETE_FAIL
136+ not in metadata .nrl_permissions
137+ ):
138+ logger .log (
139+ LogReference .PROCREATE007c , related_identifier = identifier
140+ )
141+ return SpineErrorResponse .BAD_REQUEST (
142+ diagnostics = "The relatesTo target document does not exist" ,
143+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
144+ )
145+ has_delete_target = False
146+
147+ if has_delete_target :
148+ if existing_pointer .nhs_number != core_model .nhs_number :
149+ logger .log (
150+ LogReference .PROUPSERT007d , related_identifier = identifier
151+ )
152+ return SpineErrorResponse .BAD_REQUEST (
153+ diagnostics = "The relatesTo target document NHS number does not match the NHS number in the request" ,
154+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
155+ )
156+
157+ if existing_pointer .type != core_model .type :
158+ logger .log (
159+ LogReference .PROUPSERT007e , related_identifier = identifier
160+ )
161+ return SpineErrorResponse .BAD_REQUEST (
162+ diagnostics = "The relatesTo target document type does not match the type in the request" ,
163+ expression = f"relatesTo[{ idx } ].target.identifier.value" ,
164+ )
165+
166+ if relates_to .code == "replaces" and has_delete_target :
151167 logger .log (
152168 LogReference .PROUPSERT008 ,
153169 relates_to_code = relates_to .code ,
0 commit comments