From e164dea18e9b3a21001768098367a2f5bd6bef3a Mon Sep 17 00:00:00 2001 From: Petar Bozin Date: Thu, 2 Mar 2017 19:59:51 +0100 Subject: [PATCH] Refactored RemotedataActors, improved ActorSystem configuration --- src/main/resources/common.conf | 68 -- src/main/resources/obplocaldata.conf | 6 - src/main/resources/obpremotedata.conf | 6 - .../resources/props/sample.props.template | 13 +- src/main/resources/remotelookup.conf | 6 - src/main/scala/bootstrap/liftweb/Boot.scala | 15 +- .../code/accountholder/AccountHolders.scala | 6 +- .../code/metadata/comments/Comments.scala | 4 +- .../counterparties/Counterparties.scala | 6 +- src/main/scala/code/metadata/tags/Tags.scala | 4 +- .../scala/code/remotedata/Remotedata.scala | 756 ------------------ .../remotedata/RemotedataAccountHolders.scala | 43 + .../RemotedataAccountHoldersActor.scala | 66 ++ .../code/remotedata/RemotedataActor.scala | 705 ---------------- .../remotedata/RemotedataActorSystem.scala | 42 + .../code/remotedata/RemotedataActors.scala | 123 +++ .../code/remotedata/RemotedataComments.scala | 65 ++ .../remotedata/RemotedataCommentsActor.scala | 70 ++ .../code/remotedata/RemotedataConfig.scala | 106 +++ .../remotedata/RemotedataCounterparties.scala | 131 +++ .../RemotedataCounterpartiesActor.scala | 119 +++ .../code/remotedata/RemotedataTags.scala | 66 ++ .../code/remotedata/RemotedataTagsActor.scala | 70 ++ .../code/remotedata/RemotedataUsers.scala | 210 +++++ .../remotedata/RemotedataUsersActor.scala | 166 ++++ .../code/remotedata/RemotedataViews.scala | 331 ++++++++ .../remotedata/RemotedataViewsActor.scala | 237 ++++++ src/main/scala/code/users/Users.scala | 6 +- src/main/scala/code/views/Views.scala | 6 +- .../api/LocalMappedConnectorTestSetup.scala | 2 +- ...onnectorSetupWithStandardPermissions.scala | 2 +- .../code/sandbox/SandboxDataLoadingTest.scala | 2 +- 32 files changed, 1880 insertions(+), 1578 deletions(-) delete mode 100644 src/main/resources/common.conf delete mode 100644 src/main/resources/obplocaldata.conf delete mode 100644 src/main/resources/obpremotedata.conf delete mode 100644 src/main/resources/remotelookup.conf delete mode 100644 src/main/scala/code/remotedata/Remotedata.scala create mode 100644 src/main/scala/code/remotedata/RemotedataAccountHolders.scala create mode 100644 src/main/scala/code/remotedata/RemotedataAccountHoldersActor.scala delete mode 100644 src/main/scala/code/remotedata/RemotedataActor.scala create mode 100644 src/main/scala/code/remotedata/RemotedataActorSystem.scala create mode 100644 src/main/scala/code/remotedata/RemotedataActors.scala create mode 100644 src/main/scala/code/remotedata/RemotedataComments.scala create mode 100644 src/main/scala/code/remotedata/RemotedataCommentsActor.scala create mode 100644 src/main/scala/code/remotedata/RemotedataConfig.scala create mode 100644 src/main/scala/code/remotedata/RemotedataCounterparties.scala create mode 100644 src/main/scala/code/remotedata/RemotedataCounterpartiesActor.scala create mode 100644 src/main/scala/code/remotedata/RemotedataTags.scala create mode 100644 src/main/scala/code/remotedata/RemotedataTagsActor.scala create mode 100644 src/main/scala/code/remotedata/RemotedataUsers.scala create mode 100644 src/main/scala/code/remotedata/RemotedataUsersActor.scala create mode 100644 src/main/scala/code/remotedata/RemotedataViews.scala create mode 100644 src/main/scala/code/remotedata/RemotedataViewsActor.scala diff --git a/src/main/resources/common.conf b/src/main/resources/common.conf deleted file mode 100644 index d6b4ecea1..000000000 --- a/src/main/resources/common.conf +++ /dev/null @@ -1,68 +0,0 @@ -akka { - - extensions = ["com.romix.akka.serialization.kryo.KryoSerializationExtension$"] - - actor { - provider = "akka.remote.RemoteActorRefProvider" - - kryo { - type = "graph" - idstrategy = "default" - buffer-size = 65536 - max-buffer-size = -1 - use-manifests = false - use-unsafe = true - post-serialization-transformations = "off" - #post-serialization-transformations = "lz4,aes" - #encryption { - # aes { - # mode = "AES/CBC/PKCS5Padding" - # key = j68KkRjq21ykRGAQ - # IV-length = 16 - # } - #} - implicit-registration-logging = true - kryo-trace = false - resolve-subclasses = true - } - - serializers { - #java = "akka.serialization.JavaSerializer" - kryo = "com.romix.akka.serialization.kryo.KryoSerializer" - } - - serialization-bindings { - "net.liftweb.common.Full" = kryo, - "net.liftweb.common.Empty" = kryo, - "net.liftweb.common.Box" = kryo, - "net.liftweb.common.ParamFailure" = kryo, - "code.api.APIFailure" = kryo, - "code.views.RemoteViewCaseClasses" = kryo, - "code.model.BankAccount" = kryo, - "code.model.View" = kryo, - "code.model.dataAccess.ViewImpl" = kryo, - "code.model.User" = kryo, - "code.model.ViewId" = kryo, - "code.model.ViewUID" = kryo, - //"code.model.Permission" = kryo, - "scala.Unit" = kryo, - "scala.Boolean" = kryo, - "java.io.Serializable" = kryo, - "scala.collection.immutable.List" = kryo, - "akka.actor.ActorSelectionMessage" = kryo - } - - } - - remote { - netty { - hostname = "127.0.0.1" - tcp { - send-buffer-size = 50000000 - receive-buffer-size = 50000000 - maximum-frame-size = 52428800 - } - } - } - -} diff --git a/src/main/resources/obplocaldata.conf b/src/main/resources/obplocaldata.conf deleted file mode 100644 index 8132e3a15..000000000 --- a/src/main/resources/obplocaldata.conf +++ /dev/null @@ -1,6 +0,0 @@ -include "common" - -akka { - remote.netty.tcp.hostname = "127.0.0.1" - remote.netty.tcp.port = 5446 -} diff --git a/src/main/resources/obpremotedata.conf b/src/main/resources/obpremotedata.conf deleted file mode 100644 index fa5edd7e3..000000000 --- a/src/main/resources/obpremotedata.conf +++ /dev/null @@ -1,6 +0,0 @@ -include "common" - -akka { - remote.netty.tcp.hostname = "10.38.16.163" - remote.netty.tcp.port = 5448 -} diff --git a/src/main/resources/props/sample.props.template b/src/main/resources/props/sample.props.template index 30cb90854..2149d539d 100644 --- a/src/main/resources/props/sample.props.template +++ b/src/main/resources/props/sample.props.template @@ -68,12 +68,15 @@ write_metrics=true db.url=jdbc:postgresql://localhost:5432/dbname?user=dbusername&password=thepassword ## Enable remote Akka actor for data split -## Set to true and also edit and set host/port in obpremotedata.conf -#enable_remotedata=true -# Note! Above is currently disabled in source code!! +## If set to true, must set hostname and port +## of remote machine +#remotedata.enable=true +#remotedata.hostname=127.0.0.1 +#remotedata.port=2662 -## If remotedata is enabled, set the remote database parameters -## db has to be accessible from box set in obpremotedata.conf +## Set separate database for data split +## If remotedata is disabled, bd has to be accessible from local machine +## If remotedata is enabled, db has to be accessible from remote machine #remotedata.db.driver=org.h2.Driver #remotedata.db.url=jdbc:h2:./lift_proto.db.remotedata;DB_CLOSE_ON_EXIT=FALSE #remotedata.db.username=user diff --git a/src/main/resources/remotelookup.conf b/src/main/resources/remotelookup.conf deleted file mode 100644 index 0c7e1f596..000000000 --- a/src/main/resources/remotelookup.conf +++ /dev/null @@ -1,6 +0,0 @@ -include "common" - -akka { - remote.natty.tcp.hostname = "127.0.0.1" - remote.netty.tcp.port = 5444 -} diff --git a/src/main/scala/bootstrap/liftweb/Boot.scala b/src/main/scala/bootstrap/liftweb/Boot.scala index 9004bc036..90a06b2a2 100644 --- a/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/src/main/scala/bootstrap/liftweb/Boot.scala @@ -78,7 +78,7 @@ import code.api.Constant._ import code.cards.MappedPhysicalCard import code.cards.PinReset import code.fx.{MappedCurrency, MappedFXRate} -import code.remotedata.RemotedataActorSystem +import code.remotedata.RemotedataActors import code.transaction.MappedTransaction import code.transactionStatusScheduler.TransactionStatusScheduler @@ -355,11 +355,12 @@ class Boot extends Loggable{ } } - if (!Props.getBool("enable_remotedata", false)) { + if (!Props.getBool("remotedata.enable", false)) { try { - RemotedataActorSystem.startLocalWorkerSystem() + logger.info(s"RemoteDataActors.startLocalWorkerSystem() starting") + RemotedataActors.startLocalWorkerSystem() } catch { - case ex: Exception => logger.warn(s"RemoteDataActorSystem.startLocalWorkerSystem() could not start: $ex") + case ex: Exception => logger.warn(s"RemoteDataActors.startLocalWorkerSystem() could not start: $ex") } } @@ -434,6 +435,9 @@ object ToSchemify { ) val models = List( + MappedCounterparty, + MappedCounterpartyMetadata, + MappedCounterpartyWhereTag, AuthUser, Admin, Nonce, @@ -441,8 +445,6 @@ object ToSchemify { Consumer, MappedNarrative, MappedWhereTag, - MappedCounterpartyMetadata, - MappedCounterpartyWhereTag, MappedBank, MappedBankAccount, MappedTransaction, @@ -467,7 +469,6 @@ object ToSchemify { MappedEntitlement, MappedPhysicalCard, PinReset, - MappedCounterparty, MappedBadLoginAttempt, MappedFXRate, MappedCurrency, diff --git a/src/main/scala/code/accountholder/AccountHolders.scala b/src/main/scala/code/accountholder/AccountHolders.scala index 596507edc..2e2662bd5 100644 --- a/src/main/scala/code/accountholder/AccountHolders.scala +++ b/src/main/scala/code/accountholder/AccountHolders.scala @@ -4,7 +4,7 @@ package code.accountholder import code.model.{AccountId, BankId, User} import net.liftweb.util.SimpleInjector -import code.remotedata.Remotedata +import code.remotedata.RemotedataAccountHolders import net.liftweb.common.Box @@ -12,8 +12,8 @@ object AccountHolders extends SimpleInjector { val accountHolders = new Inject(buildOne _) {} - def buildOne: AccountHolders = MapperAccountHolders - //def buildOne: AccountHolders = Remotedata + //def buildOne: AccountHolders = MapperAccountHolders + def buildOne: AccountHolders = RemotedataAccountHolders } diff --git a/src/main/scala/code/metadata/comments/Comments.scala b/src/main/scala/code/metadata/comments/Comments.scala index d4f595314..ae9f9309d 100644 --- a/src/main/scala/code/metadata/comments/Comments.scala +++ b/src/main/scala/code/metadata/comments/Comments.scala @@ -5,14 +5,14 @@ import net.liftweb.common.Box import code.model._ import java.util.Date -import code.remotedata.Remotedata +import code.remotedata.RemotedataComments object Comments extends SimpleInjector { val comments = new Inject(buildOne _) {} //def buildOne: Comments = MappedComments - def buildOne: Comments = Remotedata + def buildOne: Comments = RemotedataComments } diff --git a/src/main/scala/code/metadata/counterparties/Counterparties.scala b/src/main/scala/code/metadata/counterparties/Counterparties.scala index 3e295e15a..63f771683 100644 --- a/src/main/scala/code/metadata/counterparties/Counterparties.scala +++ b/src/main/scala/code/metadata/counterparties/Counterparties.scala @@ -3,14 +3,14 @@ package code.metadata.counterparties import net.liftweb.common.Box import net.liftweb.util.SimpleInjector import code.model.{AccountId, BankId, Counterparty, CounterpartyMetadata} -import code.remotedata.Remotedata +import code.remotedata.RemotedataCounterparties object Counterparties extends SimpleInjector { val counterparties = new Inject(buildOne _) {} def buildOne: Counterparties = MapperCounterparties -// def buildOne: Counterparties = AkkaMapperViews + //def buildOne: Counterparties = RemotedataCounterparties } @@ -85,4 +85,4 @@ class RemoteCounterpartiesCaseClasses { case class checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String) } -object RemoteCounterpartiesCaseClasses extends RemoteCounterpartiesCaseClasses \ No newline at end of file +object RemoteCounterpartiesCaseClasses extends RemoteCounterpartiesCaseClasses diff --git a/src/main/scala/code/metadata/tags/Tags.scala b/src/main/scala/code/metadata/tags/Tags.scala index 7d92366b3..4fb55bf5a 100644 --- a/src/main/scala/code/metadata/tags/Tags.scala +++ b/src/main/scala/code/metadata/tags/Tags.scala @@ -5,14 +5,14 @@ import java.util.Date import net.liftweb.common.Box import code.model._ -import code.remotedata.Remotedata +import code.remotedata.RemotedataTags object Tags extends SimpleInjector { val tags = new Inject(buildOne _) {} //def buildOne: Tags = MappedTags - def buildOne: Tags = Remotedata + def buildOne: Tags = RemotedataTags } diff --git a/src/main/scala/code/remotedata/Remotedata.scala b/src/main/scala/code/remotedata/Remotedata.scala deleted file mode 100644 index 7374d9a04..000000000 --- a/src/main/scala/code/remotedata/Remotedata.scala +++ /dev/null @@ -1,756 +0,0 @@ -package code.remotedata - -import java.util.Date - -import akka.actor.{ActorKilledException, ActorSelection, ActorSystem} -import akka.pattern.ask -import akka.util.Timeout -import code.accountholder.{AccountHolders, RemoteAccountHoldersCaseClasses} -import code.api.APIFailure -import code.metadata.comments.{Comments, RemoteCommentsCaseClasses} -import code.metadata.counterparties.{Counterparties, CounterpartyTrait, RemoteCounterpartiesCaseClasses} -import code.model.dataAccess.ResourceUser -import code.model.{CreateViewJSON, Permission, UpdateViewJSON, _} -import code.users.{RemoteUserCaseClasses, Users} -import code.views.{RemoteViewCaseClasses, Views} -import com.typesafe.config.ConfigFactory -import net.liftweb.common.{Full, _} -import net.liftweb.util.Props -import code.metadata.tags.{RemoteTagsCaseClasses, Tags} - -import scala.collection.immutable.List -import scala.concurrent.Await -import scala.concurrent.duration._ - - -object Remotedata extends Views with Users with Counterparties with AccountHolders with Comments with Tags{ - - val TIMEOUT = 10 seconds - val rViews = RemoteViewCaseClasses - val rUsers = RemoteUserCaseClasses - val rCounterparties = RemoteCounterpartiesCaseClasses - val rAccountHolders = RemoteAccountHoldersCaseClasses - val rComments = RemoteCommentsCaseClasses - val rTags = RemoteTagsCaseClasses - implicit val timeout = Timeout(10000 milliseconds) - - val remote = ActorSystem("LookupSystem", ConfigFactory.load("remotelookup")) - val cfg = ConfigFactory.load("obplocaldata") - val host = cfg.getString("akka.remote.netty.tcp.hostname") - val port = cfg.getString("akka.remote.netty.tcp.port") - var actorPath = "akka.tcp://OBPDataWorkerSystem@" + host + ":" + port + "/user/OBPLocalDataActor" - if (Props.getBool("enable_remotedata", false)) { - val cfg = ConfigFactory.load("obpremotedata") - val rhost = cfg.getString("akka.remote.netty.tcp.hostname") - val rport = cfg.getString("akka.remote.netty.tcp.port") - actorPath = "akka.tcp://OBPDataWorkerSystem@" + rhost + ":" + rport + "/user/OBPRemoteDataActor" - } - - var viewsActor: ActorSelection = remote.actorSelection(actorPath) - - def addPermissions(views: List[ViewUID], user: User): Box[List[View]] = { - val res = try { - Full( - Await.result( - (viewsActor ? rViews.addPermissions(views, user)).mapTo[List[View]], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"One or more views not found", 404) - case e: Throwable => throw e - } - res - } - - def permission(account: BankAccountUID, user: User): Box[Permission] = { - Full( - Await.result( - (viewsActor ? rViews.permission(account, user)).mapTo[Permission], - TIMEOUT - ) - ) - } - - def addPermission(viewUID: ViewUID, user: User): Box[View] = { - val res = try { - Full( - Await.result( - (viewsActor ? rViews.addPermission(viewUID, user)).mapTo[View], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404) - case e: Throwable => throw e - } - res - - } - - //TODO Fix return values in order to better describe failures - def revokePermission(viewUID : ViewUID, user : User) : Box[Boolean] = { - val res = try { - Full( - Await.result( - (viewsActor ? rViews.revokePermission(viewUID, user)).mapTo[Boolean], - TIMEOUT - ) - ) - } - catch { - case k: ClassCastException => k.getMessage match { - case "Cannot cast net.liftweb.common.Failure to java.lang.Boolean" => - return Empty ~> APIFailure(s"View $viewUID. not removed", 400) - case "Cannot cast net.liftweb.common.ParamFailure to java.lang.Boolean" => - return Empty ~> APIFailure(s"View $viewUID. not found", 404) - case _ => - return Empty ~> APIFailure(s"Unknown error", 406) - } - case e: Throwable => throw e - } - res - } - - def revokeAllPermissions(bankId : BankId, accountId: AccountId, user : User) : Box[Boolean] = { - val res = try{ - Full( - Await.result( - (viewsActor ? rViews.revokeAllPermissions(bankId, accountId, user)).mapTo[Boolean], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> Failure("One of the views this user has access to is the owner view, and there would be no one with access" + - " to this owner view if access to the user was revoked. No permissions to any views on the account have been revoked.") - - case e: Throwable => throw e - } - res - } - - def view(viewUID : ViewUID) : Box[View] = { - val res = try { - Full( - Await.result( - (viewsActor ? rViews.view(viewUID)).mapTo[View], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404) - case e: Throwable => throw e - } - res - } - - def view(viewId : ViewId, account: BankAccountUID) : Box[View] = { - val res = try { - Full( - Await.result( - (viewsActor ? rViews.view(viewId, account)).mapTo[View], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"View $viewId. not found", 404) - case e: Throwable => throw e - } - res - } - - - def createView(bankAccountId: BankAccountUID, view: CreateViewJSON): Box[View] = { - Await.result( - (viewsActor ? rViews.createView(bankAccountId, view)).mapTo[Box[View]], - TIMEOUT - ) - } - - def updateView(bankAccountId : BankAccountUID, viewId: ViewId, viewUpdateJson : UpdateViewJSON) : Box[View] = { - Await.result( - (viewsActor ? rViews.updateView(bankAccountId, viewId, viewUpdateJson)).mapTo[Box[View]], - TIMEOUT - ) - } - - def removeView(viewId: ViewId, bankAccountId: BankAccountUID): Box[Unit] = { - Await.result( - (viewsActor ? rViews.removeView(viewId, bankAccountId)).mapTo[Box[Unit]], - TIMEOUT - ) - } - - def permissions(account : BankAccountUID) : List[Permission] = { - Await.result( - (viewsActor ? rViews.permissions(account)).mapTo[List[Permission]], - TIMEOUT - ) - } - - def views(bankAccountId : BankAccountUID) : List[View] = { - Await.result( - (viewsActor ? rViews.views(bankAccountId)).mapTo[List[View]], - TIMEOUT - ) - } - - def permittedViews(user: User, bankAccountId: BankAccountUID): List[View] = { - Await.result( - (viewsActor ? rViews.permittedViews(user, bankAccountId)).mapTo[List[View]], - TIMEOUT - ) - } - - def publicViews(bankAccountId : BankAccountUID) : List[View] = { - Await.result( - (viewsActor ? rViews.publicViews(bankAccountId)).mapTo[List[View]], - TIMEOUT - ) - } - - def getAllPublicAccounts() : List[BankAccountUID] = { - Await.result( - (viewsActor ? rViews.getAllPublicAccounts()).mapTo[List[BankAccountUID]], - TIMEOUT - ) - } - - def getPublicBankAccounts(bank : Bank) : List[BankAccountUID] = { - Await.result( - (viewsActor ? rViews.getPublicBankAccounts(bank)).mapTo[List[BankAccountUID]], - TIMEOUT - ) - } - - def getAllAccountsUserCanSee(user : Box[User]) : List[BankAccountUID] = { - user match { - case Full(theUser) => { - Await.result ( - (viewsActor ? rViews.getAllAccountsUserCanSee(theUser)).mapTo[List[BankAccountUID]], - TIMEOUT) - } - case _ => getAllPublicAccounts() - } - } - - def getAllAccountsUserCanSee(bank: Bank, user : Box[User]) : List[BankAccountUID] = { - user match { - case Full(theUser) => { - Await.result( - (viewsActor ? rViews.getAllAccountsUserCanSee(bank, theUser)).mapTo[List[BankAccountUID]], - TIMEOUT - ) - } - case _ => getPublicBankAccounts(bank) - } - } - - def getNonPublicBankAccounts(user : User) : List[BankAccountUID] = { - Await.result( - (viewsActor ? rViews.getNonPublicBankAccounts(user)).mapTo[List[BankAccountUID]], - TIMEOUT - ) - } - - def getNonPublicBankAccounts(user : User, bankId : BankId) : List[BankAccountUID] = { - Await.result( - (viewsActor ? rViews.getNonPublicBankAccounts(user, bankId)).mapTo[List[BankAccountUID]], - TIMEOUT - ) - } - - def grantAccessToAllExistingViews(user : User) = { - Await.result( - (viewsActor ? rViews.grantAccessToAllExistingViews(user)).mapTo[Boolean], - TIMEOUT - ) - } - - def grantAccessToView(user : User, view : View) = { - Await.result( - (viewsActor ? rViews.grantAccessToView(user, view)).mapTo[Boolean], - TIMEOUT - ) - } - - def getOwners(view: View) : Set[User] = { - Await.result( - (viewsActor ? rViews.getOwners(view)).mapTo[Set[User]], - TIMEOUT - ) - } - - def createOwnerView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { - Full(Await.result( - (viewsActor ? rViews.createOwnerView(bankId, accountId, description)).mapTo[View], - TIMEOUT - ) - ) - } - - def createPublicView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { - Full(Await.result( - (viewsActor ? rViews.createPublicView(bankId, accountId, description)).mapTo[View], - TIMEOUT - ) - ) - } - - def createAccountantsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { - Full(Await.result( - (viewsActor ? rViews.createAccountantsView(bankId, accountId, description)).mapTo[View], - TIMEOUT - ) - ) - } - - def createAuditorsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { - Full(Await.result( - (viewsActor ? rViews.createAuditorsView(bankId, accountId, description)).mapTo[View], - TIMEOUT - ) - ) - } - - def createRandomView(bankId: BankId, accountId: AccountId) : Box[View] = { - Full(Await.result( - (viewsActor ? rViews.createRandomView(bankId, accountId)).mapTo[View], - TIMEOUT - ) - ) - } - - def viewExists(bankId: BankId, accountId: AccountId, name: String): Boolean = { - Await.result( - (viewsActor ? rViews.viewExists(bankId, accountId, name)).mapTo[Boolean], - TIMEOUT - ) - } - - def removeAllViews(bankId: BankId, accountId: AccountId): Boolean = { - Await.result( - (viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean], - TIMEOUT - ) - } - - def removeAllPermissions(bankId: BankId, accountId: AccountId): Boolean = { - Await.result( - (viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean], - TIMEOUT - ) - } - - // Resource user part - def getUserByResourceUserId(id : Long) : Box[User] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getUserByResourceUserId(id)).mapTo[User], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) - case e: Throwable => throw e - } - res - } - - def getResourceUserByResourceUserId(id : Long) : Box[ResourceUser] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getResourceUserByResourceUserId(id)).mapTo[ResourceUser], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"ResourceUser not found", 404) - case e: Throwable => throw e - } - res - } - - def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getUserByProviderId(provider, idGivenByProvider)).mapTo[User], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) - case e: Throwable => throw e - } - res - } - - def getUserByUserId(userId : String) : Box[User] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getUserByUserId(userId)).mapTo[User], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) - case e: Throwable => throw e - } - res - } - - def getUserByUserName(userName : String) : Box[ResourceUser] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getUserByUserName(userName)).mapTo[ResourceUser], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) - case e: Throwable => throw e - } - res - } - - def getUserByEmail(email : String) : Box[List[ResourceUser]] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getUserByEmail(email)).mapTo[List[ResourceUser]], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) - case e: Throwable => throw e - } - res - } - - def getAllUsers() : Box[List[ResourceUser]] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.getAllUsers()).mapTo[List[ResourceUser]], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Users not found", 404) - case e: Throwable => throw e - } - res - } - - def createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.createResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) - case e: Throwable => throw e - } - res - } - - def createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) - case e: Throwable => throw e - } - res - } - - def saveResourceUser(resourceUser: ResourceUser) : Box[ResourceUser] = { - val res = try { - Full( - Await.result( - (viewsActor ? rUsers.saveResourceUser(resourceUser)).mapTo[ResourceUser], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) - case e: Throwable => throw e - } - res - } - - def deleteResourceUser(userId: Long) : Box[Boolean] = { - val res = try{ - Full( - Await.result( - (viewsActor ? rUsers.deleteResourceUser(userId)).mapTo[Boolean], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"User not deleted", 404) - case e: Throwable => throw e - } - res - } - - override def getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty): Box[CounterpartyMetadata] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)).mapTo[CounterpartyMetadata], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not getOrCreateMetadata", 404) - case e: Throwable => throw e - } - res - } - - override def getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId): List[CounterpartyMetadata] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)).mapTo[List[CounterpartyMetadata]], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadatas", 404) - case e: Throwable => throw e - } - res.get - } - - override def getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String): Box[CounterpartyMetadata] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)).mapTo[CounterpartyMetadata], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadata", 404) - case e: Throwable => throw e - } - res - } - - override def getCounterparty(counterPartyId: String): Box[CounterpartyTrait] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.getCounterparty(counterPartyId: String)).mapTo[CounterpartyTrait], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterparty", 404) - case e: Throwable => throw e - } - res - } - - override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.getCounterpartyByIban(iban: String)).mapTo[CounterpartyTrait], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterpartyByIban", 404) - case e: Throwable => throw e - } - res - } - - override def createCounterparty(createdByUserId: String, thisBankId: String, thisAccountId: String, thisViewId: String, name: String, otherBankId: String, otherAccountId: String, otherAccountRoutingScheme: String, otherAccountRoutingAddress: String, otherBankRoutingScheme: String, otherBankRoutingAddress: String, isBeneficiary: Boolean): Box[CounterpartyTrait] = { - val res = try { - Full( - Await.result( - (viewsActor ? rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId, - otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress, - isBeneficiary)).mapTo[CounterpartyTrait], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Can not createCounterparty", 404) - case e: Throwable => throw e - } - res - } - - override def checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String): Boolean = { - Await.result( - (viewsActor ? rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)).mapTo[Boolean], - TIMEOUT - ) - } - - - override def createAccountHolder(userId: Long, bankId: String, accountId: String, source: String = "MappedAccountHolder"): Boolean = { - Await.result( - (viewsActor ? rAccountHolders.createAccountHolder(userId, bankId, accountId, source)).mapTo[Boolean], - TIMEOUT - ) - } - - override def getAccountHolders(bankId: BankId, accountId: AccountId): Set[User] = { - Await.result( - (viewsActor ? rAccountHolders.getAccountHolders(bankId, accountId)).mapTo[Set[User]], - TIMEOUT - ) - } - - - // bulkDeletes for tests - def bulkDeleteAllPermissionsAndViews(): Boolean = { - Await.result( - (viewsActor ? rViews.bulkDeleteAllPermissionsAndViews()).mapTo[Boolean], - TIMEOUT - ) - } - - def bulkDeleteAllAccountHolders(): Box[Boolean] = { - Full( - Await.result( - (viewsActor ? rAccountHolders.bulkDeleteAllAccountHolders()).mapTo[Boolean], - TIMEOUT - ) - ) - } - - def bulkDeleteAllResourceUsers(): Box[Boolean] = { - Full( - Await.result( - (viewsActor ? rUsers.bulkDeleteAllResourceUsers()).mapTo[Boolean], - TIMEOUT - ) - ) - } - - // METADATA - // Comments - def getComments(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[Comment] = { - Await.result( - (viewsActor ? rComments.getComments(bankId, accountId, transactionId, viewId)).mapTo[List[Comment]], - TIMEOUT - ) - } - - def addComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, text : String, datePosted : Date) : Box[Comment] = { - Full( - Await.result( - (viewsActor ? rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted)).mapTo[Comment], - TIMEOUT - ) - ) - } - - def deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(commentId : String) : Box[Boolean] = { - val res = try { - Full( - Await.result( - (viewsActor ? rComments.deleteComment(bankId, accountId, transactionId, commentId)).mapTo[Boolean], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the comment", 404) - case e: Throwable => throw e - } - res - } - - def bulkDeleteComments(bankId: BankId, accountId: AccountId): Boolean = { - Await.result( - (viewsActor ? rComments.bulkDeleteComments(bankId, accountId)).mapTo[Boolean], - TIMEOUT - ) - } - - // Tags - def getTags(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[TransactionTag] = { - Await.result( - (viewsActor ? rTags.getTags(bankId, accountId, transactionId, viewId)).mapTo[List[TransactionTag]], - TIMEOUT - ) - } - - def addTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, tagText : String, datePosted : Date) : Box[TransactionTag] = { - Full( - Await.result( - (viewsActor ? rTags.addTag(bankId, accountId, transactionId, userId, viewId, tagText, datePosted)).mapTo[TransactionTag], - TIMEOUT - ) - ) - } - - def deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(tagId : String) : Box[Boolean] = { - val res = try { - Full( - Await.result( - (viewsActor ? rTags.deleteTag(bankId, accountId, transactionId, tagId)).mapTo[Boolean], - TIMEOUT - ) - ) - } - catch { - case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the tag", 404) - case e: Throwable => throw e - } - res - } - - def bulkDeleteTags(bankId: BankId, accountId: AccountId): Boolean = { - Await.result( - (viewsActor ? rTags.bulkDeleteTags(bankId, accountId)).mapTo[Boolean], - TIMEOUT - ) - } - -} - diff --git a/src/main/scala/code/remotedata/RemotedataAccountHolders.scala b/src/main/scala/code/remotedata/RemotedataAccountHolders.scala new file mode 100644 index 000000000..b7093bcd2 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataAccountHolders.scala @@ -0,0 +1,43 @@ +package code.remotedata + +import code.accountholder.{AccountHolders, RemoteAccountHoldersCaseClasses} +import code.model.{AccountId, BankId, User} +import net.liftweb.common.{Full, _} +import akka.pattern.ask +import akka.util.Timeout +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataAccountHolders extends AccountHolders { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rAccountHolders = RemoteAccountHoldersCaseClasses + var accountHoldersActor = RemotedataActorSystem.getActor("accountHolders") + + override def createAccountHolder(userId: Long, bankId: String, accountId: String, source: String = "MappedAccountHolder"): Boolean = { + Await.result( + (accountHoldersActor ? rAccountHolders.createAccountHolder(userId, bankId, accountId, source)).mapTo[Boolean], + TIMEOUT + ) + } + + override def getAccountHolders(bankId: BankId, accountId: AccountId): Set[User] = { + Await.result( + (accountHoldersActor ? rAccountHolders.getAccountHolders(bankId, accountId)).mapTo[Set[User]], + TIMEOUT + ) + } + + + def bulkDeleteAllAccountHolders(): Box[Boolean] = { + Full( + Await.result( + (accountHoldersActor ? rAccountHolders.bulkDeleteAllAccountHolders()).mapTo[Boolean], + TIMEOUT + ) + ) + } + +} diff --git a/src/main/scala/code/remotedata/RemotedataAccountHoldersActor.scala b/src/main/scala/code/remotedata/RemotedataAccountHoldersActor.scala new file mode 100644 index 000000000..9a6b0dda0 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataAccountHoldersActor.scala @@ -0,0 +1,66 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import code.accountholder.{MapperAccountHolders, RemoteAccountHoldersCaseClasses} +import code.model._ +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataAccountHoldersActor extends Actor { + + val logger = Logging(context.system, this) + + val mAccountHolders = MapperAccountHolders + val rAccountHolders = RemoteAccountHoldersCaseClasses + + def receive = { + + case rAccountHolders.createAccountHolder(userId: Long, bankId: String, accountId: String, source: String) => + + logger.info("createAccountHolder(" + userId +", "+ bankId +", "+ accountId +", "+ source +")") + + { + for { + res <- tryo{mAccountHolders.createAccountHolder(userId, bankId, accountId, source)} + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case rAccountHolders.getAccountHolders(bankId: BankId, accountId: AccountId) => + + logger.info("getAccountHolders(" + bankId +", "+ accountId +")") + + { + for { + res <- tryo{mAccountHolders.getAccountHolders(bankId, accountId)} + } yield { + sender ! res.asInstanceOf[Set[User]] + } + }.getOrElse( context.stop(sender) ) + + + case rAccountHolders.bulkDeleteAllAccountHolders() => + + logger.info("bulkDeleteAllAccountHolders()") + + { + for { + res <- mAccountHolders.bulkDeleteAllAccountHolders() + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + } +} + diff --git a/src/main/scala/code/remotedata/RemotedataActor.scala b/src/main/scala/code/remotedata/RemotedataActor.scala deleted file mode 100644 index 40793bb0d..000000000 --- a/src/main/scala/code/remotedata/RemotedataActor.scala +++ /dev/null @@ -1,705 +0,0 @@ -package code.remotedata - -import java.util.concurrent.TimeUnit - -import akka.actor.{Actor, ActorSystem, Props => ActorProps} -import akka.event.Logging -import akka.util.Timeout -import bootstrap.liftweb.ToSchemify -import code.accountholder.{MapperAccountHolders, RemoteAccountHoldersCaseClasses} -import code.metadata.comments.{MappedComment, MappedComments, RemoteCommentsCaseClasses} -import code.metadata.counterparties.{CounterpartyTrait, MapperCounterparties, RemoteCounterpartiesCaseClasses} -import code.metadata.tags.{MappedTags, RemoteTagsCaseClasses} -import code.model._ -import code.model.dataAccess.ResourceUser -import code.users.{LiftUsers, RemoteUserCaseClasses} -import code.views.{MapperViews, RemoteViewCaseClasses} -import com.typesafe.config.ConfigFactory -import net.liftweb.common._ -import net.liftweb.db.StandardDBVendor -import net.liftweb.http.LiftRules -import net.liftweb.mapper.{DB, Schemifier} -import net.liftweb.util.Props -import net.liftweb.util.ControlHelpers.tryo - -import scala.concurrent.duration._ - - -class RemotedataActor extends Actor { - - val logger = Logging(context.system, this) - - Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.modelsRemotedata: _*) - - val mViews = MapperViews - val rViews = RemoteViewCaseClasses - - val mUsers = LiftUsers - val rUsers = RemoteUserCaseClasses - - val mCounterparties = MapperCounterparties - val rCounterparties = RemoteCounterpartiesCaseClasses - - val mAccountHolders = MapperAccountHolders - val rAccountHolders = RemoteAccountHoldersCaseClasses - - val mComments = MappedComments - val rComments = RemoteCommentsCaseClasses - - val mTags = MappedTags - val rTags = RemoteTagsCaseClasses - - def receive = { - - case rViews.addPermissions(views : List[ViewUID], user : User) => - - logger.info("addPermissions(" + views +"," + user +")") - - { - for { - res <- mViews.addPermissions(views, user) - } yield { - sender ! res.asInstanceOf[List[View]] - } - }.getOrElse( context.stop(sender) ) - - - case rViews.addPermission(viewUID : ViewUID, user : User) => - - logger.info("addPermission(" + viewUID +"," + user +")") - - { - for { - res <- mViews.addPermission(viewUID, user) - } yield { - sender ! res.asInstanceOf[View] - } - }.getOrElse( context.stop(sender) ) - - - case rViews.permission(account : BankAccountUID, user: User) => - - logger.info("permission(" + account +"," + user +")") - - { - for { - res <- mViews.permission(account, user) - } yield { - sender ! res.asInstanceOf[Permission] - } - }.getOrElse( context.stop(sender) ) - - - //TODO Fix return values in order to better describe failures - case rViews.revokePermission(viewUID : ViewUID, user : User) => - - logger.info("revokePermission(" + viewUID +"," + user +")") - - - val res = mViews.revokePermission(viewUID, user) - res match { - case Full(r) => sender ! r - case f => sender ! f - } - - case rViews.revokeAllPermissions(bankId : BankId, accountId : AccountId, user : User) => - - logger.info("revokeAllPermissions(" + bankId +"," + accountId +","+ user +")") - - { - for { - res <- mViews.revokeAllPermissions(bankId, accountId, user) - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - - case rViews.view(viewUID : ViewUID) => - - logger.info("view(" + viewUID +")") - - { - for { - res <- mViews.view(viewUID) - } yield { - sender ! res.asInstanceOf[View] - } - }.getOrElse( context.stop(sender) ) - - - case rViews.view(viewId: ViewId, bankAccountId: BankAccountUID) => - - logger.info("view(" + viewId +", "+ bankAccountId + ")") - - { - for { - res <- mViews.view(viewId, bankAccountId) - } yield { - sender ! res.asInstanceOf[View] - } - }.getOrElse( context.stop(sender) ) - - case rViews.createView(bankAccountId : BankAccountUID, view: CreateViewJSON) => - logger.info("createView(" + bankAccountId +","+ view +")") - sender ! mViews.createView(bankAccountId, view) - - case rViews.updateView(bankAccountId : BankAccountUID, viewId : ViewId, viewUpdateJson : UpdateViewJSON) => - logger.info("updateView(" + bankAccountId +","+ viewId +","+ viewUpdateJson +")") - sender ! mViews.updateView(bankAccountId, viewId, viewUpdateJson) - - //case r.view(viewId: ViewId, bankAccountId: BankAccountUID) => - // logger.info("view(" + viewId +","+ bankAccountId +")") - // sender ! v.view(ViewId(viewId.value), bankAccountId) - - case rViews.removeView(viewId : ViewId, bankAccountId: BankAccountUID) => - logger.info("removeView(" + viewId +","+ bankAccountId +")") - sender ! mViews.removeView(viewId, bankAccountId) - - case rViews.permissions(bankAccountId : BankAccountUID) => - logger.info("premissions(" + bankAccountId +")") - sender ! mViews.permissions(bankAccountId) - - case rViews.views(bankAccountId : BankAccountUID) => - logger.info("views(" + bankAccountId +")") - sender ! mViews.views(bankAccountId) - - case rViews.permittedViews(user: User, bankAccountId: BankAccountUID) => - logger.info("permittedViews(" + user +", " + bankAccountId +")") - sender ! mViews.permittedViews(user, bankAccountId) - - case rViews.publicViews(bankAccountId : BankAccountUID) => - logger.info("publicViews(" + bankAccountId +")") - sender ! mViews.publicViews(bankAccountId) - - case rViews.getAllPublicAccounts() => - logger.info("getAllPublicAccounts()") - sender ! mViews.getAllPublicAccounts - - case rViews.getPublicBankAccounts(bank : Bank) => - logger.info("getPublicBankAccounts(" + bank +")") - sender ! mViews.getPublicBankAccounts(bank) - - case rViews.getAllAccountsUserCanSee(user : Box[User]) => - logger.info("getAllAccountsUserCanSee(" + user +")") - sender ! mViews.getAllAccountsUserCanSee(user) - - case rViews.getAllAccountsUserCanSee(user : User) => - logger.info("getAllAccountsUserCanSee(" + user +")") - sender ! mViews.getAllAccountsUserCanSee(Full(user)) - - case rViews.getAllAccountsUserCanSee(bank: Bank, user : Box[User]) => - logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")") - sender ! mViews.getAllAccountsUserCanSee(bank, user) - - case rViews.getAllAccountsUserCanSee(bank: Bank, user : User) => - logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")") - sender ! mViews.getAllAccountsUserCanSee(bank, Full(user)) - - case rViews.getNonPublicBankAccounts(user: User, bankId: BankId) => - logger.info("getNonPublicBankAccounts(" + user +", "+ bankId +")") - sender ! mViews.getNonPublicBankAccounts(user, bankId) - - case rViews.getNonPublicBankAccounts(user: User) => - logger.info("getNonPublicBankAccounts(" + user +")") - sender ! mViews.getNonPublicBankAccounts(user) - - case rViews.createOwnerView(bankId, accountId, description) => - logger.info("createOwnerView(" + bankId +", "+ accountId +", "+ description +")") - sender ! mViews.createOwnerView(bankId, accountId, description).orNull - - case rViews.createPublicView(bankId, accountId, description) => - logger.info("createPublicView(" + bankId +", "+ accountId +", "+ description +")") - sender ! mViews.createPublicView(bankId, accountId, description).orNull - - case rViews.createAccountantsView(bankId, accountId, description) => - logger.info("createAccountantsView(" + bankId +", "+ accountId +", "+ description +")") - sender ! mViews.createAccountantsView(bankId, accountId, description).orNull - - case rViews.createAuditorsView(bankId, accountId, description) => - logger.info("createAuditorsView(" + bankId +", "+ accountId +", "+ description +")") - sender ! mViews.createAuditorsView(bankId, accountId, description).orNull - - case rViews.createRandomView(bankId, accountId) => - logger.info("createRandomView(" + bankId +", "+ accountId +")") - sender ! mViews.createRandomView(bankId, accountId).orNull - - case rViews.getOwners(view) => - logger.info("getOwners(" + view +")") - sender ! mViews.getOwners(view) - - case rViews.grantAccessToView(user, view) => - logger.info("grantAccessToView(" + user +", "+ view +")") - sender ! mViews.grantAccessToView(user, view) - - case rViews.grantAccessToAllExistingViews(user) => - logger.info("grantAccessToAllExistingViews(" + user +")") - sender ! mViews.grantAccessToAllExistingViews(user) - - case rViews.removeAllPermissions(bankId, accountId) => - logger.info("removeAllPermissions(" + bankId +", "+ accountId +")") - sender ! mViews.removeAllPermissions(bankId, accountId) - - case rViews.removeAllViews(bankId, accountId) => - logger.info("removeAllViews(" + bankId +", "+ accountId +")") - sender ! mViews.removeAllViews(bankId, accountId) - - // Resource User part - case rUsers.getUserByResourceUserId(id: Long) => - logger.info("getUserByResourceUserId(" + id +")") - - { - for { - res <- mUsers.getUserByResourceUserId(id) - } yield { - sender ! res.asInstanceOf[User] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getResourceUserByResourceUserId(id: Long) => - logger.info("getResourceUserByResourceUserId(" + id +")") - - { - for { - res <- mUsers.getResourceUserByResourceUserId(id) - } yield { - sender ! res.asInstanceOf[ResourceUser] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getUserByProviderId(provider : String, idGivenByProvider : String) => - logger.info("getUserByProviderId(" + provider +"," + idGivenByProvider +")") - - { - for { - res <- mUsers.getUserByProviderId(provider, idGivenByProvider) - } yield { - sender ! res.asInstanceOf[User] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getUserByUserId(userId: String) => - logger.info("getUserByUserId(" + userId +")") - - { - for { - res <- mUsers.getUserByUserId(userId) - } yield { - sender ! res.asInstanceOf[User] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getUserByUserName(userName: String) => - logger.info("getUserByUserName(" + userName +")") - - { - for { - res <- mUsers.getUserByUserName(userName) - } yield { - sender ! res.asInstanceOf[ResourceUser] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getUserByEmail(email: String) => - logger.info("getUserByEmail(" + email +")") - - { - for { - res <- mUsers.getUserByEmail(email) - } yield { - sender ! res - } - }.getOrElse( context.stop(sender) ) - - case rUsers.getAllUsers() => - logger.info("getAllUsers()") - - { - for { - res <- mUsers.getAllUsers() - } yield { - sender ! res - } - }.getOrElse( context.stop(sender) ) - - case rUsers.createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) => - logger.info("createResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")") - - { - for { - res <- mUsers.createResourceUser(provider, providerId, name, email, userId) - } yield { - sender ! res.asInstanceOf[ResourceUser] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) => - logger.info("createUnsavedResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")") - - { - for { - res <- mUsers.createUnsavedResourceUser(provider, providerId, name, email, userId) - } yield { - sender ! res.asInstanceOf[ResourceUser] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.saveResourceUser(resourceUser: ResourceUser) => - logger.info("saveResourceUser") - - { - for { - res <- mUsers.saveResourceUser(resourceUser) - } yield { - sender ! res.asInstanceOf[ResourceUser] - } - }.getOrElse( context.stop(sender) ) - - case rUsers.deleteResourceUser(id: Long) => - logger.info("deleteResourceUser(" + id +")") - - { - for { - res <- tryo{mUsers.deleteResourceUser(id)} - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - case rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)=> - logger.info("checkCounterpartyAvailable(" + name +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +")") - sender ! mCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String) - - case rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId, - otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress, - isBeneficiary) => - logger.info("createCounterparty(" + createdByUserId +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +", "+ name +", "+ otherBankId + otherAccountId +", " - + otherAccountRoutingScheme +", "+ otherAccountRoutingAddress +", "+ otherBankRoutingScheme +", "+ otherBankRoutingAddress +", "+ isBeneficiary+ ")") - - { - for { - res <- mCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId, - otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress, - isBeneficiary) - } yield { - sender ! res.asInstanceOf[CounterpartyTrait] - } - }.getOrElse( context.stop(sender) ) - - - - case rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) => - logger.info("getOrCreateMetadata(" + originalPartyBankId +", " +originalPartyAccountId+otherParty+")") - - { - for { - res <- mCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) - } yield { - sender ! res.asInstanceOf[CounterpartyMetadata] - } - }.getOrElse( context.stop(sender) ) - - case rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId) => - logger.info("getOrCreateMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")") - - Full({ - for { - res <- Full(mCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)) - } yield { - sender ! res.asInstanceOf[List[CounterpartyMetadata]] - } - }).getOrElse(context.stop(sender)) - - - case rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) => - logger.info("getMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")") - - { - for { - res <- mCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) - } yield { - sender ! res.asInstanceOf[CounterpartyMetadata] - } - }.getOrElse( context.stop(sender) ) - - - - case rCounterparties.getCounterparty(counterPartyId: String) => - logger.info("getCounterparty(" + counterPartyId +")") - - { - for { - res <- mCounterparties.getCounterparty(counterPartyId: String) - } yield { - sender ! res.asInstanceOf[CounterpartyTrait] - } - }.getOrElse( context.stop(sender) ) - - - case rCounterparties.getCounterpartyByIban(iban: String) => - - logger.info("getOrCreateMetadata(" + iban +")") - - { - for { - res <- mCounterparties.getCounterpartyByIban(iban: String) - } yield { - sender ! res.asInstanceOf[CounterpartyTrait] - } - }.getOrElse( context.stop(sender) ) - - - case rAccountHolders.createAccountHolder(userId: Long, bankId: String, accountId: String, source: String) => - - logger.info("createAccountHolder(" + userId +", "+ bankId +", "+ accountId +", "+ source +")") - - { - for { - res <- tryo{mAccountHolders.createAccountHolder(userId, bankId, accountId, source)} - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - - case rAccountHolders.getAccountHolders(bankId: BankId, accountId: AccountId) => - - logger.info("getAccountHolders(" + bankId +", "+ accountId +")") - - { - for { - res <- tryo{mAccountHolders.getAccountHolders(bankId, accountId)} - } yield { - sender ! res.asInstanceOf[Set[User]] - } - }.getOrElse( context.stop(sender) ) - - - case rAccountHolders.bulkDeleteAllAccountHolders() => - - logger.info("bulkDeleteAllAccountHolders()") - - { - for { - res <- mAccountHolders.bulkDeleteAllAccountHolders() - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - - case rUsers.bulkDeleteAllResourceUsers() => - - logger.info("bulkDeleteAllResourceUsers()") - - { - for { - res <- mUsers.bulkDeleteAllResourceUsers() - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - - - case rViews.bulkDeleteAllPermissionsAndViews() => - - logger.info("bulkDeleteAllPermissionsAndViews()") - - { - for { - res <- tryo{mViews.bulkDeleteAllPermissionsAndViews()} - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - // METADATA - // Comments - case rComments.getComments(bankId, accountId, transactionId, viewId) => - logger.info("getComments(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")") - sender ! mComments.getComments(bankId, accountId, transactionId)(viewId) - - case rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted) => - logger.info("addComment(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")") - - { - for { - res <- mComments.addComment(bankId, accountId, transactionId)(userId, viewId, text, datePosted) - } yield { - sender ! res.asInstanceOf[Comment] - } - }.getOrElse( context.stop(sender) ) - - case rComments.deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId, commentId : String) => - logger.info("deleteComment(" + bankId +", "+ accountId +", "+ transactionId + commentId +")") - - { - for { - res <- mComments.deleteComment(bankId, accountId, transactionId)(commentId) - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - case rComments.bulkDeleteComments(bankId: BankId, accountId: AccountId) => - - logger.info("bulkDeleteComments(" + bankId +", "+ accountId + ")") - - { - for { - res <- tryo{mComments.bulkDeleteComments(bankId, accountId)} - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - // Tags - case rTags.getTags(bankId, accountId, transactionId, viewId) => - logger.info("getTags(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")") - sender ! mTags.getTags(bankId, accountId, transactionId)(viewId) - - case rTags.addTag(bankId, accountId, transactionId, userId, viewId, text, datePosted) => - logger.info("addTag(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")") - - { - for { - res <- mTags.addTag(bankId, accountId, transactionId)(userId, viewId, text, datePosted) - } yield { - sender ! res.asInstanceOf[TransactionTag] - } - }.getOrElse( context.stop(sender) ) - - case rTags.deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId, tagId : String) => - logger.info("deleteTag(" + bankId +", "+ accountId +", "+ transactionId + tagId +")") - - { - for { - res <- mTags.deleteTag(bankId, accountId, transactionId)(tagId) - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - case rTags.bulkDeleteTags(bankId: BankId, accountId: AccountId) => - - logger.info("bulkDeleteTags(" + bankId +", "+ accountId + ")") - - { - for { - res <- tryo{mTags.bulkDeleteTags(bankId, accountId)} - } yield { - sender ! res.asInstanceOf[Boolean] - } - }.getOrElse( context.stop(sender) ) - - - - - case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) - - } - -} - - - - - - - - - - - - -object RemotedataActorSystem extends Loggable { - implicit val timeout = Timeout(1 seconds) - - def startRemoteWorkerSystem(): Unit = { - val remote = ActorSystem("OBPDataWorkerSystem", ConfigFactory.load("obpremotedata")) - val actor = remote.actorOf(ActorProps[RemotedataActor], name = "OBPRemoteDataActor") - logger.info("Started OBPDataWorkerSystem") - } - - def startLocalWorkerSystem(): Unit = { - val remote = ActorSystem("OBPDataWorkerSystem", ConfigFactory.load("obplocaldata")) - val actor = remote.actorOf(ActorProps[RemotedataActor], name = "OBPLocalDataActor") - logger.info("Started OBPDataWorkerSystem locally") - } - - def setupRemotedataDB(): Unit = { - // set up the way to connect to the relational DB we're using (ok if other connector than relational) - if (!DB.jndiJdbcConnAvailable_?) { - val driver = - Props.mode match { - case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => Props.get("remotedata.db.driver") openOr "org.h2.Driver" - case _ => "org.h2.Driver" - } - val vendor = - Props.mode match { - case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => - new StandardDBVendor(driver, - Props.get("remotedata.db.url") openOr "jdbc:h2:./lift_proto.remotedata.db;AUTO_SERVER=TRUE", - Props.get("remotedata.db.user"), Props.get("remotedata.db.password")) - case _ => - new StandardDBVendor( - driver, - "jdbc:h2:mem:OBPData;DB_CLOSE_DELAY=-1", - Empty, Empty) - } - - logger.debug("Using database driver: " + driver) - LiftRules.unloadHooks.append(vendor.closeAllConnections_! _) - - DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, vendor) - } - } - - // Entry point if running as standalone remote data server, without jetty - def main (args: Array[String]): Unit = { - if (args.length >= 1 && args(0) == "standalone") { - setupRemotedataDB() - showLogoAfterDelay() - startRemoteWorkerSystem() - } - } - - def showLogoAfterDelay() = { - val actorSystem = ActorSystem() - implicit val executor = actorSystem.dispatcher - val scheduler = actorSystem.scheduler - scheduler.scheduleOnce( - Duration(4, TimeUnit.SECONDS), - runnable = new Runnable { - def run(): Unit = { - println( - """ - | ______ _______ _______ __ _______ __ - | / " \ | _ "\ | __ "\ /""\ | __ "\ |" \ - | // ____ \ (. |_) :) (. |__) :) _____ / \ (. |__) :)|| | - | / / ) :)|: \/ |: ____/ // ") /' /\ \ |: ____/ |: | - | (: (____/ // (| _ \\ (| / (_____/ // __' \ (| / |. | - | \ / |: |_) :)/|__/ \ / / \\ \ /|__/ \ /\ |\ - | \"_____/ (_______/(_______) (___/ \___)(_______) (__\_|_) - | _______ _______ ___ ___ ______ ___________ _______ - | /" \ /" "||" \ /" | / " \(" _ ")/" "| - | |: |(: ______) \ \ // | // ____ \)__/ \\__/(: ______) - | |_____/ ) \/ | /\\ \/. | / / ) :) \\_ / \/ | - | // / // ___)_ |: \. |(: (____/ // |. | // ___)_ - | |: __ \ (: "||. \ /: | \ / \: | (: "| - | |__| \___) \_______)|___|\__/|___| \"_____/ \__| \_______) - | __ ______ ___________ ______ _______ - | /""\ /" _ "\(" _ ")/ " \ /" \ - | / \ (: ( \___))__/ \\__/// ____ \ |: | - | /' /\ \ \/ \ \\_ / / / ) :)|_____/ ) - | // __' \ // \ _ |. | (: (____/ // // / - | / / \\ \(: _) \ \: | \ / |: __ \ - | (___/ \___)\_______) \__| \"_____/ |__| \___) - |""".stripMargin) - } - } - ) - } - -} diff --git a/src/main/scala/code/remotedata/RemotedataActorSystem.scala b/src/main/scala/code/remotedata/RemotedataActorSystem.scala new file mode 100644 index 000000000..c65eb4394 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataActorSystem.scala @@ -0,0 +1,42 @@ +package code.remotedata + +import akka.actor.ActorSystem +import com.typesafe.config.ConfigFactory +import net.liftweb.util.Props +import net.liftweb.common.Loggable + + +object RemotedataActorSystem extends Loggable { + + var obpActorSystem: ActorSystem = null + + def init () = { + if (obpActorSystem == null ) { + val system = ActorSystem("LookupSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.lookupConf))) + logger.info(RemotedataConfig.lookupConf) + obpActorSystem = system + } + obpActorSystem + } + + + def getActor(actorName: String) = { + this.init + + val actorPath = Props.getBool("remotedata.enable", false) match { + case true => + val hostname = RemotedataConfig.remoteHostname + val port = RemotedataConfig.remotePort + "akka.tcp://RemotedataActorSystem@" + hostname + ":" + port + "/user/" + actorName + + case false => + val hostname = RemotedataConfig.localHostname + val port = RemotedataConfig.localPort + "akka.tcp://RemotedataActorSystem@" + hostname + ":" + port + "/user/" + actorName + } + + this.obpActorSystem.actorSelection(actorPath) + } + +} + diff --git a/src/main/scala/code/remotedata/RemotedataActors.scala b/src/main/scala/code/remotedata/RemotedataActors.scala new file mode 100644 index 000000000..a866040ef --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataActors.scala @@ -0,0 +1,123 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.{Actor, ActorSystem, Props => ActorProps} +import akka.event.Logging +import akka.util.Timeout +import bootstrap.liftweb.ToSchemify +import com.typesafe.config.ConfigFactory +import net.liftweb.common._ +import net.liftweb.db.StandardDBVendor +import net.liftweb.http.LiftRules +import net.liftweb.mapper.{DB, Schemifier} +import net.liftweb.util.Props + +import scala.concurrent.duration._ + + +object RemotedataActors extends Loggable { + + def startLocalWorkerSystem(): Unit = { + val system = ActorSystem("RemotedataActorSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.localConf))) + logger.info("Starting local RemotedataActorSystem") + logger.info(RemotedataConfig.localConf) + logger.info(system.actorOf(ActorProps[RemotedataUsersActor], name = "users")) + logger.info(system.actorOf(ActorProps[RemotedataViewsActor], name = "views")) + logger.info(system.actorOf(ActorProps[RemotedataAccountHoldersActor], name = "accountHolders")) + logger.info(system.actorOf(ActorProps[RemotedataCounterpartiesActor], name = "counterparties")) + logger.info(system.actorOf(ActorProps[RemotedataTagsActor], name = "tags")) + logger.info(system.actorOf(ActorProps[RemotedataCommentsActor], name = "comments")) + logger.info("Cmplete") + } + + def startRemoteWorkerSystem(): Unit = { + val system = ActorSystem("RemotedataActorSystem", ConfigFactory.load(ConfigFactory.parseString(RemotedataConfig.remoteConf))) + logger.info("Starting remote RemotedataActorSystem") + logger.info(RemotedataConfig.remoteConf) + logger.info(system.actorOf(ActorProps[RemotedataUsersActor], name = "users")) + logger.info(system.actorOf(ActorProps[RemotedataViewsActor], name = "views")) + logger.info(system.actorOf(ActorProps[RemotedataAccountHoldersActor], name = "accountHolders")) + logger.info(system.actorOf(ActorProps[RemotedataCounterpartiesActor], name = "counterparties")) + logger.info(system.actorOf(ActorProps[RemotedataTagsActor], name = "tags")) + logger.info(system.actorOf(ActorProps[RemotedataCommentsActor], name = "comments")) + logger.info("Complete") + } + + + def setupRemotedataDB(): Unit = { + // set up the way to connect to the relational DB we're using (ok if other connector than relational) + if (!DB.jndiJdbcConnAvailable_?) { + val driver = + Props.mode match { + case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => Props.get("remotedata.db.driver") openOr "org.h2.Driver" + case _ => "org.h2.Driver" + } + val vendor = + Props.mode match { + case Props.RunModes.Production | Props.RunModes.Staging | Props.RunModes.Development => + new StandardDBVendor(driver, + Props.get("remotedata.db.url") openOr "jdbc:h2:./lift_proto.remotedata.db;AUTO_SERVER=TRUE", + Props.get("remotedata.db.user"), Props.get("remotedata.db.password")) + case _ => + new StandardDBVendor( + driver, + "jdbc:h2:mem:OBPData;DB_CLOSE_DELAY=-1", + Empty, Empty) + } + + logger.debug("Using database driver: " + driver) + LiftRules.unloadHooks.append(vendor.closeAllConnections_! _) + + DB.defineConnectionManager(net.liftweb.util.DefaultConnectionIdentifier, vendor) + } + Schemifier.schemify(true, Schemifier.infoF _, ToSchemify.modelsRemotedata: _*) + } + + // Entry point if running as standalone remote data server, without jetty + def main (args: Array[String]): Unit = { + if (args.length >= 1 && args(0) == "standalone") { + setupRemotedataDB() + showLogoAfterDelay() + startRemoteWorkerSystem() + } + } + + def showLogoAfterDelay() = { + val actorSystem = ActorSystem() + implicit val executor = actorSystem.dispatcher + val scheduler = actorSystem.scheduler + scheduler.scheduleOnce( + Duration(4, TimeUnit.SECONDS), + runnable = new Runnable { + def run(): Unit = { + println( + """ + | ______ _______ _______ __ _______ __ + | / " \ | _ "\ | __ "\ /""\ | __ "\ |" \ + | // ____ \ (. |_) :) (. |__) :) _____ / \ (. |__) :)|| | + | / / ) :)|: \/ |: ____/ // ") /' /\ \ |: ____/ |: | + | (: (____/ // (| _ \\ (| / (_____/ // __' \ (| / |. | + | \ / |: |_) :)/|__/ \ / / \\ \ /|__/ \ /\ |\ + | \"_____/ (_______/(_______) (___/ \___)(_______) (__\_|_) + | _______ _______ ___ ___ ______ ___________ _______ + | /" \ /" "||" \ /" | / " \(" _ ")/" "| + | |: |(: ______) \ \ // | // ____ \)__/ \\__/(: ______) + | |_____/ ) \/ | /\\ \/. | / / ) :) \\_ / \/ | + | // / // ___)_ |: \. |(: (____/ // |. | // ___)_ + | |: __ \ (: "||. \ /: | \ / \: | (: "| + | |__| \___) \_______)|___|\__/|___| \"_____/ \__| \_______) + | __ ______ ___________ ______ _______ + | /""\ /" _ "\(" _ ")/ " \ /" \ + | / \ (: ( \___))__/ \\__/// ____ \ |: | + | /' /\ \ \/ \ \\_ / / / ) :)|_____/ ) + | // __' \ // \ _ |. | (: (____/ // // / + | / / \\ \(: _) \ \: | \ / |: __ \ + | (___/ \___)\_______) \__| \"_____/ |__| \___) + |""".stripMargin) + } + } + ) + } + +} diff --git a/src/main/scala/code/remotedata/RemotedataComments.scala b/src/main/scala/code/remotedata/RemotedataComments.scala new file mode 100644 index 000000000..607fdeab3 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataComments.scala @@ -0,0 +1,65 @@ +package code.remotedata + +import java.util.Date + +import akka.actor.ActorKilledException +import akka.pattern.ask +import akka.util.Timeout +import code.api.APIFailure +import code.metadata.comments.{Comments, RemoteCommentsCaseClasses} +import code.model._ +import net.liftweb.common.{Full, _} + +import scala.collection.immutable.List +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataComments extends Comments { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rComments = RemoteCommentsCaseClasses + var commentsActor = RemotedataActorSystem.getActor("comments") + + def getComments(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[Comment] = { + Await.result( + (commentsActor ? rComments.getComments(bankId, accountId, transactionId, viewId)).mapTo[List[Comment]], + TIMEOUT + ) + } + + def addComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, text : String, datePosted : Date) : Box[Comment] = { + Full( + Await.result( + (commentsActor ? rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted)).mapTo[Comment], + TIMEOUT + ) + ) + } + + def deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(commentId : String) : Box[Boolean] = { + val res = try { + Full( + Await.result( + (commentsActor ? rComments.deleteComment(bankId, accountId, transactionId, commentId)).mapTo[Boolean], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the comment", 404) + case e: Throwable => throw e + } + res + } + + def bulkDeleteComments(bankId: BankId, accountId: AccountId): Boolean = { + Await.result( + (commentsActor ? rComments.bulkDeleteComments(bankId, accountId)).mapTo[Boolean], + TIMEOUT + ) + } + + +} diff --git a/src/main/scala/code/remotedata/RemotedataCommentsActor.scala b/src/main/scala/code/remotedata/RemotedataCommentsActor.scala new file mode 100644 index 000000000..fcd6d75bd --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataCommentsActor.scala @@ -0,0 +1,70 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import bootstrap.liftweb.ToSchemify +import code.metadata.comments.{MappedComment, MappedComments, RemoteCommentsCaseClasses} +import code.model._ +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataCommentsActor extends Actor { + + val logger = Logging(context.system, this) + + val mComments = MappedComments + val rComments = RemoteCommentsCaseClasses + + def receive = { + + case rComments.getComments(bankId, accountId, transactionId, viewId) => + logger.info("getComments(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")") + sender ! mComments.getComments(bankId, accountId, transactionId)(viewId) + + case rComments.addComment(bankId, accountId, transactionId, userId, viewId, text, datePosted) => + logger.info("addComment(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")") + + { + for { + res <- mComments.addComment(bankId, accountId, transactionId)(userId, viewId, text, datePosted) + } yield { + sender ! res.asInstanceOf[Comment] + } + }.getOrElse( context.stop(sender) ) + + case rComments.deleteComment(bankId : BankId, accountId : AccountId, transactionId: TransactionId, commentId : String) => + logger.info("deleteComment(" + bankId +", "+ accountId +", "+ transactionId + commentId +")") + + { + for { + res <- mComments.deleteComment(bankId, accountId, transactionId)(commentId) + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + case rComments.bulkDeleteComments(bankId: BankId, accountId: AccountId) => + + logger.info("bulkDeleteComments(" + bankId +", "+ accountId + ")") + + { + for { + res <- tryo{mComments.bulkDeleteComments(bankId, accountId)} + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + + } + +} + diff --git a/src/main/scala/code/remotedata/RemotedataConfig.scala b/src/main/scala/code/remotedata/RemotedataConfig.scala new file mode 100644 index 000000000..4431d00d8 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataConfig.scala @@ -0,0 +1,106 @@ +package code.remotedata + + +import akka.actor.ActorSystem +import com.typesafe.config.ConfigFactory +import net.liftweb.util.Props + + +object RemotedataConfig { + + val remoteHostname = Props.get("remotedata.hostname").openOr("127.0.0.1") + val remotePort = Props.get("remotedata.port").openOr("2662") + + val localHostname = "127.0.0.1" + val localPort = "2552" + + val commonConf = + """ + akka { + extensions = ["com.romix.akka.serialization.kryo.KryoSerializationExtension$"] + actor { + provider = "akka.remote.RemoteActorRefProvider" + kryo { + type = "graph" + idstrategy = "default" + buffer-size = 65536 + max-buffer-size = -1 + use-manifests = false + use-unsafe = true + post-serialization-transformations = "off" + #post-serialization-transformations = "lz4,aes" + #encryption { + # aes { + # mode = "AES/CBC/PKCS5Padding" + # key = j68KkRjq21ykRGAQ + # IV-length = 16 + # } + #} + implicit-registration-logging = true + kryo-trace = false + resolve-subclasses = true + } + serializers { + kryo = "com.romix.akka.serialization.kryo.KryoSerializer" + } + serialization-bindings { + "net.liftweb.common.Full" = kryo, + "net.liftweb.common.Empty" = kryo, + "net.liftweb.common.Box" = kryo, + "net.liftweb.common.ParamFailure" = kryo, + "code.api.APIFailure" = kryo, + "code.views.RemoteViewCaseClasses" = kryo, + "code.model.BankAccount" = kryo, + "code.model.View" = kryo, + "code.model.dataAccess.ViewImpl" = kryo, + "code.model.User" = kryo, + "code.model.ViewId" = kryo, + "code.model.ViewUID" = kryo, + "code.model.Permission" = kryo, + "scala.Unit" = kryo, + "scala.Boolean" = kryo, + "java.io.Serializable" = kryo, + "scala.collection.immutable.List" = kryo, + "akka.actor.ActorSelectionMessage" = kryo + } + } + remote { + enabled-transports = ["akka.remote.netty.tcp"] + netty { + tcp { + send-buffer-size = 50000000 + receive-buffer-size = 50000000 + maximum-frame-size = 52428800 + } + } + } + } + """ + + val lookupConf = + s""" + ${commonConf} + akka { + remote.netty.tcp.hostname = ${localHostname} + remote.netty.tcp.port = 0 + } + """ + + val localConf = + s""" + ${commonConf} + akka { + remote.netty.tcp.hostname = ${localHostname} + remote.netty.tcp.port = ${localPort} + } + """ + + val remoteConf = + s""" + ${commonConf} + akka { + remote.netty.tcp.hostname = ${remoteHostname} + remote.netty.tcp.port = ${remotePort} + } + """ +} diff --git a/src/main/scala/code/remotedata/RemotedataCounterparties.scala b/src/main/scala/code/remotedata/RemotedataCounterparties.scala new file mode 100644 index 000000000..d39dc2603 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataCounterparties.scala @@ -0,0 +1,131 @@ +package code.remotedata + +import java.util.Date + +import akka.actor.ActorKilledException +import akka.pattern.ask +import akka.util.Timeout +import code.api.APIFailure +import code.metadata.counterparties.{RemoteCounterpartiesCaseClasses, CounterpartyTrait, Counterparties} +import code.model._ +import net.liftweb.common.{Full, _} + +import scala.collection.immutable.List +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataCounterparties extends Counterparties { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rCounterparties = RemoteCounterpartiesCaseClasses + var counterpartiesActor = RemotedataActorSystem.getActor("counterparties") + + + override def getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty): Box[CounterpartyMetadata] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty)).mapTo[CounterpartyMetadata], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not getOrCreateMetadata", 404) + case e: Throwable => throw e + } + res + } + + override def getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId): List[CounterpartyMetadata] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)).mapTo[List[CounterpartyMetadata]], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadatas", 404) + case e: Throwable => throw e + } + res.get + } + + override def getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String): Box[CounterpartyMetadata] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String)).mapTo[CounterpartyMetadata], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not getMetadata", 404) + case e: Throwable => throw e + } + res + } + + override def getCounterparty(counterPartyId: String): Box[CounterpartyTrait] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.getCounterparty(counterPartyId: String)).mapTo[CounterpartyTrait], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterparty", 404) + case e: Throwable => throw e + } + res + } + + override def getCounterpartyByIban(iban: String): Box[CounterpartyTrait] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.getCounterpartyByIban(iban: String)).mapTo[CounterpartyTrait], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not getCounterpartyByIban", 404) + case e: Throwable => throw e + } + res + } + + override def createCounterparty(createdByUserId: String, thisBankId: String, thisAccountId: String, thisViewId: String, name: String, otherBankId: String, otherAccountId: String, otherAccountRoutingScheme: String, otherAccountRoutingAddress: String, otherBankRoutingScheme: String, otherBankRoutingAddress: String, isBeneficiary: Boolean): Box[CounterpartyTrait] = { + val res = try { + Full( + Await.result( + (counterpartiesActor ? rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId, + otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress, + isBeneficiary)).mapTo[CounterpartyTrait], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Can not createCounterparty", 404) + case e: Throwable => throw e + } + res + } + + override def checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String): Boolean = { + Await.result( + (counterpartiesActor ? rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)).mapTo[Boolean], + TIMEOUT + ) + } + +} diff --git a/src/main/scala/code/remotedata/RemotedataCounterpartiesActor.scala b/src/main/scala/code/remotedata/RemotedataCounterpartiesActor.scala new file mode 100644 index 000000000..1d046fbf3 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataCounterpartiesActor.scala @@ -0,0 +1,119 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import code.metadata.counterparties.{CounterpartyTrait, MapperCounterparties, RemoteCounterpartiesCaseClasses} +import code.model._ +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataCounterpartiesActor extends Actor { + + val logger = Logging(context.system, this) + + val mCounterparties = MapperCounterparties + val rCounterparties = RemoteCounterpartiesCaseClasses + + def receive = { + + case rCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String)=> + + logger.info("checkCounterpartyAvailable(" + name +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +")") + + sender ! mCounterparties.checkCounterpartyAvailable(name: String, thisBankId: String, thisAccountId: String, thisViewId: String) + + case rCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, + name, otherBankId, otherAccountId, otherAccountRoutingScheme, + otherAccountRoutingAddress, otherBankRoutingScheme, + otherBankRoutingAddress, isBeneficiary) => + + logger.info("createCounterparty(" + createdByUserId +", "+ thisBankId +", "+ thisAccountId +", "+ thisViewId +", "+ name +", "+ otherBankId + otherAccountId +", " + + otherAccountRoutingScheme +", "+ otherAccountRoutingAddress +", "+ otherBankRoutingScheme +", "+ otherBankRoutingAddress +", "+ isBeneficiary+ ")") + + { + for { + res <- mCounterparties.createCounterparty(createdByUserId, thisBankId, thisAccountId, thisViewId, name, otherBankId, otherAccountId, + otherAccountRoutingScheme, otherAccountRoutingAddress, otherBankRoutingScheme, otherBankRoutingAddress, + isBeneficiary) + } yield { + sender ! res.asInstanceOf[CounterpartyTrait] + } + }.getOrElse( context.stop(sender) ) + + + + case rCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) => + + logger.info("getOrCreateMetadata(" + originalPartyBankId +", " +originalPartyAccountId+otherParty+")") + + { + for { + res <- mCounterparties.getOrCreateMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, otherParty: Counterparty) + } yield { + sender ! res.asInstanceOf[CounterpartyMetadata] + } + }.getOrElse( context.stop(sender) ) + + case rCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId) => + logger.info("getOrCreateMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")") + + Full({ + for { + res <- Full(mCounterparties.getMetadatas(originalPartyBankId: BankId, originalPartyAccountId: AccountId)) + } yield { + sender ! res.asInstanceOf[List[CounterpartyMetadata]] + } + }).getOrElse(context.stop(sender)) + + + case rCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) => + + logger.info("getMetadata(" + originalPartyBankId +", "+originalPartyAccountId+")") + + { + for { + res <- mCounterparties.getMetadata(originalPartyBankId: BankId, originalPartyAccountId: AccountId, counterpartyMetadataId: String) + } yield { + sender ! res.asInstanceOf[CounterpartyMetadata] + } + }.getOrElse( context.stop(sender) ) + + + + case rCounterparties.getCounterparty(counterPartyId: String) => + + logger.info("getCounterparty(" + counterPartyId +")") + + { + for { + res <- mCounterparties.getCounterparty(counterPartyId: String) + } yield { + sender ! res.asInstanceOf[CounterpartyTrait] + } + }.getOrElse( context.stop(sender) ) + + + case rCounterparties.getCounterpartyByIban(iban: String) => + + logger.info("getOrCreateMetadata(" + iban +")") + + { + for { + res <- mCounterparties.getCounterpartyByIban(iban: String) + } yield { + sender ! res.asInstanceOf[CounterpartyTrait] + } + }.getOrElse( context.stop(sender) ) + + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + + } + +} diff --git a/src/main/scala/code/remotedata/RemotedataTags.scala b/src/main/scala/code/remotedata/RemotedataTags.scala new file mode 100644 index 000000000..c43e75559 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataTags.scala @@ -0,0 +1,66 @@ +package code.remotedata + +import java.util.Date + +import akka.actor.ActorKilledException +import akka.pattern.ask +import akka.util.Timeout +import code.api.APIFailure +import code.metadata.tags.{RemoteTagsCaseClasses, Tags} +import code.model._ +import net.liftweb.common.{Full, _} + +import scala.collection.immutable.List +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataTags extends Tags { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rTags = RemoteTagsCaseClasses + var tagsActor = RemotedataActorSystem.getActor("tags") + + + def getTags(bankId : BankId, accountId : AccountId, transactionId : TransactionId)(viewId : ViewId) : List[TransactionTag] = { + Await.result( + (tagsActor ? rTags.getTags(bankId, accountId, transactionId, viewId)).mapTo[List[TransactionTag]], + TIMEOUT + ) + } + + def addTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(userId: UserId, viewId : ViewId, tagText : String, datePosted : Date) : Box[TransactionTag] = { + Full( + Await.result( + (tagsActor ? rTags.addTag(bankId, accountId, transactionId, userId, viewId, tagText, datePosted)).mapTo[TransactionTag], + TIMEOUT + ) + ) + } + + def deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId)(tagId : String) : Box[Boolean] = { + val res = try { + Full( + Await.result( + (tagsActor ? rTags.deleteTag(bankId, accountId, transactionId, tagId)).mapTo[Boolean], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Cannot delete the tag", 404) + case e: Throwable => throw e + } + res + } + + def bulkDeleteTags(bankId: BankId, accountId: AccountId): Boolean = { + Await.result( + (tagsActor ? rTags.bulkDeleteTags(bankId, accountId)).mapTo[Boolean], + TIMEOUT + ) + } + + +} diff --git a/src/main/scala/code/remotedata/RemotedataTagsActor.scala b/src/main/scala/code/remotedata/RemotedataTagsActor.scala new file mode 100644 index 000000000..65988486c --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataTagsActor.scala @@ -0,0 +1,70 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import code.metadata.tags.{MappedTags, RemoteTagsCaseClasses} +import code.model._ +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataTagsActor extends Actor { + + val logger = Logging(context.system, this) + + val mTags = MappedTags + val rTags = RemoteTagsCaseClasses + + def receive = { + + case rTags.getTags(bankId, accountId, transactionId, viewId) => + logger.info("getTags(" + bankId +", "+ accountId +", "+ transactionId +", "+ viewId +")") + sender ! mTags.getTags(bankId, accountId, transactionId)(viewId) + + case rTags.addTag(bankId, accountId, transactionId, userId, viewId, text, datePosted) => + logger.info("addTag(" + bankId +", "+ accountId +", "+ transactionId +", "+ text +", "+ text +", "+ datePosted +")") + + { + for { + res <- mTags.addTag(bankId, accountId, transactionId)(userId, viewId, text, datePosted) + } yield { + sender ! res.asInstanceOf[TransactionTag] + } + }.getOrElse( context.stop(sender) ) + + case rTags.deleteTag(bankId : BankId, accountId : AccountId, transactionId: TransactionId, tagId : String) => + logger.info("deleteTag(" + bankId +", "+ accountId +", "+ transactionId + tagId +")") + + { + for { + res <- mTags.deleteTag(bankId, accountId, transactionId)(tagId) + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + case rTags.bulkDeleteTags(bankId: BankId, accountId: AccountId) => + + logger.info("bulkDeleteTags(" + bankId +", "+ accountId + ")") + + { + for { + res <- tryo{mTags.bulkDeleteTags(bankId, accountId)} + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + + } + +} + + diff --git a/src/main/scala/code/remotedata/RemotedataUsers.scala b/src/main/scala/code/remotedata/RemotedataUsers.scala new file mode 100644 index 000000000..dbe261d7d --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataUsers.scala @@ -0,0 +1,210 @@ +package code.remotedata + +import akka.actor.ActorKilledException +import akka.pattern.ask +import akka.util.Timeout +import code.api.APIFailure +import code.model.User +import code.model.dataAccess.ResourceUser +import code.users.{RemoteUserCaseClasses, Users} +import net.liftweb.common.{Full, _} + +import scala.collection.immutable.List +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataUsers extends Users { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rUsers = RemoteUserCaseClasses + var usersActor = RemotedataActorSystem.getActor("users") + + def getUserByResourceUserId(id : Long) : Box[User] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getUserByResourceUserId(id)).mapTo[User], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) + case e: Throwable => throw e + } + res + } + + def getResourceUserByResourceUserId(id : Long) : Box[ResourceUser] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getResourceUserByResourceUserId(id)).mapTo[ResourceUser], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"ResourceUser not found", 404) + case e: Throwable => throw e + } + res + } + + def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getUserByProviderId(provider, idGivenByProvider)).mapTo[User], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) + case e: Throwable => throw e + } + res + } + + def getUserByUserId(userId : String) : Box[User] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getUserByUserId(userId)).mapTo[User], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) + case e: Throwable => throw e + } + res + } + + def getUserByUserName(userName : String) : Box[ResourceUser] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getUserByUserName(userName)).mapTo[ResourceUser], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) + case e: Throwable => throw e + } + res + } + + def getUserByEmail(email : String) : Box[List[ResourceUser]] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getUserByEmail(email)).mapTo[List[ResourceUser]], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not found", 404) + case e: Throwable => throw e + } + res + } + + def getAllUsers() : Box[List[ResourceUser]] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.getAllUsers()).mapTo[List[ResourceUser]], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"Users not found", 404) + case e: Throwable => throw e + } + res + } + + def createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.createResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) + case e: Throwable => throw e + } + res + } + + def createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) : Box[ResourceUser] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.createUnsavedResourceUser(provider, providerId, name, email, userId)).mapTo[ResourceUser], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) + case e: Throwable => throw e + } + res + } + + def saveResourceUser(resourceUser: ResourceUser) : Box[ResourceUser] = { + val res = try { + Full( + Await.result( + (usersActor ? rUsers.saveResourceUser(resourceUser)).mapTo[ResourceUser], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not created", 404) + case e: Throwable => throw e + } + res + } + + def deleteResourceUser(userId: Long) : Box[Boolean] = { + val res = try{ + Full( + Await.result( + (usersActor ? rUsers.deleteResourceUser(userId)).mapTo[Boolean], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"User not deleted", 404) + case e: Throwable => throw e + } + res + } + + + def bulkDeleteAllResourceUsers(): Box[Boolean] = { + Full( + Await.result( + (usersActor ? rUsers.bulkDeleteAllResourceUsers()).mapTo[Boolean], + TIMEOUT + ) + ) + } + +} diff --git a/src/main/scala/code/remotedata/RemotedataUsersActor.scala b/src/main/scala/code/remotedata/RemotedataUsersActor.scala new file mode 100644 index 000000000..769bd78b6 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataUsersActor.scala @@ -0,0 +1,166 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import code.model._ +import code.model.dataAccess.ResourceUser +import code.users.{LiftUsers, RemoteUserCaseClasses} +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataUsersActor extends Actor { + + val logger = Logging(context.system, this) + + val mUsers = LiftUsers + val rUsers = RemoteUserCaseClasses + + def receive = { + + case rUsers.getUserByResourceUserId(id: Long) => + logger.info("getUserByResourceUserId(" + id +")") + + { + for { + res <- mUsers.getUserByResourceUserId(id) + } yield { + sender ! res.asInstanceOf[User] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getResourceUserByResourceUserId(id: Long) => + logger.info("getResourceUserByResourceUserId(" + id +")") + + { + for { + res <- mUsers.getResourceUserByResourceUserId(id) + } yield { + sender ! res.asInstanceOf[ResourceUser] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getUserByProviderId(provider : String, idGivenByProvider : String) => + logger.info("getUserByProviderId(" + provider +"," + idGivenByProvider +")") + + { + for { + res <- mUsers.getUserByProviderId(provider, idGivenByProvider) + } yield { + sender ! res.asInstanceOf[User] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getUserByUserId(userId: String) => + logger.info("getUserByUserId(" + userId +")") + + { + for { + res <- mUsers.getUserByUserId(userId) + } yield { + sender ! res.asInstanceOf[User] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getUserByUserName(userName: String) => + logger.info("getUserByUserName(" + userName +")") + + { + for { + res <- mUsers.getUserByUserName(userName) + } yield { + sender ! res.asInstanceOf[ResourceUser] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getUserByEmail(email: String) => + logger.info("getUserByEmail(" + email +")") + + { + for { + res <- mUsers.getUserByEmail(email) + } yield { + sender ! res + } + }.getOrElse( context.stop(sender) ) + + case rUsers.getAllUsers() => + logger.info("getAllUsers()") + + { + for { + res <- mUsers.getAllUsers() + } yield { + sender ! res + } + }.getOrElse( context.stop(sender) ) + + case rUsers.createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) => + logger.info("createResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")") + + { + for { + res <- mUsers.createResourceUser(provider, providerId, name, email, userId) + } yield { + sender ! res.asInstanceOf[ResourceUser] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.createUnsavedResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String], userId: Option[String]) => + logger.info("createUnsavedResourceUser(" + provider + ", " + providerId.getOrElse("None") + ", " + name.getOrElse("None") + ", " + email.getOrElse("None") + ", " + userId.getOrElse("None") + ")") + + { + for { + res <- mUsers.createUnsavedResourceUser(provider, providerId, name, email, userId) + } yield { + sender ! res.asInstanceOf[ResourceUser] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.saveResourceUser(resourceUser: ResourceUser) => + logger.info("saveResourceUser") + + { + for { + res <- mUsers.saveResourceUser(resourceUser) + } yield { + sender ! res.asInstanceOf[ResourceUser] + } + }.getOrElse( context.stop(sender) ) + + case rUsers.deleteResourceUser(id: Long) => + logger.info("deleteResourceUser(" + id +")") + + { + for { + res <- tryo{mUsers.deleteResourceUser(id)} + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case rUsers.bulkDeleteAllResourceUsers() => + + logger.info("bulkDeleteAllResourceUsers()") + + { + for { + res <- mUsers.bulkDeleteAllResourceUsers() + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + + } + +} + diff --git a/src/main/scala/code/remotedata/RemotedataViews.scala b/src/main/scala/code/remotedata/RemotedataViews.scala new file mode 100644 index 000000000..6ec86d565 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataViews.scala @@ -0,0 +1,331 @@ +package code.remotedata + + +import akka.actor.ActorKilledException +import akka.pattern.ask +import akka.util.Timeout +import code.api.APIFailure +import code.model.{CreateViewJSON, Permission, UpdateViewJSON, _} +import code.views.{RemoteViewCaseClasses, Views} +import net.liftweb.common.{Full, _} + +import scala.collection.immutable.List +import scala.concurrent.Await +import scala.concurrent.duration._ + + +object RemotedataViews extends Views { + + implicit val timeout = Timeout(10000 milliseconds) + val TIMEOUT = 10 seconds + val rViews = RemoteViewCaseClasses + var viewsActor = RemotedataActorSystem.getActor("views") + + def addPermissions(views: List[ViewUID], user: User): Box[List[View]] = { + val res = try { + Full( + Await.result( + (viewsActor ? rViews.addPermissions(views, user)).mapTo[List[View]], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"One or more views not found", 404) + case e: Throwable => throw e + } + res + } + + def permission(account: BankAccountUID, user: User): Box[Permission] = { + Full( + Await.result( + (viewsActor ? rViews.permission(account, user)).mapTo[Permission], + TIMEOUT + ) + ) + } + + def addPermission(viewUID: ViewUID, user: User): Box[View] = { + val res = try { + Full( + Await.result( + (viewsActor ? rViews.addPermission(viewUID, user)).mapTo[View], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404) + case e: Throwable => throw e + } + res + + } + + //TODO Fix return values in order to better describe failures + def revokePermission(viewUID : ViewUID, user : User) : Box[Boolean] = { + val res = try { + Full( + Await.result( + (viewsActor ? rViews.revokePermission(viewUID, user)).mapTo[Boolean], + TIMEOUT + ) + ) + } + catch { + case k: ClassCastException => k.getMessage match { + case "Cannot cast net.liftweb.common.Failure to java.lang.Boolean" => + return Empty ~> APIFailure(s"View $viewUID. not removed", 400) + case "Cannot cast net.liftweb.common.ParamFailure to java.lang.Boolean" => + return Empty ~> APIFailure(s"View $viewUID. not found", 404) + case _ => + return Empty ~> APIFailure(s"Unknown error", 406) + } + case e: Throwable => throw e + } + res + } + + def revokeAllPermissions(bankId : BankId, accountId: AccountId, user : User) : Box[Boolean] = { + val res = try{ + Full( + Await.result( + (viewsActor ? rViews.revokeAllPermissions(bankId, accountId, user)).mapTo[Boolean], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> Failure("One of the views this user has access to is the owner view, and there would be no one with access" + + " to this owner view if access to the user was revoked. No permissions to any views on the account have been revoked.") + + case e: Throwable => throw e + } + res + } + + def view(viewUID : ViewUID) : Box[View] = { + val res = try { + Full( + Await.result( + (viewsActor ? rViews.view(viewUID)).mapTo[View], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"View $viewUID. not found", 404) + case e: Throwable => throw e + } + res + } + + def view(viewId : ViewId, account: BankAccountUID) : Box[View] = { + val res = try { + Full( + Await.result( + (viewsActor ? rViews.view(viewId, account)).mapTo[View], + TIMEOUT + ) + ) + } + catch { + case k: ActorKilledException => Empty ~> APIFailure(s"View $viewId. not found", 404) + case e: Throwable => throw e + } + res + } + + + def createView(bankAccountId: BankAccountUID, view: CreateViewJSON): Box[View] = { + Await.result( + (viewsActor ? rViews.createView(bankAccountId, view)).mapTo[Box[View]], + TIMEOUT + ) + } + + def updateView(bankAccountId : BankAccountUID, viewId: ViewId, viewUpdateJson : UpdateViewJSON) : Box[View] = { + Await.result( + (viewsActor ? rViews.updateView(bankAccountId, viewId, viewUpdateJson)).mapTo[Box[View]], + TIMEOUT + ) + } + + def removeView(viewId: ViewId, bankAccountId: BankAccountUID): Box[Unit] = { + Await.result( + (viewsActor ? rViews.removeView(viewId, bankAccountId)).mapTo[Box[Unit]], + TIMEOUT + ) + } + + def permissions(account : BankAccountUID) : List[Permission] = { + Await.result( + (viewsActor ? rViews.permissions(account)).mapTo[List[Permission]], + TIMEOUT + ) + } + + def views(bankAccountId : BankAccountUID) : List[View] = { + Await.result( + (viewsActor ? rViews.views(bankAccountId)).mapTo[List[View]], + TIMEOUT + ) + } + + def permittedViews(user: User, bankAccountId: BankAccountUID): List[View] = { + Await.result( + (viewsActor ? rViews.permittedViews(user, bankAccountId)).mapTo[List[View]], + TIMEOUT + ) + } + + def publicViews(bankAccountId : BankAccountUID) : List[View] = { + Await.result( + (viewsActor ? rViews.publicViews(bankAccountId)).mapTo[List[View]], + TIMEOUT + ) + } + + def getAllPublicAccounts() : List[BankAccountUID] = { + Await.result( + (viewsActor ? rViews.getAllPublicAccounts()).mapTo[List[BankAccountUID]], + TIMEOUT + ) + } + + def getPublicBankAccounts(bank : Bank) : List[BankAccountUID] = { + Await.result( + (viewsActor ? rViews.getPublicBankAccounts(bank)).mapTo[List[BankAccountUID]], + TIMEOUT + ) + } + + def getAllAccountsUserCanSee(user : Box[User]) : List[BankAccountUID] = { + user match { + case Full(theUser) => { + Await.result ( + (viewsActor ? rViews.getAllAccountsUserCanSee(theUser)).mapTo[List[BankAccountUID]], + TIMEOUT) + } + case _ => getAllPublicAccounts() + } + } + + def getAllAccountsUserCanSee(bank: Bank, user : Box[User]) : List[BankAccountUID] = { + user match { + case Full(theUser) => { + Await.result( + (viewsActor ? rViews.getAllAccountsUserCanSee(bank, theUser)).mapTo[List[BankAccountUID]], + TIMEOUT + ) + } + case _ => getPublicBankAccounts(bank) + } + } + + def getNonPublicBankAccounts(user : User) : List[BankAccountUID] = { + Await.result( + (viewsActor ? rViews.getNonPublicBankAccounts(user)).mapTo[List[BankAccountUID]], + TIMEOUT + ) + } + + def getNonPublicBankAccounts(user : User, bankId : BankId) : List[BankAccountUID] = { + Await.result( + (viewsActor ? rViews.getNonPublicBankAccounts(user, bankId)).mapTo[List[BankAccountUID]], + TIMEOUT + ) + } + + def grantAccessToAllExistingViews(user : User) = { + Await.result( + (viewsActor ? rViews.grantAccessToAllExistingViews(user)).mapTo[Boolean], + TIMEOUT + ) + } + + def grantAccessToView(user : User, view : View) = { + Await.result( + (viewsActor ? rViews.grantAccessToView(user, view)).mapTo[Boolean], + TIMEOUT + ) + } + + def getOwners(view: View) : Set[User] = { + Await.result( + (viewsActor ? rViews.getOwners(view)).mapTo[Set[User]], + TIMEOUT + ) + } + + def createOwnerView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { + Full(Await.result( + (viewsActor ? rViews.createOwnerView(bankId, accountId, description)).mapTo[View], + TIMEOUT + ) + ) + } + + def createPublicView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { + Full(Await.result( + (viewsActor ? rViews.createPublicView(bankId, accountId, description)).mapTo[View], + TIMEOUT + ) + ) + } + + def createAccountantsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { + Full(Await.result( + (viewsActor ? rViews.createAccountantsView(bankId, accountId, description)).mapTo[View], + TIMEOUT + ) + ) + } + + def createAuditorsView(bankId: BankId, accountId: AccountId, description: String) : Box[View] = { + Full(Await.result( + (viewsActor ? rViews.createAuditorsView(bankId, accountId, description)).mapTo[View], + TIMEOUT + ) + ) + } + + def createRandomView(bankId: BankId, accountId: AccountId) : Box[View] = { + Full(Await.result( + (viewsActor ? rViews.createRandomView(bankId, accountId)).mapTo[View], + TIMEOUT + ) + ) + } + + def viewExists(bankId: BankId, accountId: AccountId, name: String): Boolean = { + Await.result( + (viewsActor ? rViews.viewExists(bankId, accountId, name)).mapTo[Boolean], + TIMEOUT + ) + } + + def removeAllViews(bankId: BankId, accountId: AccountId): Boolean = { + Await.result( + (viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean], + TIMEOUT + ) + } + + def removeAllPermissions(bankId: BankId, accountId: AccountId): Boolean = { + Await.result( + (viewsActor ? rViews.removeAllViews(bankId, accountId)).mapTo[Boolean], + TIMEOUT + ) + } + + // bulkDeletes for tests + def bulkDeleteAllPermissionsAndViews(): Boolean = { + Await.result( + (viewsActor ? rViews.bulkDeleteAllPermissionsAndViews()).mapTo[Boolean], + TIMEOUT + ) + } + +} \ No newline at end of file diff --git a/src/main/scala/code/remotedata/RemotedataViewsActor.scala b/src/main/scala/code/remotedata/RemotedataViewsActor.scala new file mode 100644 index 000000000..3bd303715 --- /dev/null +++ b/src/main/scala/code/remotedata/RemotedataViewsActor.scala @@ -0,0 +1,237 @@ +package code.remotedata + +import java.util.concurrent.TimeUnit + +import akka.actor.Actor +import akka.event.Logging +import akka.util.Timeout +import code.views.{MapperViews, RemoteViewCaseClasses} +import code.model._ +import net.liftweb.common._ +import net.liftweb.util.ControlHelpers.tryo + +import scala.concurrent.duration._ + + +class RemotedataViewsActor extends Actor { + + val logger = Logging(context.system, this) + + val mViews = MapperViews + val rViews = RemoteViewCaseClasses + + def receive = { + + case rViews.addPermissions(views : List[ViewUID], user : User) => + + logger.info("addPermissions(" + views +"," + user +")") + + { + for { + res <- mViews.addPermissions(views, user) + } yield { + sender ! res.asInstanceOf[List[View]] + } + }.getOrElse( context.stop(sender) ) + + + case rViews.addPermission(viewUID : ViewUID, user : User) => + + logger.info("addPermission(" + viewUID +"," + user +")") + + { + for { + res <- mViews.addPermission(viewUID, user) + } yield { + sender ! res.asInstanceOf[View] + } + }.getOrElse( context.stop(sender) ) + + + case rViews.permission(account : BankAccountUID, user: User) => + + logger.info("permission(" + account +"," + user +")") + + { + for { + res <- mViews.permission(account, user) + } yield { + sender ! res.asInstanceOf[Permission] + } + }.getOrElse( context.stop(sender) ) + + + //TODO Fix return values in order to better describe failures + case rViews.revokePermission(viewUID : ViewUID, user : User) => + + logger.info("revokePermission(" + viewUID +"," + user +")") + + + val res = mViews.revokePermission(viewUID, user) + res match { + case Full(r) => sender ! r + case f => sender ! f + } + + case rViews.revokeAllPermissions(bankId : BankId, accountId : AccountId, user : User) => + + logger.info("revokeAllPermissions(" + bankId +"," + accountId +","+ user +")") + + { + for { + res <- mViews.revokeAllPermissions(bankId, accountId, user) + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case rViews.view(viewUID : ViewUID) => + + logger.info("view(" + viewUID +")") + + { + for { + res <- mViews.view(viewUID) + } yield { + sender ! res.asInstanceOf[View] + } + }.getOrElse( context.stop(sender) ) + + + case rViews.view(viewId: ViewId, bankAccountId: BankAccountUID) => + + logger.info("view(" + viewId +", "+ bankAccountId + ")") + + { + for { + res <- mViews.view(viewId, bankAccountId) + } yield { + sender ! res.asInstanceOf[View] + } + }.getOrElse( context.stop(sender) ) + + case rViews.createView(bankAccountId : BankAccountUID, view: CreateViewJSON) => + logger.info("createView(" + bankAccountId +","+ view +")") + sender ! mViews.createView(bankAccountId, view) + + case rViews.updateView(bankAccountId : BankAccountUID, viewId : ViewId, viewUpdateJson : UpdateViewJSON) => + logger.info("updateView(" + bankAccountId +","+ viewId +","+ viewUpdateJson +")") + sender ! mViews.updateView(bankAccountId, viewId, viewUpdateJson) + + //case r.view(viewId: ViewId, bankAccountId: BankAccountUID) => + // logger.info("view(" + viewId +","+ bankAccountId +")") + // sender ! v.view(ViewId(viewId.value), bankAccountId) + + case rViews.removeView(viewId : ViewId, bankAccountId: BankAccountUID) => + logger.info("removeView(" + viewId +","+ bankAccountId +")") + sender ! mViews.removeView(viewId, bankAccountId) + + case rViews.permissions(bankAccountId : BankAccountUID) => + logger.info("premissions(" + bankAccountId +")") + sender ! mViews.permissions(bankAccountId) + + case rViews.views(bankAccountId : BankAccountUID) => + logger.info("views(" + bankAccountId +")") + sender ! mViews.views(bankAccountId) + + case rViews.permittedViews(user: User, bankAccountId: BankAccountUID) => + logger.info("permittedViews(" + user +", " + bankAccountId +")") + sender ! mViews.permittedViews(user, bankAccountId) + + case rViews.publicViews(bankAccountId : BankAccountUID) => + logger.info("publicViews(" + bankAccountId +")") + sender ! mViews.publicViews(bankAccountId) + + case rViews.getAllPublicAccounts() => + logger.info("getAllPublicAccounts()") + sender ! mViews.getAllPublicAccounts + + case rViews.getPublicBankAccounts(bank : Bank) => + logger.info("getPublicBankAccounts(" + bank +")") + sender ! mViews.getPublicBankAccounts(bank) + + case rViews.getAllAccountsUserCanSee(user : Box[User]) => + logger.info("getAllAccountsUserCanSee(" + user +")") + sender ! mViews.getAllAccountsUserCanSee(user) + + case rViews.getAllAccountsUserCanSee(user : User) => + logger.info("getAllAccountsUserCanSee(" + user +")") + sender ! mViews.getAllAccountsUserCanSee(Full(user)) + + case rViews.getAllAccountsUserCanSee(bank: Bank, user : Box[User]) => + logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")") + sender ! mViews.getAllAccountsUserCanSee(bank, user) + + case rViews.getAllAccountsUserCanSee(bank: Bank, user : User) => + logger.info("getAllAccountsUserCanSee(" + bank +", "+ user +")") + sender ! mViews.getAllAccountsUserCanSee(bank, Full(user)) + + case rViews.getNonPublicBankAccounts(user: User, bankId: BankId) => + logger.info("getNonPublicBankAccounts(" + user +", "+ bankId +")") + sender ! mViews.getNonPublicBankAccounts(user, bankId) + + case rViews.getNonPublicBankAccounts(user: User) => + logger.info("getNonPublicBankAccounts(" + user +")") + sender ! mViews.getNonPublicBankAccounts(user) + + case rViews.createOwnerView(bankId, accountId, description) => + logger.info("createOwnerView(" + bankId +", "+ accountId +", "+ description +")") + sender ! mViews.createOwnerView(bankId, accountId, description).orNull + + case rViews.createPublicView(bankId, accountId, description) => + logger.info("createPublicView(" + bankId +", "+ accountId +", "+ description +")") + sender ! mViews.createPublicView(bankId, accountId, description).orNull + + case rViews.createAccountantsView(bankId, accountId, description) => + logger.info("createAccountantsView(" + bankId +", "+ accountId +", "+ description +")") + sender ! mViews.createAccountantsView(bankId, accountId, description).orNull + + case rViews.createAuditorsView(bankId, accountId, description) => + logger.info("createAuditorsView(" + bankId +", "+ accountId +", "+ description +")") + sender ! mViews.createAuditorsView(bankId, accountId, description).orNull + + case rViews.createRandomView(bankId, accountId) => + logger.info("createRandomView(" + bankId +", "+ accountId +")") + sender ! mViews.createRandomView(bankId, accountId).orNull + + case rViews.getOwners(view) => + logger.info("getOwners(" + view +")") + sender ! mViews.getOwners(view) + + case rViews.grantAccessToView(user, view) => + logger.info("grantAccessToView(" + user +", "+ view +")") + sender ! mViews.grantAccessToView(user, view) + + case rViews.grantAccessToAllExistingViews(user) => + logger.info("grantAccessToAllExistingViews(" + user +")") + sender ! mViews.grantAccessToAllExistingViews(user) + + case rViews.removeAllPermissions(bankId, accountId) => + logger.info("removeAllPermissions(" + bankId +", "+ accountId +")") + sender ! mViews.removeAllPermissions(bankId, accountId) + + case rViews.removeAllViews(bankId, accountId) => + logger.info("removeAllViews(" + bankId +", "+ accountId +")") + sender ! mViews.removeAllViews(bankId, accountId) + + + case rViews.bulkDeleteAllPermissionsAndViews() => + + logger.info("bulkDeleteAllPermissionsAndViews()") + + { + for { + res <- tryo{mViews.bulkDeleteAllPermissionsAndViews()} + } yield { + sender ! res.asInstanceOf[Boolean] + } + }.getOrElse( context.stop(sender) ) + + + case message => logger.info("[AKKA ACTOR ERROR - REQUEST NOT RECOGNIZED] " + message) + + } + +} + diff --git a/src/main/scala/code/users/Users.scala b/src/main/scala/code/users/Users.scala index 567ab5025..d2eb75c1a 100644 --- a/src/main/scala/code/users/Users.scala +++ b/src/main/scala/code/users/Users.scala @@ -4,14 +4,14 @@ import net.liftweb.util.SimpleInjector import net.liftweb.common.Box import code.model.User import code.model.dataAccess.ResourceUser -import code.remotedata.Remotedata +import code.remotedata.RemotedataUsers object Users extends SimpleInjector { val users = new Inject(buildOne _) {} - def buildOne: Users = LiftUsers - //def buildOne: Users = Remotedata + //def buildOne: Users = LiftUsers + def buildOne: Users = RemotedataUsers } diff --git a/src/main/scala/code/views/Views.scala b/src/main/scala/code/views/Views.scala index 9845f556e..0d99982c9 100644 --- a/src/main/scala/code/views/Views.scala +++ b/src/main/scala/code/views/Views.scala @@ -5,15 +5,15 @@ import code.model._ import net.liftweb.util.SimpleInjector import code.model.Permission import code.model.CreateViewJSON -import code.remotedata.Remotedata +import code.remotedata.RemotedataViews object Views extends SimpleInjector { val views = new Inject(buildOne _) {} //TODO Remove MapperViews when Remotedata is optimized and stable - def buildOne: Views = MapperViews - //def buildOne: Views = Remotedata + //def buildOne: Views = MapperViews + def buildOne: Views = RemotedataViews } diff --git a/src/test/scala/code/api/LocalMappedConnectorTestSetup.scala b/src/test/scala/code/api/LocalMappedConnectorTestSetup.scala index 7b8b08e0e..1c88f9174 100644 --- a/src/test/scala/code/api/LocalMappedConnectorTestSetup.scala +++ b/src/test/scala/code/api/LocalMappedConnectorTestSetup.scala @@ -121,7 +121,7 @@ trait LocalMappedConnectorTestSetup extends TestConnectorSetupWithStandardPermis //empty the relational db tables after each test ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!()) - if (!Props.getBool("enable_remotedata", false)) { + if (!Props.getBool("remotedata.enable", false)) { ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews() diff --git a/src/test/scala/code/api/TestConnectorSetupWithStandardPermissions.scala b/src/test/scala/code/api/TestConnectorSetupWithStandardPermissions.scala index 84fadf0b5..1a6d71621 100644 --- a/src/test/scala/code/api/TestConnectorSetupWithStandardPermissions.scala +++ b/src/test/scala/code/api/TestConnectorSetupWithStandardPermissions.scala @@ -53,7 +53,7 @@ trait TestConnectorSetupWithStandardPermissions extends TestConnectorSetup { //empty the relational db tables after each test ToSchemify.models.filterNot(exclusion).foreach(_.bulkDelete_!!()) - if (!Props.getBool("enable_remotedata", false)) { + if (!Props.getBool("remotedata.enable", false)) { ToSchemify.modelsRemotedata.filterNot(exclusion).foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews() diff --git a/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala b/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala index 754d32f05..1e41c73ad 100644 --- a/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala +++ b/src/test/scala/code/sandbox/SandboxDataLoadingTest.scala @@ -92,7 +92,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul //drop database tables before //MongoDB.getDb(DefaultMongoIdentifier).foreach(_.dropDatabase()) ToSchemify.models.foreach(_.bulkDelete_!!()) - if (!Props.getBool("enable_remotedata", false)) { + if (!Props.getBool("remotedata.enable", false)) { ToSchemify.modelsRemotedata.foreach(_.bulkDelete_!!()) } else { Views.views.vend.bulkDeleteAllPermissionsAndViews()