package Ġdev . f rit z 2 . repositories . local storage Ċ Ċ import Ġdev . f rit z 2 . repositories . Entity Repository Ċ import Ġdev . f rit z 2 . repositories . Query Repository Ċ import Ġdev . f rit z 2 . repositories . Resource NotFoundException Ċ import Ġdev . f rit z 2 . resource . Resource Ċ import Ġkotlinx . browser . localStorage Ċ import Ġkotlinx . browser . window Ċ import Ġorg . w 3 c . dom . get Ċ Ċ /** Ċ Ġ* Ġprovides Ġcr ud - functions Ġfor Ġ[ localStorage ] Ġto Ġdeal Ġwith Ġa Ġsingle Ġentity Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ġto Ġuse Ċ Ġ* Ġ@ param Ġprefix Ġprefix Ġused Ġfor Ġpre pending Ġto Ġthe Ġkeys Ċ Ġ*/ Ċ fun Ġ< T , ĠI > ĠlocalStorage Entity ( resource : ĠResource < T , ĠI >, Ġprefix : ĠString ): ĠEntity Repository < T , ĠI > Ġ= ĊĠĠĠ ĠLocal Storage Entity ( resource , Ġprefix ) Ċ Ċ /** Ċ Ġ* Ġprovides Ġcr ud - functions Ġfor Ġ[ localStorage ] Ġto Ġdeal Ġwith Ġa Ġsingle Ġentity Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġthe Ġ[ Resource ] Ġto Ġuse Ċ Ġ* Ġ@ param Ġprefix Ġprefix Ġused Ġfor Ġpre pending Ġto Ġthe Ġkeys Ċ Ġ*/ Ċ class ĠLocal Storage Entity < T , ĠI >( private Ġval Ġresource : ĠResource < T , ĠI >, Ġprivate Ġval Ġprefix : ĠString ) Ġ: ĊĠĠĠ ĠEntity Repository < T , ĠI > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġloads Ġan Ġentity Ġfrom Ġ[ localStorage ] Ġusing Ġprefix Ġand Ġid Ġdefined Ġin Ġ[ resource ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġof Ġthe Ġentity Ġto Ġload ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġentity Ġ( ident ified Ġby Ġ[ id ]) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġload ( id : ĠI ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġwindow . localStorage [" ${ prefix }.${ resource . serialize Id ( id )} "] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠResource NotFoundException ( resource . serialize Id ( id )) ĊĠĠĠĠĠĠĠ Ġreturn Ġresource . deserialize ( result ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadds Ġor Ġupdates Ġthe Ġserialized Ġentity Ġto Ġ[ localStorage ] ĊĠĠĠĠ Ġ* Ġusing Ġ[ prefix ] Ġand Ġid Ġdefined Ġin Ġ[ resource ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġadd Ġor Ġupdate ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġadded Ġor Ġsaved Ġentity ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd OrUpdate ( entity : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . localStorage . setItem ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ prefix }.${ resource . serialize Id ( resource . id Provider ( entity )) }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . serialize ( entity ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġentity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġthe Ġentity Ġin Ġ[ localStorage ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġdelete ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entity : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . localStorage . removeItem ("${ prefix }.${ resource . serialize Id ( resource . id Provider ( entity )) }") ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ /** Ċ Ġ* Ġprovides Ġfunctions Ġto Ġdeal Ġwith Ġqueries Ġto Ġa Ġspecific Ġ[ Resource ] Ġin Ġ[ localStorage ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġresource Ġin Ġ[ localStorage ] Ċ Ġ* Ġ@ param Ġprefix Ġprefix Ġused Ġfor Ġpre pending Ġto Ġthe Ġkeys Ċ Ġ* Ġ@ param Ġrun Query Ġfunction Ġto Ġapply Ġa Ġgiven Ġquery Ġto Ġthe Ġcollection Ġof Ġentities Ġin Ġ[ localStorage ] Ċ Ġ*/ Ċ fun Ġ< T , ĠI , ĠQ > ĠlocalStorage Query ( ĊĠĠĠ Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġprefix : ĠString , ĊĠĠĠ Ġrun Query : Ġ( List < T >, ĠQ ) Ġ-> ĠList < T > Ġ= Ġ{ Ġentities , Ġ_ Ġ-> Ġentities Ġ} Ċ ): ĠLocal Storage Query < T , ĠI , ĠQ > Ġ= ĠLocal Storage Query ( resource , Ġprefix , Ġrun Query ) Ċ Ċ /** Ċ Ġ* Ġprovides Ġfunctions Ġto Ġdeal Ġwith Ġqueries Ġto Ġa Ġspecific Ġ[ Resource ] Ġin Ġ[ localStorage ] Ċ Ġ* Ċ Ġ* Ġ@ param Ġresource Ġdefinition Ġof Ġresource Ġin Ġ[ localStorage ] Ċ Ġ* Ġ@ param Ġprefix Ġprefix Ġused Ġfor Ġpre pending Ġto Ġthe Ġkeys Ċ Ġ* Ġ@ param Ġrun Query Ġfunction Ġto Ġapply Ġa Ġgiven Ġquery Ġto Ġthe Ġcollection Ġof Ġentities Ġin Ġ[ localStorage ] Ċ Ġ*/ Ċ class ĠLocal Storage Query < T , ĠI , ĠQ >( ĊĠĠĠ Ġprivate Ġval Ġresource : ĠResource < T , ĠI >, ĊĠĠĠ Ġprivate Ġval Ġprefix : ĠString , ĊĠĠĠ Ġprivate Ġinline Ġval Ġrun Query : Ġ( List < T >, ĠQ ) Ġ-> ĠList < T > Ġ= Ġ{ Ġentities , Ġ_ Ġ-> Ġentities Ġ} Ċ ) Ġ: ĠQuery Repository < T , ĠI , ĠQ > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġapplies Ġa Ġgiven Ġquery Ġto Ġthe Ġcollection Ġof Ġentities ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġquery Ġobject Ġdefining Ġthe Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġresult Ġof Ġthe Ġquery ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġquery ( query : ĠQ ): ĠList < T > Ġ= Ġrun Query ( build List Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( index Ġin Ġ 0 Ġuntil ĠlocalStorage . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠlocalStorage . key ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( key Ġ!= Ġnull Ġ&& Ġkey . startsWith ( prefix )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( resource . deserialize ( localStorage [ key ] !! )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, Ġquery ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġupdates Ġgiven Ġentities Ġto Ġ[ localStorage ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġentity Ġlist Ġto Ġsave ĊĠĠĠĠ Ġ* Ġ@ return Ġentity Ġlist Ġafter Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate Many ( entities : ĠList < T >, Ġentities ToUpdate : ĠList < T >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġupdated : ĠMap < I , ĠT > Ġ= Ġ( entities Ġ+ Ġentities ToUpdate ). groupBy { Ġresource . id Provider ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit . size Ġ> Ġ 1 Ġ}. map Values Ġ{ Ġ( id , Ġentities ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentity Ġ= Ġentities . last () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwindow . localStorage . setItem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ prefix }.${ resource . serialize Id ( id )} ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresource . serialize ( entity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . map Ġ{ Ġupdated [ resource . id Provider ( it )] Ġ?: Ġit Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġadds Ġor Ġupdates Ġa Ġgiven Ġentity Ġto Ġ[ localStorage ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġentity Ġlist ĊĠĠĠĠ Ġ* Ġ@ param Ġentity Ġentity Ġto Ġadd Ġor Ġupdate ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġadd Ġor Ġupdate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġadd OrUpdate ( entities : ĠList < T >, Ġentity : ĠT ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . localStorage . setItem ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ prefix }.${ resource . serialize Id ( resource . id Provider ( entity )) }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . serialize ( entity ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġin List Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġupdated List Ġ= Ġentities . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( resource . id Provider ( it ) Ġ== Ġresource . id Provider ( entity )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin List Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif ( in List ) Ġupdated List Ġelse Ġentities Ġ+ Ġentity ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete ById ( id : ĠI ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwindow . localStorage . removeItem ("${ prefix }.${ resource . serialize Id ( id )} ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġone Ġentity Ġfrom Ġ[ localStorage ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġlist Ġbefore Ġdeletion ĊĠĠĠĠ Ġ* Ġ@ param Ġid Ġidentifies Ġthe Ġentity Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ return Ġentity Ġlist Ġafter Ġdeletion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entities : ĠList < T >, Ġid : ĠI ): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete ById ( id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . filter Not Ġ{ Ġresource . id Provider ( it ) Ġ== Ġid Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġdeletes Ġmultiple Ġentities Ġfrom Ġ[ localStorage ] ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġentities Ġlist Ġbefore Ġdeletion ĊĠĠĠĠ Ġ* Ġ@ param Ġids Ġidentifies Ġthe Ġentities Ġto Ġdelete ĊĠĠĠĠ Ġ* Ġ@ return Ġlist Ġafter Ġdeletion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( entities : ĠList < T >, Ġids : ĠList < I >): ĠList < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġids . forEach (:: delete ById ) ĊĠĠĠĠĠĠĠ Ġreturn Ġentities . filter Not Ġ{ Ġids . contains ( resource . id Provider ( it )) Ġ} ĊĠĠĠ Ġ} Ċ Ċ }