/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . Ġfan poll ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ Ċ @ file : Opt In ( Internal Serialization Api :: class ) Ċ Ċ package Ġfan poll . infra . auth . login . session Ċ Ċ import Ġfan poll . infra . auth . principal . Principal Source Ċ import Ġfan poll . infra . auth . principal . User Principal Ċ import Ġfan poll . infra . auth . principal . UserRole Ċ import Ġfan poll . infra . auth . principal . User Type Ċ import Ġfan poll . infra . base . extension . my Equals Ċ import Ġfan poll . infra . base . extension . my HashCode Ċ import Ġfan poll . infra . base . json . Instant Serializer Ċ import Ġfan poll . infra . base . json . json Ċ import Ġfan poll . infra . base . json . path OrNull Ċ import Ġfan poll . infra . base . tenant . TenantId Ċ import Ġfan poll . infra . base . util . Ident ifiable Object Ċ import Ġio . ktor . sessions . generate SessionId Ċ import Ġkotlinx . serialization . Internal Serialization Api Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . builtins . List Serializer Ċ import Ġkotlinx . serialization . json . JsonArray Ċ import Ġkotlinx . serialization . json . JsonObject Ċ import Ġkotlinx . serialization . serializer Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . time . Instant Ċ import Ġjava . util .* Ċ Ċ class ĠUser Session Ġ: ĠIdent ifiable Object < User Session . Id > Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġid : ĠId ĊĠĠĠ Ġval Ġvalue : ĠValue ĊĊĠĠĠ Ġconstructor ( id : ĠId , Ġvalue : ĠValue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġthis . value Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( principal : ĠUser Principal , Ġexpire Time : ĠInstant ?, Ġdata : ĠJsonObject ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġid Ġ= Ġwith ( principal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠId ( user Type . projectId , Ġsource , Ġuser Type , ĠuserId , Ġgenerate SessionId ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvalue Ġ= ĠValue ( id . value , Ġprincipal . create At , Ġexpire Time , Ġprincipal . clientId , Ġprincipal . tenantId , Ġprincipal . roles , Ġdata ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġvalue . toString () ĊĊĠĠĠ Ġdata Ġclass ĠId ( ĊĠĠĠĠĠĠĠ Ġval ĠprojectId : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġsource : ĠPrincipal Source , ĊĠĠĠĠĠĠĠ Ġval Ġuser Type : ĠUser Type , ĊĠĠĠĠĠĠĠ Ġval ĠuserId : ĠUUID , ĊĠĠĠĠĠĠĠ Ġval Ġnonce : ĠString ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString Ġ= Ġ"${ user Type . projectId }:${ source . name }:${ user Type . name }: $ userId :$ nonce " ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġparse ( text : ĠString ): ĠId Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġtext . split (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠId ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs [ 0 ], ĠPrincipal Source . lookup ( s [ 0 ], Ġs [ 1 ]), ĠUser Type . lookup ( s [ 0 ], Ġs [ 2 ]), ĠUUID . fromString ( s [ 3 ]), Ġs [ 4 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġmy Equals ( other , Ġ{ Ġvalue Ġ}) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġmy HashCode ({ Ġvalue Ġ}) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Serializable ĊĠĠĠ Ġdata Ġclass ĠValue ( ĊĠĠĠĠĠĠĠ Ġval Ġsid : ĠString , ĊĠĠĠĠĠĠĠ Ġ@ Serializable ( with Ġ= ĠInstant Serializer :: class ) Ġval Ġlogin Time : ĠInstant , ĊĠĠĠĠĠĠĠ Ġ@ Serializable ( with Ġ= ĠInstant Serializer :: class ) Ġvar Ġexpire Time : ĠInstant ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval ĠclientId : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġtenant Id : ĠTenant Id ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġroles : ĠSet < UserRole >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġdata : ĠJsonObject ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġsession (): ĠUser Session Ġ= ĠUser Session ( Id . parse ( sid ), Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġprincipal (): ĠUser Principal Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠId . parse ( sid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUser Principal ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid . user Type , Ġid . userId , Ġroles , Ġid . source , ĠclientId , Ġtenant Id , Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUser Session ( id , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġmy Equals ( other , Ġ{ Ġsid Ġ}) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġmy HashCode ({ Ġsid Ġ}) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġsid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġsession Ġdata Ġcontent Ġschema Ġmay Ġbe Ġchanged . Ġif Ġwe Ġcan 't Ġdeserialize Ġdata Ġthen Ġreturn Ġnull ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠgetData ( path : ĠString ? Ġ= Ġnull ): ĠT ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġvalue . data ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( session Data Ġ== Ġnull ) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġjson . decode FromJson Element ( T :: class . serializer (), Ġsession Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġsession Data . path OrNull ( path )?. let Ġ{ Ġjson . decode FromJson Element ( T :: class . serializer (), Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ id Ġinvalid Ġsession Ġdata Ġ=> Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠAny > ĠgetData As List ( path : ĠString ): ĠList < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsession Data Ġ= Ġvalue . data ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( session Data Ġ== Ġnull ) Ġnull ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( session Data . path OrNull ( path ) Ġas ? ĠJson Array ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġjson . decode FromJson Element ( List Serializer ( T :: class . serializer ()), Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"$ id Ġinvalid Ġsession Ġdata Ġ=> Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }