package Ġcom . github . art emy . kotlin . sandbox . kotlin reactive . external service Ċ Ċ import Ġcom . github . art emy . kotlin . sandbox . kotlin reactive . domain . External Service Response Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . map Ċ import Ġkotlinx . coroutines . flow . single OrNull Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . http . MediaType . APPLICATION _ JSON Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . reactive . function . client . Web Client Ċ import Ġorg . springframework . web . reactive . function . client . body To Flow Ċ Ċ @ Service Ċ class ĠExternal Service Service ( private Ġval Ġweb Client : ĠWeb Client ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger ( java Class ) Ġ} ĊĊĠĠĠ Ġsuspend Ġfun Ġexternal Call (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġweb Client . get (). uri Ġ{ Ġit . path ("/ api "). build () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept ( APPLICATION _ JSON ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. retrieve () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. body To Flow < External Service Response >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . items . first OrNull () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. catch Ġ{ Ġemit ( backend Error ( it )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. single OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbackend Error ( error : ĠThrowable ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . error (" External Ġbackend Ġerror Ġoccurred ", Ġerror ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ