package Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . features . forecast s Ċ Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . base . Error Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . base . Success Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . custom . errors . ErrorHandler Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . custom . errors . No DataException Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . custom . errors . No Response Exception Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . entity map pers . forecast s . Forecast Mapper Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . extensions . apply Common Side Effects Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . features . home . di . Home Scope Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . network . api . Open Weather Api Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . network . response . ErrorResponse Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . room . dao . forecast s . Forecast Dao Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . room . dao . utils . String KeyValue Dao Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . room . models . forecast s . Db Forecast Ċ import Ġcom . sk ander jab ou zi . kotlin coroutines plus flow . utils . Utils Ċ import Ġkotlinx . coroutines . Dispatch ers Ċ import Ġkotlinx . coroutines . flow . catch Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġjavax . inject . Inject Ċ Ċ @ Home Scope Ċ class ĠFore casts Repository Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġopen Weather Api : ĠOpen Weather Api , ĊĠĠĠ Ġprivate Ġval Ġforecast Dao : ĠFore cast Dao , ĊĠĠĠ Ġprivate Ġval Ġstring KeyValue Dao : ĠString KeyValue Dao Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġforecast Cache Threshold Millis Ġ= Ġ 3 Ġ* Ġ 3 6 0 0 0 0 0 L Ġ// 3 Ġhours // ĊĊĠĠĠ Ġfun Ġget Forecast s ( city Id : ĠInt ) Ġ= Ġflow Ġ{ ĊĠĠĠĠĠĠĠ Ġstring KeyValue Dao . get ( Utils . LAST _ FORE CAST S _ API _ CALL _ TIMESTAMP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġ! Utils . should Call Api ( it . value , Ġforecast Cache Threshold Millis ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġemit ( getData Or Error ( No DataException ())) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġemit (( get Forecast From API ( city Id ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. apply Common Side Effects () ĊĠĠĠĠĠĠĠ Ġ. catch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( getData Or Error ( it )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Forecast From API ( city Id : ĠInt ) Ġ= Ġopen Weather Api . get Weather Forecast ( city Id ) ĊĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Successful Ġ&& Ġbody () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstring KeyValue Dao . insert ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUtils . getCurrent Time KeyValuePair ( Utils . LAST _ FORE CAST S _ API _ CALL _ TIMESTAMP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforecast Dao . delete All And Insert ( Forecast Mapper ( body () !! ). map ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetData Or Error ( No DataException ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNo Response Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠError Handler . parse Error < ErrorResponse >( error Body ()) ?. message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠgetData Or Error ( throwable : ĠThrowable ) Ġ= ĊĠĠĠĠĠĠĠ Ġforecast Dao . get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġdb Value Ġ-> ĠSuccess ( get Forecast List ( db Value )) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠError ( throwable ) ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġget Forecast List ( db Forecast : ĠDb Forecast ) Ġ= Ġwith Context ( Dispatch ers . Default ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdb Forecast . list . map Ġ{ Ġit . forecast Ġ} ĊĠĠĠ Ġ} Ċ } Ċ