11import datetime
2- from dataclasses import dataclass
2+ from dataclasses import dataclass , field
33from typing import Optional
44
55from common .models .constants import RedisHashKeys
@@ -33,6 +33,12 @@ def __repr__(self):
3333 return str (self .__dict__ )
3434
3535
36+ @dataclass
37+ class SearchParamsResult :
38+ params : SearchParams
39+ invalid_immunization_targets : list [str ] = field (default_factory = list )
40+
41+
3642def process_patient_identifier (identifier_params : dict [str , list [str ]]) -> str :
3743 """Validate and parse patient identifier parameter.
3844
@@ -65,10 +71,9 @@ def process_patient_identifier(identifier_params: dict[str, list[str]]) -> str:
6571 return nhs_number
6672
6773
68- def process_immunization_target (imms_params : dict [str , list [str ]]) -> set [str ]:
69- """Validate and parse immunization target parameter.
70-
71- :raises ParameterExceptionError:
74+ def process_immunization_target (imms_params : dict [str , list [str ]]) -> tuple [list [str ], list [str ]]:
75+ """Validate and parse immunization target parameter. Returns (valid_vaccine_types, invalid_vaccine_types).
76+ Raises ParameterExceptionError only when no values provided or all values are invalid.
7277 """
7378 vaccine_types = [
7479 vaccine_type
@@ -81,24 +86,27 @@ def process_immunization_target(imms_params: dict[str, list[str]]) -> set[str]:
8186 f"Search parameter { ImmunizationSearchParameterName .IMMUNIZATION_TARGET } must have one or more values."
8287 )
8388
84- valid_vaccine_types = get_redis_client ().hkeys (RedisHashKeys .VACCINE_TYPE_TO_DISEASES_HASH_KEY )
85- if any (x not in valid_vaccine_types for x in vaccine_types ):
89+ valid_vaccine_types_set = set (get_redis_client ().hkeys (RedisHashKeys .VACCINE_TYPE_TO_DISEASES_HASH_KEY ))
90+ valid = [v for v in vaccine_types if v in valid_vaccine_types_set ]
91+ invalid = [v for v in vaccine_types if v not in valid_vaccine_types_set ]
92+
93+ if not valid :
8694 raise ParameterExceptionError (
8795 f"{ ImmunizationSearchParameterName .IMMUNIZATION_TARGET } must be one or more of the following: "
88- f"{ ', ' .join (valid_vaccine_types )} "
96+ f"{ ', ' .join (sorted ( valid_vaccine_types_set ) )} "
8997 )
9098
91- return set ( vaccine_types )
99+ return valid , invalid
92100
93101
94- def process_mandatory_params (params : dict [str , list [str ]]) -> tuple [str , set [str ]]:
95- """Validate mandatory params and return (patient_identifier, vaccine_types ).
102+ def process_mandatory_params (params : dict [str , list [str ]]) -> tuple [str , list [ str ], list [str ]]:
103+ """Validate mandatory params and return (patient_identifier, valid_vaccine_types, invalid_vaccine_types ).
96104 Raises ParameterExceptionError for any validation error.
97105 """
98106 patient_identifier = process_patient_identifier (params )
99- vaccine_types = process_immunization_target (params )
107+ vaccine_types , invalid_vaccine_types = process_immunization_target (params )
100108
101- return patient_identifier , vaccine_types
109+ return patient_identifier , vaccine_types , invalid_vaccine_types
102110
103111
104112def process_optional_params (
@@ -146,11 +154,11 @@ def process_optional_params(
146154 return date_from , date_to , include
147155
148156
149- def validate_and_retrieve_search_params (params : dict [str , list [str ]]) -> SearchParams :
157+ def validate_and_retrieve_search_params (params : dict [str , list [str ]]) -> SearchParamsResult :
150158 """Validate and retrieve search parameters.
151159 :raises ParameterExceptionError:
152160 """
153- patient_identifier , vaccine_types = process_mandatory_params (params )
161+ patient_identifier , vaccine_types , invalid_vaccine_types = process_mandatory_params (params )
154162 date_from , date_to , include = process_optional_params (params )
155163
156164 if date_from and date_to and date_from > date_to :
@@ -159,7 +167,8 @@ def validate_and_retrieve_search_params(params: dict[str, list[str]]) -> SearchP
159167 f"{ ImmunizationSearchParameterName .DATE_TO } "
160168 )
161169
162- return SearchParams (patient_identifier , vaccine_types , date_from , date_to , include )
170+ search_params = SearchParams (patient_identifier , set (vaccine_types ), date_from , date_to , include )
171+ return SearchParamsResult (params = search_params , invalid_immunization_targets = invalid_vaccine_types )
163172
164173
165174def parse_search_params (search_params_in_req : dict [str , list [str ]]) -> dict [str , list [str ]]:
0 commit comments