1414from services .base .dynamo_service import DynamoDBService
1515from services .base .s3_service import S3Service
1616from utils .audit_logging_setup import LoggingService
17+ from utils .common_query_filters import NotDeleted
1718from utils .dynamo_query_filter_builder import DynamoQueryFilterBuilder
1819from utils .lambda_exceptions import OdsReportException
1920from utils .request_context import request_context
@@ -37,7 +38,7 @@ def get_nhs_numbers_by_ods(
3738 is_upload_to_s3_needed : bool = False ,
3839 file_type_output : FileType = FileType .CSV ,
3940 ):
40- results = self .scan_table_with_filter (ods_code )
41+ results = self .query_table_by_index (ods_code )
4142 nhs_numbers = {
4243 item .get (DocumentReferenceMetadataFields .NHS_NUMBER .value )
4344 for item in results
@@ -98,27 +99,41 @@ def build_filter_expression(ods_codes: list[str]):
9899 )
99100
100101 def query_table_by_index (self , ods_code : str ):
102+ ods_codes = [ods_code ]
103+ authorization_user = getattr (request_context , "authorization" , {})
104+ if (
105+ authorization_user
106+ and authorization_user .get ("repository_role" ) == RepositoryRole .PCSE .value
107+ ):
108+ ods_codes = [
109+ PatientOdsInactiveStatus .SUSPENDED ,
110+ PatientOdsInactiveStatus .DECEASED ,
111+ ]
101112 results = []
102-
103- response = self .dynamo_service .query_table_by_index (
104- table_name = self .table_name ,
105- index_name = "OdsCodeIndex" ,
106- search_key = DocumentReferenceMetadataFields .CURRENT_GP_ODS .value ,
107- search_condition = ods_code ,
108- )
109- results += response ["Items" ]
110-
111- if not response ["Items" ]:
112- logger .info ("No records found for ODS code {}" .format (ods_code ))
113- while "LastEvaluatedKey" in response :
113+ for ods_code in ods_codes :
114114 response = self .dynamo_service .query_table_by_index (
115115 table_name = self .table_name ,
116116 index_name = "OdsCodeIndex" ,
117- exclusive_start_key = response ["LastEvaluatedKey" ],
118117 search_key = DocumentReferenceMetadataFields .CURRENT_GP_ODS .value ,
119118 search_condition = ods_code ,
119+ query_filter = NotDeleted ,
120120 )
121121 results += response ["Items" ]
122+
123+ while "LastEvaluatedKey" in response :
124+ response = self .dynamo_service .query_table_by_index (
125+ table_name = self .table_name ,
126+ index_name = "OdsCodeIndex" ,
127+ exclusive_start_key = response ["LastEvaluatedKey" ],
128+ search_key = DocumentReferenceMetadataFields .CURRENT_GP_ODS .value ,
129+ search_condition = ods_code ,
130+ query_filter = NotDeleted ,
131+ )
132+ results += response ["Items" ]
133+
134+ if not results :
135+ logger .info ("No records found for ODS code {}" .format (ods_code ))
136+ raise OdsReportException (404 , LambdaError .NoDataFound )
122137 return results
123138
124139 def create_and_save_ods_report (
0 commit comments