@@ -33,6 +33,7 @@ def __init__(self):
3333 self .staging_s3_bucket_name = os .environ ["STAGING_STORE_BUCKET_NAME" ]
3434 self .table_name = os .environ ["LLOYD_GEORGE_DYNAMODB_NAME" ]
3535 self .destination_bucket_name = os .environ ["LLOYD_GEORGE_BUCKET_NAME" ]
36+ self .doc_type = SnomedCodes .LLOYD_GEORGE .value
3637 self .document_service = DocumentService ()
3738 self .dynamo_service = DynamoDBService ()
3839 self .virus_scan_service = get_virus_scan_service ()
@@ -67,7 +68,7 @@ def handle_upload_document_reference_request(
6768 logger .error (f"Unexpected error processing document reference: { str (e )} " )
6869 logger .error (f"Failed to process document reference: { object_key } " )
6970 return
70-
71+
7172 def _get_infrastructure_for_document_key (self , object_parts : list [str ]) -> None :
7273 doc_type = None
7374 if object_parts [0 ] != "fhir_upload" or not (
@@ -76,6 +77,7 @@ def _get_infrastructure_for_document_key(self, object_parts: list[str]) -> None:
7677 return
7778
7879 try :
80+ self .doc_type = doc_type
7981 self .table_name = self .table_router .resolve (doc_type )
8082 self .destination_bucket_name = self .bucket_router .resolve (doc_type )
8183 except KeyError :
@@ -126,7 +128,9 @@ def _process_preliminary_document_reference(
126128 ):
127129 """Process the preliminary (uploading) document reference with virus scanning and file operations"""
128130 try :
129- virus_scan_result = self ._perform_virus_scan (preliminary_document_reference , object_key )
131+ virus_scan_result = self ._perform_virus_scan (
132+ preliminary_document_reference , object_key
133+ )
130134 preliminary_document_reference .virus_scanner_result = virus_scan_result
131135
132136 if virus_scan_result == VirusScanResult .CLEAN :
@@ -143,22 +147,38 @@ def _process_preliminary_document_reference(
143147 preliminary_document_reference .uploaded = True
144148 preliminary_document_reference .uploading = False
145149
146- updated_doc_status = None
147- if virus_scan_result != VirusScanResult .CLEAN :
148- updated_doc_status = "cancelled"
150+ if self .doc_type .code != SnomedCodes .PATIENT_DATA .value .code :
151+ updated_doc_status = None
152+ if virus_scan_result != VirusScanResult .CLEAN :
153+ updated_doc_status = "cancelled"
149154
150- preliminary_document_reference .doc_status = updated_doc_status
151- self ._update_dynamo_table (preliminary_document_reference )
152- else :
153- updated_doc_status = "final"
154- preliminary_document_reference .doc_status = updated_doc_status
155+ preliminary_document_reference .doc_status = updated_doc_status
156+ self ._update_dynamo_table (preliminary_document_reference )
157+ else :
158+ updated_doc_status = "final"
159+ preliminary_document_reference .doc_status = updated_doc_status
155160
156- self ._finalize_and_supersede_with_transaction (
157- preliminary_document_reference
158- )
161+ self ._finalize_and_supersede_with_transaction (
162+ preliminary_document_reference
163+ )
159164
160- # Update NRL Pointer
161- # TODO: PRMP-390
165+ # Update NRL Pointer
166+ # TODO: PRMP-390
167+ #
168+ else :
169+ try :
170+ preliminary_document_reference .doc_status = (
171+ "cancelled"
172+ if virus_scan_result != VirusScanResult .CLEAN
173+ else "final"
174+ )
175+
176+ self ._update_dynamo_table (preliminary_document_reference )
177+ except Exception as e :
178+ logger .error (
179+ f"Error processing document reference { preliminary_document_reference .id } : { str (e )} "
180+ )
181+ raise
162182
163183 except TransactionConflictException as e :
164184 logger .error (
@@ -300,7 +320,9 @@ def _finalize_and_supersede_with_transaction(self, new_document: DocumentReferen
300320 new_document .uploading = False
301321 new_document .file_size = None
302322 self ._update_dynamo_table (new_document )
303- self .delete_file_from_bucket (new_document .file_location , new_document .s3_version_id )
323+ self .delete_file_from_bucket (
324+ new_document .file_location , new_document .s3_version_id
325+ )
304326 raise
305327 except Exception as e :
306328 logger .error (
@@ -350,22 +372,23 @@ def copy_files_from_staging_bucket(
350372 """Copy files from staging bucket to destination bucket"""
351373 try :
352374 logger .info ("Copying files from staging bucket" )
353-
354- dest_file_key = document_reference .s3_file_key
375+ dest_file_key = f"{ document_reference .nhs_number } /{ document_reference .id } "
376+ if self .doc_type .code != SnomedCodes .PATIENT_DATA .value .code :
377+ dest_file_key = document_reference .s3_file_key
355378
356379 copy_result = self .s3_service .copy_across_bucket (
357380 source_bucket = self .staging_s3_bucket_name ,
358381 source_file_key = source_file_key ,
359382 dest_bucket = self .destination_bucket_name ,
360383 dest_file_key = dest_file_key ,
361384 )
362-
385+ if self .doc_type .code == SnomedCodes .PATIENT_DATA .value .code :
386+ document_reference .s3_file_key = dest_file_key
363387 document_reference .s3_bucket_name = self .destination_bucket_name
364388 document_reference .file_location = document_reference ._build_s3_location (
365389 self .destination_bucket_name , dest_file_key
366390 )
367391 document_reference .s3_version_id = copy_result .get ("VersionId" )
368-
369392 return copy_result
370393
371394 except ClientError as e :
@@ -386,7 +409,9 @@ def delete_file_from_staging_bucket(self, source_file_key: str):
386409 def delete_file_from_bucket (self , file_location : str , version_id : str ):
387410 """Delete file from bucket"""
388411 try :
389- s3_bucket_name , source_file_key = DocumentReference ._parse_s3_location (file_location )
412+ s3_bucket_name , source_file_key = DocumentReference ._parse_s3_location (
413+ file_location
414+ )
390415 logger .info (
391416 f"Deleting file from bucket: { s3_bucket_name } /{ source_file_key } "
392417 )
@@ -412,6 +437,8 @@ def _update_dynamo_table(
412437 "uploaded" ,
413438 "uploading" ,
414439 }
440+ if self .doc_type .code == SnomedCodes .PATIENT_DATA .value .code :
441+ update_fields .add ("s3_file_key" )
415442
416443 self .document_service .update_document (
417444 table_name = self .table_name ,
0 commit comments