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,58 @@ def is_valid_date_to(self, immunization: dict, date_to: Optional[datetime.date])
336337
337338 return occurrence_datetime .date () <= date_to
338339
340+ def make_identifier_search_bundle (
341+ self ,
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+ if not resource :
353+ return self .make_empty_identifier_search_bundle (searched_url )
354+
355+ meta = {"versionId" : version_id }
356+
357+ # Full Immunization payload to be returned if only the identifier parameter was provided and truncated when
358+ # _elements is used
359+ if elements is not None :
360+ resource_for_bundle : dict [str , Any ] = {"resourceType" : "Immunization" }
361+ if "id" in elements :
362+ resource_for_bundle ["id" ] = resource ["id" ]
363+ if "meta" in elements :
364+ resource_for_bundle ["meta" ] = meta
365+
366+ else :
367+ resource_for_bundle = copy .deepcopy (resource )
368+ resource_for_bundle ["meta" ] = meta
369+
370+ entry = BundleEntry .construct (
371+ fullUrl = f"{ base_url } /{ resource ['id' ]} " ,
372+ resource = (
373+ Immunization .construct (** resource_for_bundle )
374+ if elements
375+ else Immunization .parse_obj (resource_for_bundle )
376+ ),
377+ search = BundleEntrySearch .construct (mode = "match" ) if not elements else None ,
378+ )
379+
380+ return FhirBundle (
381+ type = "searchset" ,
382+ link = [BundleLink (relation = "self" , url = searched_url )],
383+ entry = [entry ],
384+ total = 1 ,
385+ )
386+
387+ @staticmethod
388+ def make_empty_identifier_search_bundle (base_url : str ) -> FhirBundle :
389+ no_results_url = f"{ base_url } ?identifier=None"
390+ return FhirBundle (entry = [], link = [BundleLink (relation = "self" , url = no_results_url )], type = "searchset" , total = 0 )
391+
339392 @staticmethod
340393 def process_patient_for_bundle (patient : dict ):
341394 """
0 commit comments