package Ġnet . nem eros a . on track . extension . indicators . store Ċ Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġnet . nem eros a . on track . common . Time Ċ import Ġnet . nem eros a . on track . extension . indicators . model . Indicator Ċ import Ġnet . nem eros a . on track . json . as Json Ċ import Ġnet . nem eros a . on track . json . as Json String Ċ import Ġnet . nem eros a . on track . json . parse Ċ import Ġnet . nem eros a . on track . model . Ack Ċ import Ġnet . nem eros a . on track . model . security . Security Service Ċ import Ġnet . nem eros a . on track . model . structure . Project Ċ import Ġnet . nem eros a . on track . repository . support . store . Entity DataStore Ċ import Ġnet . nem eros a . on track . repository . support . store . Entity DataStore Filter Ċ import Ġnet . nem eros a . on track . repository . support . store . Entity DataStore Record Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . time . Duration Ċ Ċ @ Service Ċ class ĠIndicator Store Impl ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġentity DataStore : ĠEntity DataStore , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsecurity Service : ĠSecurity Service Ċ ) Ġ: ĠIndicator Store Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġload Indicator ( project : ĠProject , Ġtype : ĠString , Ġprevious : ĠDuration ?): ĠStored Indicator ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity DataStore . getBy Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity DataStore Filter ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category ( STORE _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Count ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Before Time ( previous ?. let Ġ{ ĠTime . now () Ġ- Ġit Ġ}) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġrecord Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Stored Indicator ( record ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Indicator History ( project : ĠProject , Ġtype : ĠString , Ġoffset : ĠInt , Ġsize : ĠInt ): ĠList < Stored Indicator > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġentity DataStore . getBy Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity DataStore Filter ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category ( STORE _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Offset ( offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Count ( size ) ĊĠĠĠĠĠĠĠ Ġ). map NotNull Ġ{ Ġrecord Ġ-> Ġto Stored Indicator ( record ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Count Indicator History ( project : ĠProject , Ġtype Id : ĠString ): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity DataStore . getCount By Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity DataStore Filter ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category ( STORE _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name ( type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġto Stored Indicator ( record : ĠEntity DataStore Record ): ĠStored Indicator ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrep Ġ= Ġrecord . data . parse < Stored Indicator Representation >() ĊĠĠĠĠĠĠĠ Ġreturn ĠStored Indicator ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġrep . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġrep . comment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsignature Ġ= Ġrecord . signature ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġload Previous Indicator ( project : ĠProject , Ġtype Id : ĠString ): ĠStored Indicator ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġthe Ġcurrent Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġload Indicator ( project , Ġtype Id ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠGets Ġits ĠJSON Ġvalue ĊĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġcurrent . value ?. as Json String () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ// ĠGetting Ġthe Ġfirst Ġindicator Ġwhose Ġvalue Ġif Ġdifferent Ġthan Ġthe Ġcurrent Ġone ĊĠĠĠĠĠĠĠ Ġreturn Ġentity DataStore . getBy Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity DataStore Filter ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category ( STORE _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name ( type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Count ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Json Filter (" json :: json b -> ' value ' Ġ<> ĠCAST (: json ĠAS ĠJSON B )", Ġ" json " Ġto Ġjson ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġto Stored Indicator ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġstore Indicator ( project : ĠProject , Ġtype : ĠString , Ġindicator : ĠStored Indicator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGets Ġthe Ġlast Ġversion Ġof Ġthe Ġindicator ĊĠĠĠĠĠĠĠ Ġval Ġlast Ġ= Ġload Indicator ( project , Ġtype ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Ġ== Ġnull Ġ|| Ġlast . value Ġ!= Ġindicator . value Ġ|| Ġlast . comment Ġ!= Ġindicator . comment ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity DataStore . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTORE _ CATEGORY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindicator . signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStored Indicator Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġindicator . value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġindicator . comment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). as Json () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Indicator ( project : ĠProject , Ġtype Id : ĠString ): ĠAck Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġload Indicator ( project , Ġtype Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġentity DataStore . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTORE _ CATEGORY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsecurity Service . current Signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStored Indicator Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomment Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). as Json () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠAck . validate ( existing Ġ!= Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete Indicator ByType ( type Id : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġentity DataStore . delete By Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity DataStore Filter ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Category ( STORE _ CATEGORY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Name ( type Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Count ( Int . MAX _ VALUE ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTORE _ CATEGORY Ġ= ĠIndicator :: class . java . name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠStored Indicator Representation ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue : ĠJsonNode ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomment : ĠString ? ĊĠĠĠ Ġ) Ċ Ċ }