feature/User Invitation Flow - POW

This commit is contained in:
Marko Milić 2021-06-16 17:48:26 +02:00
parent 65937f1c05
commit c54518d5af
2 changed files with 91 additions and 21 deletions

View File

@ -26,15 +26,17 @@ TESOBE (http://www.tesobe.com/)
*/
package code.snippet
import code.api.util.ErrorMessages
import code.users.UserInvitationProvider
import code.model.dataAccess.{AuthUser, ResourceUser}
import code.users.{UserInvitationProvider, Users}
import code.util.Helper
import code.util.Helper.MdcLoggable
import code.webuiprops.MappedWebUiPropsProvider.getWebUiPropsValue
import com.openbankproject.commons.model.BankId
import com.openbankproject.commons.model.User
import net.liftweb.common.Box
import net.liftweb.http.{RequestVar, S, SHtml}
import net.liftweb.util.CssSel
import net.liftweb.util.Helpers._
import org.apache.commons.lang3.StringUtils
import scala.collection.immutable.List
@ -45,41 +47,94 @@ class UserInvitation extends MdcLoggable {
private object companyVar extends RequestVar("")
private object countryVar extends RequestVar("None")
private object devEmailVar extends RequestVar("")
private object usernameVar extends RequestVar("")
// Can be used to show link to an online form to collect more information about the App / Startup
val registrationMoreInfoUrl = getWebUiPropsValue("webui_post_user_invitation_more_info_url", "")
val registrationConsumerButtonValue: String = getWebUiPropsValue("webui_post_user_invitation_submit_button_value", "Proceed")
val registrationConsumerButtonValue: String = getWebUiPropsValue("webui_post_user_invitation_submit_button_value", "Register as a Developer")
def registerForm: CssSel = {
val countries = List(("None", "None"), ("Bahrain", "Bahrain"), ("Germany", "Germany"), ("Mexico", "Mexico"), ("UK", "UK"))
val secretLink = S.param("id").getOrElse("0")
val userInvitation = UserInvitationProvider.userInvitationProvider.vend.getUserInvitationBySecretLink(secretLink.toLong)
firstNameVar.set(userInvitation.map(_.firstName).getOrElse("None"))
lastNameVar.set(userInvitation.map(_.lastName).getOrElse("None"))
devEmailVar.set(userInvitation.map(_.email).getOrElse("None"))
val firstName = userInvitation.map(_.firstName).getOrElse("None")
firstNameVar.set(firstName)
val lastName = userInvitation.map(_.lastName).getOrElse("None")
lastNameVar.set(lastName)
val email = userInvitation.map(_.email).getOrElse("None")
devEmailVar.set(email)
companyVar.set(userInvitation.map(_.company).getOrElse("None"))
countryVar.set(userInvitation.map(_.country).getOrElse("Bahrain"))
val username = firstName.toLowerCase + "." + lastName.toLowerCase()
usernameVar.set(username)
def submitButtonDefense: Unit = {
def submitButtonDefense(): Unit = {
val username = firstNameVar.is + "." + lastNameVar.is
createResourceUser(
provider = "OBP-User-Invitation",
providerId = Some(username),
name = Some(firstName + " " + lastName),
email = Some(email)
).map{ u =>
createAuthUser(user = u, firstName = firstName, lastName = lastName, password = "")
val resetLink = AuthUser.passwordResetUrl(u.idGivenByProvider, u.emailAddress, u.userId)
S.redirectTo(resetLink)
}
}
def showErrorsForUsername() = {
val usernameError = Helper.i18n("unique.username")
S.error("register-consumer-errors", usernameError)
register &
"#register-consumer-errors *" #> {
".error *" #>
List(usernameError).map({ e=>
".errorContent *" #> e
})
}
}
def register = {
"form" #> {
"#country" #> SHtml.select(countries, Box!! countryVar.is, countryVar(_)) &
"#country" #> SHtml.text(countryVar.is, countryVar(_)) &
"#firstName" #> SHtml.text(firstNameVar.is, firstNameVar(_)) &
"#lastName" #> SHtml.text(lastNameVar.is, lastNameVar(_)) &
"#companyName" #> SHtml.text(companyVar.is, companyVar(_)) &
"#devEmail" #> SHtml.text(devEmailVar, devEmailVar(_)) &
"#username" #> SHtml.text(usernameVar, usernameVar(_)) &
"type=submit" #> SHtml.submit(s"$registrationConsumerButtonValue", () => submitButtonDefense)
} &
"#register-consumer-success" #> ""
}
register
if(Users.users.vend.getUserByUserName(username).isDefined) showErrorsForUsername() else register
}
private def createAuthUser(user: User, firstName: String, lastName: String, password: String): Box[AuthUser] = tryo {
val newUser = AuthUser.create
.firstName(firstName)
.lastName(lastName)
.email(user.emailAddress)
.user(user.userPrimaryKey.value)
.username(user.idGivenByProvider)
.provider(user.provider)
.password(password)
.validated(true)
// Save the user
newUser.saveMe()
}
private def createResourceUser(provider: String, providerId: Option[String], name: Option[String], email: Option[String]): Box[ResourceUser] = {
Users.users.vend.createResourceUser(
provider = provider,
providerId = providerId,
createdByConsentId = None,
name = name,
email = email,
userId = None
)
}
}

View File

@ -34,42 +34,57 @@ Berlin 13359, Germany
</div>
<form method="post">
<style>
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
background-color: #ffffff;
}
</style>
<div class="row">
<div class="col-xs-12 col-sm-12">
<div class="form-group">
<label for="firstName">First name</label>
<input disabled type="text" name="app-name" id="firstName" class="form-control" aria-describedby="consumer-registration-app-name-error">
<div id = "consumer-registration-app-name-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-app-name-error"/>
<input readonly type="text" name="first-name" id="firstName" class="form-control" aria-describedby="consumer-registration-first-name-error">
<div id = "consumer-registration-first-name-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-first-name-error"/>
</div>
</div>
<div class="form-group">
<label for="lastName">Last name</label>
<input disabled type="text" name="last-name" id="lastName" class="form-control" aria-describedby="consumer-registration-app-name-error">
<input readonly type="text" name="last-name" id="lastName" class="form-control" aria-describedby="consumer-registration-app-name-error">
<div id = "consumer-registration-last-name-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-last-name-error"/>
</div>
</div>
<div class="form-group">
<label for="devEmail">Developer email</label>
<input disabled type="text" name="app-developer" id="devEmail" class="form-control" aria-describedby="consumer-registration-app-developer-error">
<input readonly type="text" name="app-developer" id="devEmail" class="form-control" aria-describedby="consumer-registration-app-developer-error">
<div id = "consumer-registration-app-developer-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-app-developer-error"/>
</div>
</div>
<div class="form-group">
<label for="companyName">Company</label>
<input disabled type="text" name="app-developer" id="companyName" class="form-control" aria-describedby="consumer-registration-company-error">
<input readonly type="text" name="app-developer" id="companyName" class="form-control" aria-describedby="consumer-registration-company-error">
<div id = "consumer-registration-company-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-app-developer-error"/>
</div>
</div>
<div class="form-group">
<label for="country" id="appTypeLabel">Country</label>
<select disabled name="app-type" id="country" class="form-control js-example-basic-single">
<option class="app-type-option"></option>
</select>
<label for="country">Company</label>
<input readonly type="text" name="country" id="country" class="form-control" aria-describedby="consumer-registration-company-error">
<div id = "consumer-registration-country-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-country-error"/>
</div>
</div>
<div class="form-group">
<label for="username">Username</label>
<input type="text" name="username" id="username" class="form-control" aria-describedby="consumer-registration-company-error">
<div id = "consumer-registration-username-error-div" class="hide">
<span data-lift="Msg?id=consumer-registration-username-error"/>
</div>
</div>
</div>
</div>