package Ġio . rob ust a . nik otor . user Ċ Ċ import Ġio . rob ust a . nik otor . core . Event Ċ import Ġio . rob ust a . nik otor . core . Projection Updater Ċ import Ġio . rob ust a . nik otor . data . DataSet Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ val Ġusers Database Ġ= ĠDataSet < User >() Ċ val Ġaccount Set Ġ= ĠDataSet < Account >() Ċ val Ġvisit Set Ġ= ĠDataSet < Visit >() Ċ val Ġlogin Attempts Ġ= ĠDataSet < Login Attempt >() Ċ Ċ val Ġactiv ationToken Database Ġ= ĠDataSet < Activ ationToken Record >() ĊĊ Ċ class ĠUsers Projection Updater ( user Bundle : ĠUser Bundle ) Ġ: ĠProjection Updater Ġ{ ĊĠĠĠ Ġoverride Ġval Ġconcerned Events Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Registered Event :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Activated Event :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPassword Updated Event :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAsk Password Reset Event :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Updated Event :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUser Removed Event :: class . java ) ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupdate With Event ( event : ĠEvent <* >) Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser Registered Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Ġ= Ġevent . payload . user ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠShould Ġbe Ġtransaction al Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusers Database . add ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactiv ationToken Database . add ( Activ ationToken Record ( user )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Set . add ( Account ( user , Ġevent . payload . hashed Password )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ/* ĠEnd Ġof Ġtransaction Ġ*/ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠUser Activated Event Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactivated User Ġ= Ġquery User By Email ( event . payload . email ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" User Ġ${ event . payload . email } Ġdis appe ared ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivated User . activated Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPassword Updated Event Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Set . update ( Account ( User ( event . payload . email ), Ġevent . payload . hashed Password )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠLogin Event Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogin Attempts . add ( Login Attempt ( event . payload . email , Ġevent . payload . token )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ