@@ -482,16 +482,15 @@ def _validate_id(self, _id: str) -> Optional[dict]:
482482 else :
483483 return None
484484
485- def _validate_identifier_system (self , _id : str , _element : str ) -> Optional [dict ]:
486-
485+ def _validate_identifier_system (self , _id : str , _elements : str ) -> Optional [dict ]:
487486 if not _id :
488487 return create_operation_outcome (
489488 resource_id = str (uuid .uuid4 ()),
490489 severity = Severity .error ,
491490 code = Code .invalid ,
492491 diagnostics = (
493- "Search parameter immunization. identifier must have one value and must be in the format of "
494- '"immunization. identifier.system|immunization. identifier.value" '
492+ "Search parameter identifier must have one value and must be in the format of "
493+ '"identifier.system|identifier.value" '
495494 'e.g. "http://xyz.org/vaccs|2345-gh3s-r53h7-12ny"'
496495 ),
497496 )
@@ -501,27 +500,23 @@ def _validate_identifier_system(self, _id: str, _element: str) -> Optional[dict]
501500 severity = Severity .error ,
502501 code = Code .invalid ,
503502 diagnostics = (
504- "Search parameter immunization. identifier must be in the format of "
505- '"immunization. identifier.system|immunization. identifier.value" '
503+ "Search parameter identifier must be in the format of "
504+ '"identifier.system|identifier.value" '
506505 'e.g. "http://xyz.org/vaccs|2345-gh3s-r53h7-12ny"'
507506 ),
508507 )
509- if not _element :
510- return create_operation_outcome (
511- resource_id = str (uuid .uuid4 ()),
512- severity = Severity .error ,
513- code = Code .invalid ,
514- diagnostics = "_element must be one or more of the following: id,meta" ,
515- )
516- element_lower = _element .lower ()
517- result = element_lower .split ("," )
518- is_present = all (key in ["id" , "meta" ] for key in result )
519- if not is_present :
508+
509+ if not _elements :
510+ return None
511+
512+ requested_elements = {e .strip ().lower () for e in _elements .split ("," ) if e .strip ()}
513+ requested_elements_valid = requested_elements .issubset ({"id" , "meta" })
514+ if _elements and not requested_elements_valid :
520515 return create_operation_outcome (
521516 resource_id = str (uuid .uuid4 ()),
522517 severity = Severity .error ,
523518 code = Code .invalid ,
524- diagnostics = "_element must be one or more of the following: id,meta" ,
519+ diagnostics = "_elements must be one or more of the following: id,meta" ,
525520 )
526521
527522 def _create_bad_request (self , message ):
@@ -549,47 +544,62 @@ def authorize_request(self, aws_event: dict) -> Optional[dict]:
549544 return self .create_response (500 , id_error )
550545
551546 def fetch_identifier_system_and_element (self , event : dict ):
547+ """
548+ Extracts `identifier` and `_elements` from an incoming FHIR search request.
549+
550+ FHIR search supports two input formats:
551+ 1. GET search: parameters appear in the query string (e.g. ?identifier=abc123&_elements=id,meta)
552+ 2. POST search: parameters appear in the request body, form-encoded (e.g. identifier=abc123&_elements=id,meta)
553+
554+ This function handles both cases, returning:
555+ - The extracted identifier value
556+ - The extracted _elements value
557+ - Any validation check result for disallowed keys
558+ - Booleans indicating whether identifier/_elements were present
559+ """
560+
552561 query_params = event .get ("queryStringParameters" , {})
553562 body = event ["body" ]
554563 not_required_keys = ["-date.from" , "-date.to" , "-immunization.target" , "_include" , "patient.identifier" ]
564+
565+ # Get Search Query Parameters
555566 if query_params and not body :
556- # Check for the presence of 'immunization.identifier' and '_element'
557- query_string_has_immunization_identifier = "immunization.identifier" in event .get (
558- "queryStringParameters" , {}
559- )
560- query_string_has_element = "_element" in event .get ("queryStringParameters" , {})
561- immunization_identifier = query_params .get ("immunization.identifier" , "" )
562- element = query_params .get ("_element" , "" )
567+ query_string_has_immunization_identifier = "identifier" in query_params
568+ query_string_has_element = "_elements" in query_params
569+ identifier = query_params .get ("identifier" , "" )
570+ element = query_params .get ("_elements" , "" )
563571 query_check = check_keys_in_sources (event , not_required_keys )
564572
565573 return (
566- immunization_identifier ,
574+ identifier ,
567575 element ,
568576 query_check ,
569577 query_string_has_immunization_identifier ,
570578 query_string_has_element ,
571579 )
580+
581+ # Post Search Identifier by body form
572582 if body and not query_params :
573583 decoded_body = base64 .b64decode (body ).decode ("utf-8" )
574584 parsed_body = urllib .parse .parse_qs (decoded_body )
575- # Attempt to extract 'immunization. identifier' and '_element '
576- converted_identifer = ""
577- converted_element = ""
578- immunization_identifier = parsed_body .get ("immunization. identifier" , "" )
579- if immunization_identifier :
580- converted_identifer = "" .join (immunization_identifier )
581- _element = parsed_body .get ("_element " , "" )
582- if _element :
583- converted_element = "" .join (_element )
584- body_has_immunization_identifier = "immunization. identifier" in parsed_body
585- body_has_immunization_element = "_element " in parsed_body
585+ # Attempt to extract 'identifier' and '_elements '
586+ converted_identifier = ""
587+ converted_elements = ""
588+ identifier = parsed_body .get ("identifier" , "" )
589+ if identifier :
590+ converted_identifier = "" .join (identifier )
591+ _elements = parsed_body .get ("_elements " , "" )
592+ if _elements :
593+ converted_elements = "" .join (_elements )
594+ body_has_identifier = "identifier" in parsed_body
595+ body_has_immunization_elements = "_elements " in parsed_body
586596 body_check = check_keys_in_sources (event , not_required_keys )
587597 return (
588- converted_identifer ,
589- converted_element ,
598+ converted_identifier ,
599+ converted_elements ,
590600 body_check ,
591- body_has_immunization_identifier ,
592- body_has_immunization_element ,
601+ body_has_identifier ,
602+ body_has_immunization_elements ,
593603 )
594604
595605 def create_response_for_identifier (self , not_required , has_identifier , has_element ):
@@ -598,16 +608,7 @@ def create_response_for_identifier(self, not_required, has_identifier, has_eleme
598608 resource_id = str (uuid .uuid4 ()),
599609 severity = Severity .error ,
600610 code = Code .server_error ,
601- diagnostics = "Search parameter should have either immunization.identifier or patient.identifier" ,
602- )
603- return self .create_response (400 , error )
604-
605- if "patient.identifier" not in not_required and not_required and has_identifier :
606- error = create_operation_outcome (
607- resource_id = str (uuid .uuid4 ()),
608- severity = Severity .error ,
609- code = Code .server_error ,
610- diagnostics = "Search parameter immunization.identifier must have the following parameter: _element" ,
611+ diagnostics = "Search parameter should have either identifier or patient.identifier" ,
611612 )
612613 return self .create_response (400 , error )
613614
@@ -616,7 +617,7 @@ def create_response_for_identifier(self, not_required, has_identifier, has_eleme
616617 resource_id = str (uuid .uuid4 ()),
617618 severity = Severity .error ,
618619 code = Code .server_error ,
619- diagnostics = "Search parameter _element must have the following parameter: immunization. identifier" ,
620+ diagnostics = "Search parameter _elements must have the following parameter: identifier" ,
620621 )
621622 return self .create_response (400 , error )
622623
0 commit comments