From be82823520e288ece3c03fa6870cfba176a82ca8 Mon Sep 17 00:00:00 2001 From: Petar Bozin Date: Fri, 2 Sep 2016 19:53:39 +0200 Subject: [PATCH] Using username instead of email. Work in progress --- .../scala/code/api/v2_0_0/APIMethods200.scala | 9 ++- .../code/api/v2_0_0/JSONFactory2.0.0.scala | 20 ++++--- .../scala/code/model/dataAccess/OBPUser.scala | 57 +++++++++++-------- .../scala/code/sandbox/CreateOBPUsers.scala | 5 +- .../scala/code/sandbox/OBPDataImport.scala | 2 +- src/test/scala/code/api/directloginTest.scala | 2 + .../code/sandbox/SandboxDataLoadingTest.scala | 18 +++--- 7 files changed, 66 insertions(+), 47 deletions(-) diff --git a/src/main/scala/code/api/v2_0_0/APIMethods200.scala b/src/main/scala/code/api/v2_0_0/APIMethods200.scala index 5f2196ff2..cef5cf7a1 100644 --- a/src/main/scala/code/api/v2_0_0/APIMethods200.scala +++ b/src/main/scala/code/api/v2_0_0/APIMethods200.scala @@ -1667,8 +1667,8 @@ trait APIMethods200 { "getUser", "GET", "/users/USER_EMAIL", - "Get User by Email Address", - """Get the user by email address + "Get Users by Email Address", + """Get users by email address | |Login is required. |CanGetAnyUser entitlement is required, @@ -1688,14 +1688,13 @@ trait APIMethods200 { user => for { l <- user ?~ ErrorMessages.UserNotLoggedIn - //b <- tryo{Bank.all.headOption} ?~! {ErrorMessages.BankNotFound} //TODO: This is a temp workaround canGetAnyUser <- booleanToBox(hasEntitlement("", l.userId, ApiRole.CanGetAnyUser), "CanGetAnyUser entitlement required") // Workaround to get userEmail address directly from URI without needing to URL-encode it - u <- OBPUser.getApiUserByEmail(CurrentReq.value.uri.split("/").last) ?~! {ErrorMessages.UserNotFoundByEmail} + users <- tryo{OBPUser.getApiUsersByEmail(CurrentReq.value.uri.split("/").last)} ?~! {ErrorMessages.UserNotFoundByEmail} } yield { // Format the data as V2.0.0 json - val json = JSONFactory200.createUserJSON(u) + val json = JSONFactory200.createUserJSONs(users) successJsonResponse(Extraction.decompose(json)) } } diff --git a/src/main/scala/code/api/v2_0_0/JSONFactory2.0.0.scala b/src/main/scala/code/api/v2_0_0/JSONFactory2.0.0.scala index 9f3af38b5..cb8fb1091 100644 --- a/src/main/scala/code/api/v2_0_0/JSONFactory2.0.0.scala +++ b/src/main/scala/code/api/v2_0_0/JSONFactory2.0.0.scala @@ -79,6 +79,9 @@ case class CreateUserJSON( last_name: String ) +case class CreateUserJSONs( + users : List[CreateUserJSON] + ) case class CreateMeetingJSON( provider_id: String, @@ -482,11 +485,12 @@ object JSONFactory200{ email : String, provider_id: String, provider : String, - display_name : String + user_name : String ) - - + case class UserJSONs( + users: List[UserJSON] + ) def createUserJSONfromOBPUser(user : OBPUser) : UserJSON = new UserJSON( @@ -494,7 +498,7 @@ object JSONFactory200{ email = user.email, provider_id = stringOrNull(user.provider), provider = stringOrNull(user.provider), - display_name = stringOrNull(user.displayName()) + user_name = stringOrNull(user.username) ) @@ -504,7 +508,7 @@ object JSONFactory200{ email = user.emailAddress, provider_id = user.idGivenByProvider, provider = stringOrNull(user.provider), - display_name = stringOrNull(user.name) //TODO: Rename to displayName ? + user_name = stringOrNull(user.name) //TODO: Rename to displayName ? ) } @@ -515,6 +519,10 @@ object JSONFactory200{ } } + def createUserJSONs(users : List[User]) : UserJSONs = { + UserJSONs(users.map(createUserJSON)) + } + def createUserJSONfromOBPUser(user : Box[OBPUser]) : UserJSON = { @@ -681,7 +689,6 @@ object JSONFactory200{ /** Creates v2.0.0 representation of a TransactionType - * * * @param transactionType An internal TransactionType instance * @return a v2.0.0 representation of a TransactionType @@ -705,7 +712,6 @@ def createTransactionTypeJSON(transactionType : TransactionType) : TransactionTy /** Creates v2.0.0 representation of a TransactionType - * * * @param tr An internal TransactionRequest instance * @return a v2.0.0 representation of a TransactionRequest diff --git a/src/main/scala/code/model/dataAccess/OBPUser.scala b/src/main/scala/code/model/dataAccess/OBPUser.scala index 87be8079b..d8572cc59 100755 --- a/src/main/scala/code/model/dataAccess/OBPUser.scala +++ b/src/main/scala/code/model/dataAccess/OBPUser.scala @@ -31,6 +31,8 @@ */ package code.model.dataAccess +import java.util.UUID + import code.api.{DirectLogin, OAuthHandshake} import code.bankconnectors.KafkaMappedConnector import code.bankconnectors.KafkaMappedConnector.KafkaInboundUser @@ -55,6 +57,18 @@ class OBPUser extends MegaProtoUser[OBPUser] with Logger { object user extends MappedLongForeignKey(this, APIUser) + /** + * The username field for the User. + */ + lazy val username: userName = new userName() + class userName extends MappedString(this, 64) { + override def displayName = S.?("username") + override def dbIndexed_? = true + override def validations = valUnique(S.?("unique.username")) _ :: super.validations + override val fieldId = Some(Text("txtUsername")) + } + + /** * The provider field for the User. */ @@ -64,15 +78,6 @@ class OBPUser extends MegaProtoUser[OBPUser] with Logger { override val fieldId = Some(Text("txtProvider")) } - def displayName() = { - if(firstName.get.isEmpty) { - lastName.get - } else if(lastName.get.isEmpty) { - firstName.get - } else { - firstName.get + " " + lastName.get - } - } def getProvider() = { if(provider.get == null) { @@ -86,14 +91,18 @@ class OBPUser extends MegaProtoUser[OBPUser] with Logger { def createUnsavedApiUser() : APIUser = { APIUser.create - .name_(displayName()) + .name_(username) .email(email) .provider_(getProvider()) - .providerId(email) + .providerId(username) } - def getApiUserByEmail(userEmail: String) : Box[APIUser] = { - APIUser.find(By(APIUser.email, userEmail)) + def getApiUsersByEmail(userEmail: String) : List[APIUser] = { + APIUser.findAll(By(APIUser.email, userEmail)) + } + + def getApiUserByUsername(username: String) : Box[APIUser] = { + APIUser.find(By(APIUser.name_, username)) } override def save(): Boolean = { @@ -107,8 +116,9 @@ class OBPUser extends MegaProtoUser[OBPUser] with Logger { info("user reference is not null. Trying to update the API User") user.obj.map{ u =>{ info("API User found ") - u.name_(displayName()) + u.name_(username) .email(email) + .providerId(username) .save } } @@ -134,6 +144,8 @@ class OBPUser extends MegaProtoUser[OBPUser] with Logger { // Override the validate method of MappedEmail class // There's no way to override the default emailPattern from MappedEmail object override lazy val email = new MyEmail(this, 48) { + override def validations = super.validations + override def dbIndexed_? = false override def validate = if (isEmailValid(i_is_!)) Nil else List(FieldError(this, Text(S.?("invalid.email.address")))) } } @@ -150,8 +162,8 @@ import net.liftweb.util.Helpers._ override def screenWrap = Full() // define the order fields will appear in forms and output - override def fieldOrder = List(id, firstName, lastName, email, password, provider) - override def signupFields = List(firstName, lastName, email, password) + override def fieldOrder = List(id, firstName, lastName, email, username, password, provider) + override def signupFields = List(firstName, lastName, email, username, password) // comment this line out to require email validations override def skipEmailValidation = true @@ -160,7 +172,7 @@ import net.liftweb.util.Helpers._ val loginXml = Templates(List("templates-hidden","_login")).map({ "form [action]" #> {S.uri} & "#loginText * " #> {S.?("log.in")} & - "#emailAddressText * " #> {S.?("email.address")} & + "#usernameText * " #> {S.?("username")} & "#passwordText * " #> {S.?("password")} & "#recoverPasswordLink * " #> { "a [href]" #> {lostPasswordPath.mkString("/", "/", "")} & @@ -180,9 +192,9 @@ import net.liftweb.util.Helpers._ */ def getCurrentUserUsername: String = { if (OAuthHandshake.getUser.getOrElse(None) != None ) - return OAuthHandshake.getUser.get.emailAddress + return OAuthHandshake.getUser.get.name if (DirectLogin.getUser.getOrElse(None) != None) - return DirectLogin.getUser.get.emailAddress + return DirectLogin.getUser.get.name return "" } @@ -217,10 +229,10 @@ import net.liftweb.util.Helpers._