package Ġgov . cdc . prime . router . azure Ċ Ċ import Ġcom . google . common . net . HttpHeaders Ċ import Ġcom . microsoft . azure . functions . HttpMethod Ċ import Ġcom . microsoft . azure . functions . HttpRequest Message Ċ import Ġcom . microsoft . azure . functions . HttpResponse Message Ċ import Ġcom . microsoft . azure . functions . HttpStatus Ċ import Ġcom . microsoft . azure . functions . annotation . Authorization Level Ċ import Ġcom . microsoft . azure . functions . annotation . FunctionName Ċ import Ġcom . microsoft . azure . functions . annotation . Http Trigger Ċ import Ġcom . microsoft . azure . functions . annotation . Storage Account Ċ import Ġgov . cdc . prime . router . Action Error Ċ import Ġgov . cdc . prime . router . Action Log Ċ import Ġgov . cdc . prime . router . Action LogLevel Ċ import Ġgov . cdc . prime . router . Action Logger Ċ import Ġgov . cdc . prime . router . Client Source Ċ import Ġgov . cdc . prime . router . DEFAULT _ SEPARATOR Ċ import Ġgov . cdc . prime . router . Invalid Param Message Ċ import Ġgov . cdc . prime . router . Invalid Report Message Ċ import Ġgov . cdc . prime . router . Options Ċ import Ġgov . cdc . prime . router . ROUTE _ TO _ SEPARATOR Ċ import Ġgov . cdc . prime . router . Report Ċ import Ġgov . cdc . prime . router . Sender Ċ import Ġgov . cdc . prime . router . Sender . Processing Type Ċ import Ġgov . cdc . prime . router . azure . db . enums . Task Action Ċ import Ġgov . cdc . prime . router . common . Environment Ċ import Ġgov . cdc . prime . router . common . Jack son Mapper Utilities Ċ import Ġgov . cdc . prime . router . engine . Raw Submission Ċ import Ġgov . cdc . prime . router . tokens . Authentication Strategy Ċ import Ġgov . cdc . prime . router . tokens . Ok ta Authentication Ċ import Ġgov . cdc . prime . router . tokens . Principal Level Ċ import Ġgov . cdc . prime . router . tokens . Token Authentication Ċ import Ġorg . apache . logging . log 4 j . kotlin . Logging Ċ Ċ private Ġconst Ġval ĠCLIENT _ PARAMETER Ġ= Ġ" client " Ċ private Ġconst Ġval ĠP AY LOAD _ NAME _ PARAMETER Ġ= Ġ" payload name " Ċ private Ġconst Ġval ĠOPTION _ PARAMETER Ġ= Ġ" option " Ċ private Ġconst Ġval ĠDEFAULT _ PARAMETER Ġ= Ġ" default " Ċ private Ġconst Ġval ĠROUT E _ TO _ PARAMETER Ġ= Ġ" route To " Ċ private Ġconst Ġval ĠALLOW _ DUPLIC ATES _ PARAMETER Ġ= Ġ" allow Duplicate " Ċ private Ġconst Ġval ĠPROCESS ING _ TYPE _ PARAMETER Ġ= Ġ" processing " Ċ Ċ /** Ċ Ġ* ĠAzure ĠFunctions Ġwith ĠHTTP ĠTrigger . Ċ Ġ* ĠThis Ġis Ġbasically Ġthe Ġ" front Ġend " Ġof Ġthe ĠHub . ĠReports Ġcome Ġin Ġhere . Ċ Ġ*/ Ċ class ĠReport Function ( ĊĠĠĠ Ġprivate Ġval Ġworkflow Engine : ĠWorkflow Engine Ġ= ĠWorkflow Engine (), ĊĠĠĠ Ġprivate Ġval Ġaction History : ĠAction History Ġ= ĠAction History ( Task Action . receive ) Ċ ) Ġ: ĠLogging Ġ{ ĊĊĠĠĠ Ġdata Ġclass ĠValid ated Request ( ĊĠĠĠĠĠĠĠ Ġval Ġcontent : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠ Ġval Ġdefaults : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠ Ġval Ġroute To : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġval Ġsender : ĠSender , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPOST Ġa Ġreport Ġto Ġthe Ġrouter ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ see Ġ ../../../ docs / api / reports . yml ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ FunctionName (" reports ") ĊĠĠĠ Ġ@ Storage Account (" Azure Web Jobs Storage ") ĊĠĠĠ Ġfun Ġrun ( ĊĠĠĠĠĠĠĠ Ġ@ Http Trigger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" req ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= Ġ[ HttpMethod . POST ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Level Ġ= ĠAuthorization Level . FUNCTION ĊĠĠĠĠĠĠĠ Ġ) Ġrequest : ĠHttpRequest Message < String ? >, ĊĠĠĠ Ġ): ĠHttpResponse Message Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsender Name Ġ= Ġextract Client ( request ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sender Name . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHttp Utilities . bad ( request , Ġ" Expected Ġa Ġ'$ CLIENT _ PARAMETER ' Ġquery Ġparameter ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSender Ġshould Ġeventually Ġbe Ġobtained Ġdirectly Ġfrom Ġwho Ġis Ġauthenticated ĊĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġworkflow Engine . settings . find Sender ( sender Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠHttp Utilities . bad ( request , Ġ"' $ CLIENT _ PARAMETER :$ sender Name ': Ġunknown Ġsender ") ĊĠĠĠĠĠĠĠ Ġaction History . track Action Params ( request ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Request ( request , Ġsender ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ex . message Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex . message !! , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Utilities . internal ErrorResponse ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠW aters ĠAPI , Ġin Ġmemory Ġof ĠDr . ĠMichael ĠW aters ĊĠĠĠĠ Ġ* Ġ( The Ġolder Ġversion Ġof Ġthis ĠAPI Ġis Ġ"/ api / reports ") ĊĠĠĠĠ Ġ* ĠPOST Ġa Ġreport Ġto Ġthe Ġrouter , Ġusing ĠFHIR Ġauth Ġsecurity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ FunctionName (" w aters ") ĊĠĠĠ Ġ@ Storage Account (" Azure Web Jobs Storage ") ĊĠĠĠ Ġfun Ġreport ( ĊĠĠĠĠĠĠĠ Ġ@ Http Trigger ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġ" w aters ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= Ġ[ HttpMethod . POST ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Level Ġ= ĠAuthorization Level . AN ONY MO US ĊĠĠĠĠĠĠĠ Ġ) Ġrequest : ĠHttpRequest Message < String ? >, ĊĠĠĠ Ġ): ĠHttpResponse Message Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsender Name Ġ= Ġextract Client ( request ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sender Name . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHttp Utilities . bad ( request , Ġ" Expected Ġa Ġ'$ CLIENT _ PARAMETER ' Ġquery Ġparameter ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠSender Ġshould Ġeventually Ġbe Ġobtained Ġdirectly Ġfrom Ġwho Ġis Ġauthenticated ĊĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġworkflow Engine . settings . find Sender ( sender Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠHttp Utilities . bad ( request , Ġ"' $ CLIENT _ PARAMETER :$ sender Name ': Ġunknown Ġsender ") ĊĊĠĠĠĠĠĠĠ Ġval Ġauthentication Strategy Ġ= ĠAuthentication Strategy . auth Strategy ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . headers [" authentication - type "], ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPrincipal Level . USER , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Engine . db ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Action Params ( request ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authentication Strategy Ġis ĠOk ta Authentication ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġreport Ġis Ġcoming Ġfrom Ġa Ġsender Ġthat Ġis Ġusing ĠOk ta , Ġso Ġset Ġ" ok ta Sender " Ġto Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġauthentication Strategy . check Access ( request , Ġsender . organization Name , Ġtrue , Ġaction History ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ check Access Ġprocess Request ( request , Ġsender ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( authentication Strategy Ġis ĠToken Authentication ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclaims Ġ= Ġauthentication Strategy . check AccessToken ( request , Ġ"${ sender . fullName }. report ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn ĠHttp Utilities . un authorized Response ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Claims Ġfor Ġ${ claims [" sub "]} Ġvalidated . Ġ ĠBegin ning Ġingest Report .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprocess Request ( request , Ġsender ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ex . message Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex . message !! , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHttp Utilities . internal ErrorResponse ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠHttp Utilities . bad ( request , Ġ" Failed Ġauthorization ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandles Ġan Ġincoming Ġrequest Ġafter Ġit Ġhas Ġbeen Ġauthenticated Ġby Ġeither Ġ/ reports Ġor Ġ/ w aters Ġendpoint . ĊĠĠĠĠ Ġ* ĠDoes Ġbasic Ġvalidation Ġand Ġeither Ġp ushes Ġit Ġinto Ġthe Ġsync Ġor Ġasync Ġpipeline , Ġbased Ġon Ġthe Ġvalue ĊĠĠĠĠ Ġ* Ġof Ġthe Ġincoming ĠPROCESS ING _ TYPE _ PARAMETER Ġquery Ġstring Ġvalue ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest ĠThe Ġincoming Ġrequest ĊĠĠĠĠ Ġ* Ġ@ param Ġsender ĠThe Ġsender Ġrecord , Ġpulled Ġfrom Ġthe Ġdatabase Ġbased Ġon Ġsender Ġname Ġon Ġthe Ġrequest ĊĠĠĠĠ Ġ* Ġ@ return ĠReturns Ġan ĠHttpResponse Message Ġindicating Ġthe Ġresult Ġof Ġthe Ġoperation Ġand Ġany Ġresulting Ġinformation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġprocess Request ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠHttpRequest Message < String ? >, ĊĠĠĠĠĠĠĠ Ġsender : ĠSender , ĊĠĠĠ Ġ): ĠHttpResponse Message Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġdetermine Ġif Ġwe Ġshould Ġbe Ġfollowing Ġthe Ġsync Ġor Ġasync Ġworkflow ĊĠĠĠĠĠĠĠ Ġval Ġis Async Ġ= Ġprocessing Type ( request , Ġsender ) Ġ== ĠProcessing Type . async ĊĠĠĠĠĠĠĠ Ġ// Ġallow Ġduplicates Ġ' override ' Ġparam ĊĠĠĠĠĠĠĠ Ġval Ġallow Duplicates Param Ġ= Ġrequest . query Parameters . get OrDefault ( ALLOW _ DUPLIC ATES _ PARAMETER , Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġoptions Text Ġ= Ġrequest . query Parameters . get OrDefault ( OPTION _ PARAMETER , Ġ" None ") ĊĠĠĠĠĠĠĠ Ġval Ġhttp Status : ĠHttpStatus Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoptions Ġ= ĠOptions . valueOf ( options Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Name Ġ= Ġextract Payload Name ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Action Sender Info ( sender . fullName , Ġpayload Name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtrack Ġthe Ġsending Ġorganization Ġand Ġclient Ġbased Ġon Ġthe Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidated Request Ġ= Ġvalidate Request ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġraw Body Ġ= Ġvalidated Request . content . toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġoverride Ġparameter Ġis Ġpopulated , Ġuse Ġthat , Ġotherwise Ġuse Ġthe Ġsender Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġallow Duplicates Ġ= Ġif ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(! allow Duplicates Param . isNull OrEmpty ()) Ġallow Duplicates Param Ġ== Ġ" true " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender . allow Duplicates ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġwe Ġare Ġprevent ing Ġduplicate Ġfiles Ġfrom Ġthe Ġsender ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! allow Duplicates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġthis Ġshould Ġbe Ġonly Ġcalculated Ġonce Ġand Ġpassed , Ġbut Ġthe Ġunderlying Ġfunctions Ġare Ġcalled Ġby ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġreceive Ġ( this ), Ġprocess , Ġbatch , Ġsend Ġand Ġthose Ġdo Ġ* not * Ġneed Ġto Ġcalculate Ġit Ġoutside Ġof Ġthe Ġfunction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġso Ġleaving Ġit Ġ 2 x Ġcalculating Ġon Ġreceive Ġfor Ġthe Ġtime Ġbeing . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠBlob Access . sha 2 5 6 Digest ( raw Body ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthrows ĠAction Error Ġif Ġthere Ġis Ġa Ġduplicate Ġdetected ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworkflow Engine . verify No Duplicate File ( sender , Ġdigest , Ġpayload Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġprocess Ġthe Ġreport Ġif Ġwe Ġare Ġnot Ġchecking Ġfor Ġconnection Ġor Ġvalidation . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options Ġ!= ĠOptions . Check Connections Ġ&& Ġoptions Ġ!= ĠOptions . Validate Payload ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( report , Ġaction Logs ) Ġ= Ġworkflow Engine . parse Report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . content , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . defaults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceived Blob Info Ġ= Ġworkflow Engine . record Received Report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport , Ġraw Body , Ġsender , Ġaction History , Ġpayload Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPl aces Ġa Ġmessage Ġon Ġa Ġqueue Ġfor Ġasync Ġtesting Ġof Ġthe Ġfhir Ġengine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġtriggers Ġif Ġa Ġfeature Ġflag Ġis Ġenabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute To F HI RE ng ine ( received Blob Info , Ġsender , Ġworkflow Engine . queue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġchecks Ġfor Ġerrors Ġfrom Ġparse Report ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( options Ġ!= ĠOptions . Skip Invalid Items Ġ&& Ġaction Logs . has Errors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġaction Logs . exception ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Logs ( action Logs . logs ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcall Ġthe Ġcorrect Ġprocessing Ġfunction Ġbased Ġon Ġprocessing Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Async ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Async ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . defaults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . route To ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrouting Warnings Ġ= Ġworkflow Engine . route Report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptions , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . defaults , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidated Request . route To , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Logs ( routing Warnings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . CREATED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĠHttpStatus . OK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAction Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Logs ( e . details ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Logs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Log ( Invalid Report Message ( e . message Ġ?: Ġ" Invalid Ġrequest ."), Ġtype Ġ= ĠAction LogLevel . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . track Logs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Log ( Invalid Report Message ( e . message Ġ?: Ġ" Invalid Ġrequest ."), Ġtype Ġ= ĠAction LogLevel . error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . BAD _ REQUEST ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġaction History . track ActionResult ( http Status ) ĊĠĠĠĠĠĠĠ Ġworkflow Engine . record Action ( action History ) ĊĊĠĠĠĠĠĠĠ Ġcheck ( action History . action . action Id Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġval Ġsubmission Ġ= ĠSub missions Facade . instance . find Detailed Submission History ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . action . sending Org , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction History . action . action Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġrequest . create Response Builder ( http Status ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( HttpHeaders . CONTENT _ TYPE , Ġ" application / json ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJack son Mapper Utilities . allow Unknown s Mapper ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writer WithDefault PrettyPrinter () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. writeValue AsString ( submission ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Headers . LOCATION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . uri . resolve ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ api / history /${ sender . organization Name }/ submissions /${ action History . action . action Id }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġ// Ġqueue Ġmessages Ġhere Ġafter Ġall Ġtask Ġ/ Ġaction Ġrecords Ġare Ġin ĊĠĠĠĠĠĠĠ Ġaction History . queue Messages ( workflow Engine ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhaving Ġto Ġbuild Ġresponse Ġtwice Ġin Ġorder Ġto Ġsave Ġit Ġand Ġthen Ġinclude Ġa Ġresponse Ġwith Ġthe Ġresulting Ġaction ID ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPut Ġa Ġmessage Ġon Ġa Ġqueue Ġto Ġtrigger Ġthe ĠFHIR ĠEngine Ġpipeline Ġfor Ġtesting ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġroute To F HI RE ng ine ( blob Info : ĠBlob Access . Blob Info , Ġsender : ĠSender , Ġqueue : ĠQueue Access ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Environment . Feature Flags . F HIR _ ENGINE _ TEST _ PIPELINE . enabled ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( blob Info . format ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġlimit Ġto Ġhl 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReport . Format . HL 7 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueue . sendMessage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfhir Queue Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRaw Submission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblob Info . blob Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBlob Access . digest ToString ( blob Info . digest ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender . fullName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). serialize () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġqueue Ġmessage Ġfor ĠFHIR ĠEngine : ĠNo Ġaction Ġrequired Ġduring Ġtesting Ġphase \ n $ t ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract Ġclient Ġheader Ġfrom Ġrequest Ġheaders Ġor Ġquery Ġstring Ġparameters ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġhttp Ġrequest Ġmessage Ġfrom Ġthe Ġclient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Client ( request : ĠHttpRequest Message < String ?> ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġclient Ġcan Ġbe Ġin Ġthe Ġheader Ġor Ġin Ġthe Ġurl Ġparameters : ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . headers [ CLIENT _ PARAMETER ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrequest . query Parameters . get OrDefault ( CLIENT _ PARAMETER , Ġ"") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExtract Ġthe Ġoptional Ġpayload Name Ġ( aka Ġsender - supp lied Ġfilename ) Ġfrom Ġrequest Ġheaders Ġor Ġquery Ġstring Ġparameters ĊĠĠĠĠ Ġ* Ġ@ param Ġrequest Ġthe Ġhttp Ġrequest Ġmessage Ġfrom Ġthe Ġclient ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġextract Payload Name ( request : ĠHttpRequest Message < String ?> ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġpayload Name Ġcan Ġbe Ġin Ġthe Ġheader Ġor Ġin Ġthe Ġurl Ġparameters . Ġ ĠReturn Ġnull Ġif Ġnot Ġfound . ĊĠĠĠĠĠĠĠ Ġreturn Ġrequest . headers [ PAYLOAD _ NAME _ PARAMETER ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrequest . query Parameters [ PAYLOAD _ NAME _ PARAMETER ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocessing Type ( request : ĠHttpRequest Message < String ? >, Ġsender : ĠSender ): ĠProcessing Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprocessing TypeString Ġ= Ġrequest . query Parameters [ PROCESS ING _ TYPE _ PARAMETER ] ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( processing TypeString Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender . processing Type ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProcessing Type . valueOf IgnoreCase ( processing TypeString ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsender . processing Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġprocess Async ( ĊĠĠĠĠĠĠĠ Ġparsed Report : ĠReport , ĊĠĠĠĠĠĠĠ Ġoptions : ĠOptions , ĊĠĠĠĠĠĠĠ Ġdefaults : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġroute To : ĠList < String > ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġparsed Report . copy () ĊĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġparsed Report . sources . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Unable Ġto Ġprocess Ġreport Ġ${ report . id } Ġbecause Ġsender Ġsources Ġcollection Ġis Ġempty .") ĊĠĠĠĠĠĠĠ Ġval Ġsender Name Ġ= Ġ( sender Ġas ĠClient Source ). name ĊĊĠĠĠĠĠĠĠ Ġif Ġ( report . body Format Ġ!= ĠReport . Format . INTERNAL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" Processing Ġa Ġnon Ġinternal Ġreport Ġasync .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġprocess Event Ġ= ĠProcess Event ( Event . Event Action . PROCESS , Ġreport . id , Ġoptions , Ġdefaults , Ġroute To ) ĊĊĠĠĠĠĠĠĠ Ġval Ġblob Info Ġ= Ġworkflow Engine . blob . generate Body And Upload Report ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender Name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= Ġprocess Event . event Action ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġaction History . track Created Report ( process Event , Ġreport , Ġblob Info ) ĊĠĠĠĠĠĠĠ Ġ// Ġadd Ġtask Ġto Ġtask Ġtable ĊĠĠĠĠĠĠĠ Ġworkflow Engine . insert Process Task ( report , Ġreport . body Format . toString (), Ġblob Info . blob Url , Ġprocess Event ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġvalidate Request ( request : ĠHttpRequest Message < String ?> ): ĠValid ated Request Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaction Logs Ġ= ĠAction Logger () ĊĠĠĠĠĠĠĠ ĠHttp Utilities . payload Size Check ( request ) ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver Names Text Ġ= Ġrequest . query Parameters . get OrDefault ( ROUTE _ TO _ PARAMETER , Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġroute To Ġ= Ġif Ġ( receiver Names Text . isNotBlank ()) Ġreceiver Names Text . split ( ROUTE _ TO _ SEPARATOR ) Ġelse Ġempty List () ĊĠĠĠĠĠĠĠ Ġroute To . filter Ġ{ Ġworkflow Engine . settings . find Receiver ( it ) Ġ== Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġaction Logs . error ( Invalid Param Message (" Invalid Ġreceiver Ġname : Ġ$ it ")) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġclient Name Ġ= Ġextract Client ( request ) ĊĠĠĠĠĠĠĠ Ġif Ġ( client Name . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message (" Expected Ġa Ġ'$ CLIENT _ PARAMETER ' Ġquery Ġparameter ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġsender Ġ= Ġworkflow Engine . settings . find Sender ( client Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sender Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message ("' $ CLIENT _ PARAMETER :$ client Name ': Ġunknown Ġsender ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġschema Ġ= Ġworkflow Engine . metadata . find Schema ( sender ?. schema Name Ġ?: Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ( sender Ġ!= Ġnull Ġ&& Ġschema Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInvalid Param Message ("' $ CLIENT _ PARAMETER :$ client Name ': Ġunknown Ġschema Ġ'${ sender . schema Name }' ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġrequest . headers . get OrDefault ( HttpHeaders . CONTENT _ TYPE . lowercase (), Ġ"") ĊĠĠĠĠĠĠĠ Ġif Ġ( contentType . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message (" Missing Ġ${ HttpHeaders . CONTENT _ TYPE } Ġheader ")) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( sender Ġ!= Ġnull Ġ&& Ġsender . format . mime Type Ġ!= ĠcontentType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message (" Expecting Ġcontent Ġtype Ġof Ġ'${ sender . format . mime Type }' ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġrequest . body Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( content . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message (" Expecting Ġa Ġpost Ġmessage Ġwith Ġcontent ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sender Ġ== Ġnull Ġ|| Ġschema Ġ== Ġnull Ġ|| Ġcontent . isEmpty () Ġ|| Ġaction Logs . has Errors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġaction Logs . exception ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Values Ġ= Ġif Ġ( request . query Parameters . containsKey ( DEFAULT _ PARAMETER )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġrequest . query Parameters . get OrDefault ( DEFAULT _ PARAMETER , Ġ""). split (",") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparts Ġ= Ġit . split ( DEFAULT _ SEPARATOR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parts . size Ġ!= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message ("' $ it ' Ġis Ġnot Ġa Ġvalid Ġdefault ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġschema . findElement ( parts [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message ("' ${ parts [ 0 ]} ' Ġis Ġnot Ġa Ġvalid Ġelement Ġname ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġelement . check For Error ( parts [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Logs . error ( Invalid Param Message ( error . message )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( parts [ 0 ], Ġparts [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toMap () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty Map () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠValid ated Request ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Values , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroute To , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsender , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }