+ private[this] def saveFirstUserState(userID: String) {
+ this._userStateModel.userStateMsg.setIsFirst(true)
+ this._userStateModel.updateUserStateMsg(
+ aquarium.userStateStore.insertUserState(this._userStateModel.userStateMsg)
+ )
+ }
+
+ private[this] def saveSubsequentUserState() {
+ this._userStateModel.userStateMsg.setIsFirst(false)
+ this._userStateModel.updateUserStateMsg(
+ aquarium.userStateStore.insertUserState(this._userStateModel.userStateMsg)
+ )
+ }
+
+ private[this] def loadLastKnownUserStateAndUpdateAgreements() {
+ val userID = this._userStateModel.userID
+ aquarium.userStateStore.findLatestUserState(userID) match {
+ case None ⇒
+ // First user state ever
+ saveFirstUserState(userID)
+
+ case Some(latestUserState) ⇒
+ this._userStateModel.updateUserStateMsg(latestUserState)
+ }
+ }
+
+ private[this] def processResourceEventsAfterLastKnownUserState() {
+ // Update the user state snapshot with fresh (ie not previously processed) events.
+ aquarium.resourceEventStore.foreachResourceEventOccurredInPeriod(
+ this._userStateModel.userID,
+ this._userStateModel.latestResourceEventOccurredMillis,
+ TimeHelpers.nowMillis()
+ )
+ }
+
+ private[this] def makeUserStateMsgUpToDate() {
+ loadLastKnownUserStateAndUpdateAgreements()
+ processResourceEventsAfterLastKnownUserState()
+ }
+
+ private[this] def checkInitial(nextThing: () ⇒ Any = () ⇒ {}): Boolean = {
+ if(!isInitial) {
+ return false
+ }
+
+ val (userCreated, imEventsCount) = createUserAgreementHistoryFromIMEvents(userID)
+
+ if(userCreated) {
+ makeUserStateMsgUpToDate()
+ }
+
+ nextThing()
+
+ true
+ }
+