package Ġorg . ost el co . prime . storage . document store Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . getOrElse Ċ import Ġcom . google . cloud . Timestamp Ċ import Ġorg . ost el co . prime . getLogger Ċ import Ġorg . ost el co . prime . model . Application Token Ċ import Ġorg . ost el co . prime . model . Severity Ċ import Ġorg . ost el co . prime . storage . Document Store Ċ import Ġorg . ost el co . prime . storage . document store . Config Registry . config Ċ import Ġorg . ost el co . prime . store . datastore . Entity Store Ċ import Ġjava . util .* Ċ Ċ class ĠDocument DataStore Ġ: ĠDocument Store Ġby ĠDocument DataStore Singleton Ċ Ċ object ĠDocument DataStore Singleton Ġ: ĠDocument Store Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġby Ġget Logger () ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠP ARENT _ KIND Ġ= Ġ" org . ost el co . prime . model . Customer " ĊĊĠĠĠ Ġprivate Ġval Ġnotification Token Store Ġ= ĠEntity Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Class Ġ= ĠApplication Token :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġconfig . store Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= Ġconfig . namespace ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġcustomer Activity Store Ġ= ĠEntity Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity Class Ġ= ĠCustomer Activity :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġconfig . store Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnamespace Ġ= Ġconfig . namespace ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Notification Tokens ( customer Id : ĠString ): ĠCollection < Application Token > Ġ= Ġnotification Token Store ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fetch All ( parent Kind Ġ= ĠP ARENT _ KIND , Ġparent Key String Ġ= Ġcustomer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ Ġempty List () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Notification Token ( customer Id : ĠString , Ġtoken : ĠApplication Token ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRemove Ġany Ġother Ġentries Ġwith Ġthe Ġsame Ġtoken . ĊĠĠĠĠĠĠĠ Ġget Notification Tokens ( customer Id ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . token Type Ġ== Ġtoken . token Type Ġ&& Ġit . token Ġ== Ġtoken . token Ġ&& Ġit . application ID Ġ!= Ġtoken . application ID ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġremove Notification Token ( customer Id , Ġit . application ID ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnotification Token Store . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . application ID , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( PARENT _ KIND , Ġcustomer Id ) ĊĠĠĠĠĠĠĠ Ġ). is Right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Notification Token ( customer Id : ĠString , Ġapplication ID : ĠString ): ĠApplication Token ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnotification Token Store . fetch ( application ID , ĠPair ( PARENT _ KIND , Ġcustomer Id )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. getOrElse Ġ{ Ġnull Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Notification Token ( customer Id : ĠString , Ġapplication ID : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnotification Token Store . delete ( application ID , ĠPair ( PARENT _ KIND , Ġcustomer Id )). is Right () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġlog Customer Activity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Id : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Activity : Ġorg . ost el co . prime . model . Customer Activity ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġcustomer Activity Store . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Ġ= ĠCustomer Activity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= ĠTimestamp . of ( Date ( customer Activity . timestamp )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Ġ= Ġcustomer Activity . severity . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġcustomer Activity . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey String Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparents Ġ= Ġ* array Of ( Pair ( PARENT _ KIND , Ġcustomer Id )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Customer Activity History ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Id : ĠString ): ĠEither < String , ĠCollection < org . ost el co . prime . model . Customer Activity >> Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcustomer Activity Store . fetch All ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Kind Ġ= ĠP ARENT _ KIND , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Key String Ġ= Ġcustomer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcustomer Activity List Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustomer Activity List . map Ġ{ Ġcustomer Activity Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorg . ost el co . prime . model . Customer Activity ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimestamp Ġ= Ġcustomer Activity . timestamp . toDate (). time , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Ġ= ĠSeverity . valueOf ( customer Activity . severity ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġcustomer Activity . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. sorted By Descending Ġ{ Ġit . timestamp Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Left Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġfetch Ġcustomer Ġactivity Ġhistory ", Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . message Ġ?: Ġ" Exception Ġwithout Ġmessage ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }