package Ġcom . health met rix . lab res . notifications Ċ Ċ import Ġcom . health met rix . lab res . logger Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . util . UUID Ċ Ċ @ Service Ċ class ĠNotify On Status Change UseCase ( ĊĠĠĠ Ġprivate Ġval Ġf cm Notifier : ĠNot ifier < Notification . F cm Notification >, ĊĠĠĠ Ġprivate Ġval Ġhttp Notifier : ĠNot ifier < Notification . Http Notification >, ĊĠĠĠ Ġprivate Ġval Ġmetrics : ĠNotification Metrics Ċ ) Ġ{ ĊĠĠĠ Ġoperator Ġfun Ġinvoke ( orderId : ĠUUID , Ġtargets : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( targets . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" No Ġnotification Ġurl Ġfor Ġ$ orderId ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . count Target Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger . debug (" Sending Ġnotification Ġfor Ġid Ġ$ orderId Ġto Ġ$ targets ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtargets ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġsend Notification ( orderId , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. reduce ( Boolean :: and ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Notification ( orderId : ĠUUID , Ġtarget : ĠString ) Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġnotification Ġ= ĠNotification . from ( target )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotification . Http Notification Ġ-> Ġhttp Notifier . send ( notification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNotification . F cm Notification Ġ-> Ġf cm Notifier . send ( notification ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Notification Ġtype Ġfor Ġid Ġ$ orderId Ġnot Ġsupported : Ġ$ target ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetrics . count Target NotSupported () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ