mirror of
https://github.com/OpenBankProject/OBP-API.git
synced 2026-02-06 15:27:01 +00:00
Using username instead of email. Work in progress
This commit is contained in:
parent
9e535e40a3
commit
be82823520
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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)).
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user