44import os
55import urllib .parse
66import uuid
7- from typing import Optional , cast
7+ from typing import Any , Optional , cast
88from uuid import uuid4
99
1010from fhir .resources .R4B .bundle import (
3636from common .models .utils .generic_utils import (
3737 get_contained_patient ,
3838 get_occurrence_datetime ,
39- make_search_bundle ,
4039)
4140from common .models .utils .validation_utils import (
4241 get_vaccine_type ,
@@ -103,7 +102,7 @@ def get_immunization_by_identifier(
103102 resource , resource_metadata = self .immunization_repo .get_immunization_by_identifier (identifier )
104103
105104 if not resource :
106- return make_search_bundle ( resource , None , elements , identifier , base_url )
105+ return self . make_empty_identifier_search_bundle ( base_url )
107106
108107 vaccination_type = get_vaccine_type (resource )
109108
@@ -113,7 +112,9 @@ def get_immunization_by_identifier(
113112 patient_full_url = f"urn:uuid:{ str (uuid4 ())} "
114113 filtered_resource = Filter .search (resource , patient_full_url )
115114
116- return make_search_bundle (filtered_resource , resource_metadata .resource_version , elements , identifier , base_url )
115+ return self .make_identifier_search_bundle (
116+ filtered_resource , resource_metadata .resource_version , elements , identifier , base_url
117+ )
117118
118119 def get_immunization_and_version_by_id (self , imms_id : str , supplier_system : str ) -> tuple [Immunization , str ]:
119120 """
@@ -336,6 +337,55 @@ def is_valid_date_to(self, immunization: dict, date_to: Optional[datetime.date])
336337
337338 return occurrence_datetime .date () <= date_to
338339
340+ @staticmethod
341+ def make_identifier_search_bundle (
342+ resource : Optional [dict ],
343+ version_id : Optional [int ],
344+ elements : Optional [set [str ]],
345+ identifier : Identifier ,
346+ base_url : str ,
347+ ) -> FhirBundle :
348+ searched_url = f"{ base_url } ?identifier={ identifier .system } |{ identifier .value } " + (
349+ f"&_elements={ ',' .join (sorted (elements ))} " if elements else ""
350+ )
351+
352+ meta = {"versionId" : version_id }
353+
354+ # Full Immunization payload to be returned if only the identifier parameter was provided and truncated when
355+ # _elements is used
356+ if elements is not None :
357+ resource_for_bundle : dict [str , Any ] = {"resourceType" : "Immunization" }
358+ if "id" in elements :
359+ resource_for_bundle ["id" ] = resource ["id" ]
360+ if "meta" in elements :
361+ resource_for_bundle ["meta" ] = meta
362+
363+ else :
364+ resource_for_bundle = copy .deepcopy (resource )
365+ resource_for_bundle ["meta" ] = meta
366+
367+ entry = BundleEntry .construct (
368+ fullUrl = f"{ base_url } /{ resource ['id' ]} " ,
369+ resource = (
370+ Immunization .construct (** resource_for_bundle )
371+ if elements
372+ else Immunization .parse_obj (resource_for_bundle )
373+ ),
374+ search = BundleEntrySearch .construct (mode = "match" ) if not elements else None ,
375+ )
376+
377+ return FhirBundle (
378+ type = "searchset" ,
379+ link = [BundleLink (relation = "self" , url = searched_url )],
380+ entry = [entry ],
381+ total = 1 ,
382+ )
383+
384+ @staticmethod
385+ def make_empty_identifier_search_bundle (base_url : str ) -> FhirBundle :
386+ no_results_url = f"{ base_url } ?identifier=None"
387+ return FhirBundle (entry = [], link = [BundleLink (relation = "self" , url = no_results_url )], type = "searchset" , total = 0 )
388+
339389 @staticmethod
340390 def process_patient_for_bundle (patient : dict ):
341391 """
0 commit comments