From c54518d5afc7fbdf27f6d0f0fbdba8f75467483f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Wed, 16 Jun 2021 17:48:26 +0200 Subject: [PATCH] feature/User Invitation Flow - POW --- .../scala/code/snippet/UserInvitation.scala | 77 ++++++++++++++++--- obp-api/src/main/webapp/user-invitation.html | 35 ++++++--- 2 files changed, 91 insertions(+), 21 deletions(-) diff --git a/obp-api/src/main/scala/code/snippet/UserInvitation.scala b/obp-api/src/main/scala/code/snippet/UserInvitation.scala index 2b7e36d0e..93aa3eac6 100644 --- a/obp-api/src/main/scala/code/snippet/UserInvitation.scala +++ b/obp-api/src/main/scala/code/snippet/UserInvitation.scala @@ -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 + ) } } diff --git a/obp-api/src/main/webapp/user-invitation.html b/obp-api/src/main/webapp/user-invitation.html index 770799608..3ead45759 100644 --- a/obp-api/src/main/webapp/user-invitation.html +++ b/obp-api/src/main/webapp/user-invitation.html @@ -34,42 +34,57 @@ Berlin 13359, Germany
+
- -
- + +
+
- +
- +
- +
- - + + +
+ +
+
+
+ + +
+ +