Using username instead of email. Work in progress

This commit is contained in:
Petar Bozin 2016-09-02 19:53:39 +02:00
parent 9e535e40a3
commit be82823520
7 changed files with 66 additions and 47 deletions

View File

@ -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))
}
}

View File

@ -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

View File

@ -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(<lift:surround with="default" at="content"><lift:bind /></lift:surround>)
// 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._
<div id="authorizeSection">
<div id="userAccess">
<div class="account account-in-content">
{S.?("enter.email")}
{S.?("enter.username")}
<form class="forgotPassword" action={S.uri} method="post">
<div class="field username">
<label>{userNameFieldString}</label> <user:email />
<label>{userNameFieldString}</label> <user:username />
</div>
<div class="field buttons">
@ -329,7 +341,6 @@ import net.liftweb.util.Helpers._
homePage
}
val dummyPassword = "nothingreallyjustdummypass"
val extProvider = Props.get("connector").openOrThrowException("no connector set")
val user = findUserByUserName(username) match {
@ -350,7 +361,7 @@ import net.liftweb.util.Helpers._
.firstName(extDisplayName)
.email(extEmail)
// No need to store password, so store dummy string instead
.password(dummyPassword)
.password(UUID.randomUUID().toString)
.provider(extProvider)
.validated(true)
// Save the user in order to be able to log in

View File

@ -18,7 +18,7 @@ trait CreateOBPUsers {
}
}
val existingObpUser = OBPUser.find(By(OBPUser.email, u.email))
val existingObpUser = OBPUser.find(By(OBPUser.username, u.user_name))
if(existingObpUser.isDefined) {
logger.warn(s"Existing OBPUser with email ${u.email} detected in data import where no APIUser was found")
@ -26,7 +26,8 @@ trait CreateOBPUsers {
} else {
val obpUser = OBPUser.create
.email(u.email)
.lastName(u.display_name)
.lastName(u.user_name)
.username(u.user_name)
.password(u.password)
.validated(true)

View File

@ -594,7 +594,7 @@ case class SandboxLocationImport(
case class SandboxUserImport(
email : String,
password : String,
display_name : String)
user_name : String)
case class SandboxAccountImport(
id : String,

View File

@ -16,12 +16,14 @@ class directloginTest extends ServerSetup with BeforeAndAfter {
val KEY = randomString(40).toLowerCase
val SECRET = randomString(40).toLowerCase
val EMAIL = randomString(10).toLowerCase + "@example.com"
val USERNAME = randomString(10).toLowerCase
val PASSWORD = randomString(20)
before {
if (OBPUser.find(By(OBPUser.email, EMAIL)).isEmpty)
OBPUser.create.
email(EMAIL).
username(USERNAME).
password(PASSWORD).
validated(true).
firstName(randomString(10)).

View File

@ -257,15 +257,15 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
}
def verifyUserCreated(user : SandboxUserImport) = {
val foundUserBox = Users.users.vend.getUserByProviderId(defaultProvider, user.email)
val foundUserBox = Users.users.vend.getUserByProviderId(defaultProvider, user.user_name)
foundUserBox.isDefined should equal(true)
val foundUser = foundUserBox.get
foundUser.provider should equal(defaultProvider)
foundUser.idGivenByProvider should equal(user.email)
foundUser.idGivenByProvider should equal(user.user_name)
foundUser.emailAddress should equal(user.email)
foundUser.name should equal(user.display_name)
foundUser.name should equal(user.user_name)
}
def verifyAccountCreated(account : SandboxAccountImport) = {
@ -457,8 +457,8 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
val standardProducts = product1AtBank1 :: product2AtBank1 :: Nil
val user1 = SandboxUserImport(email = "user1@example.com", password = "qwerty", display_name = "User 1")
val user2 = SandboxUserImport(email = "user2@example.com", password = "qwerty", display_name = "User 2")
val user1 = SandboxUserImport(email = "user1@example.com", password = "qwerty", user_name = "User 1")
val user2 = SandboxUserImport(email = "user2@example.com", password = "qwerty", user_name = "User 2")
val standardUsers = user1 :: user2 :: Nil
@ -773,7 +773,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
val user1Json = Extraction.decompose(user1)
val differentDisplayName = "Jessica Bloggs"
differentDisplayName should not equal(user1.display_name)
differentDisplayName should not equal(user1.user_name)
val userWithSameEmailAsUser1 = user1Json.replace("display_name", differentDisplayName)
//neither of the users should exist initially
@ -803,7 +803,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
firstUser.get.emailAddress should equal(user1.email)
secondUser.get.emailAddress should equal(secondUserEmail)
firstUser.get.name should equal(user1.display_name)
firstUser.get.name should equal(user1.user_name)
secondUser.get.name should equal(differentDisplayName)
}
@ -824,7 +824,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
getResponse(List(user1Json, Extraction.decompose(otherUser))).code should equal(FAILED)
//and the other user should not have been created
Users.users.vend.getUserByProviderId(defaultProvider, otherUser.email)
Users.users.vend.getUserByProviderId(defaultProvider, otherUser.user_name)
}
it should "fail if a user's password is missing or empty" in {
@ -860,7 +860,7 @@ class SandboxDataLoadingTest extends FlatSpec with SendServerRequests with Shoul
//TODO: we shouldn't reference OBPUser here as it is an implementation, but for now there
//is no way to check User (the trait) passwords
val createdOBPUserBox = OBPUser.find(By(OBPUser.email, user1.email))
val createdOBPUserBox = OBPUser.find(By(OBPUser.username, user1.user_name))
createdOBPUserBox.isDefined should equal(true)
val createdOBPUser = createdOBPUserBox.get