mirror of
https://github.com/OpenBankProject/OBP-API.git
synced 2026-02-06 15:56:57 +00:00
Add API call to Link User to Customer #35 - without script to migrate the data and modification of getCustomer in MappedCustomerProvider
This commit is contained in:
parent
25be438b0f
commit
81d57c91bb
@ -63,6 +63,7 @@ import code.transaction_types.MappedTransactionType
|
||||
import code.snippet.{OAuthAuthorisation, OAuthWorkedThanks}
|
||||
import code.tesobe.CashAccountAPI
|
||||
import code.transactionrequests.MappedTransactionRequest
|
||||
import code.usercustomerlinks.MappedUserCustomerLink
|
||||
import net.liftweb.common._
|
||||
import net.liftweb.http._
|
||||
import net.liftweb.mapper._
|
||||
@ -417,5 +418,6 @@ object ToSchemify {
|
||||
MappedKycStatus,
|
||||
MappedSocialMedia,
|
||||
MappedTransactionType,
|
||||
MappedMeeting)
|
||||
MappedMeeting,
|
||||
MappedUserCustomerLink)
|
||||
}
|
||||
|
||||
@ -29,6 +29,7 @@ import code.socialmedia.SocialMediaHandle
|
||||
import code.transactionrequests.TransactionRequests
|
||||
|
||||
import code.meetings.Meeting
|
||||
import code.usercustomerlinks.UserCustomerLink
|
||||
|
||||
import net.liftweb.common.{Full, _}
|
||||
import net.liftweb.http.rest.RestHelper
|
||||
@ -1515,8 +1516,7 @@ trait APIMethods200 {
|
||||
postedData <- tryo{json.extract[CreateCustomerJson]} ?~! ErrorMessages.InvalidJsonFormat
|
||||
checkAvailable <- tryo(assert(Customer.customerProvider.vend.checkCustomerNumberAvailable(bankId, postedData.customer_number) == true)) ?~! ErrorMessages.CustomerNumberAlreadyExists
|
||||
// TODO The user id we expose should be a uuid . For now we have a long direct from the database.
|
||||
user_id <- tryo {postedData.user_id.toLong} ?~ ErrorMessages.InvalidNumber
|
||||
customer_user <- User.findByApiId(user_id) ?~! ErrorMessages.UserNotFoundById
|
||||
customer_user <- User.findByUserId(postedData.user_id) ?~! ErrorMessages.UserNotFoundById
|
||||
customer <- booleanToBox(Customer.customerProvider.vend.getCustomer(bankId, customer_user).isEmpty) ?~ ErrorMessages.CustomerAlreadyExistsForUser
|
||||
customer <- Customer.customerProvider.vend.addCustomer(bankId,
|
||||
customer_user,
|
||||
@ -1576,7 +1576,43 @@ trait APIMethods200 {
|
||||
}
|
||||
}
|
||||
|
||||
resourceDocs += ResourceDoc(
|
||||
createUserCustomerLinks,
|
||||
apiVersion,
|
||||
"createUserCustomerLinks",
|
||||
"POST",
|
||||
"/banks/BANK_ID/UserCustomerLinks",
|
||||
"Create user customer link.",
|
||||
"""Link a customer and an user
|
||||
|This call may require additional permissions/role in the future.
|
||||
|For now the authenticated user can create at most one linked customer.
|
||||
|OAuth authentication is required.
|
||||
|""",
|
||||
emptyObjectJson,
|
||||
emptyObjectJson,
|
||||
emptyObjectJson :: Nil,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
List(apiTagCustomer))
|
||||
|
||||
lazy val createUserCustomerLinks : PartialFunction[Req, Box[User] => Box[JsonResponse]] = {
|
||||
case "banks" :: BankId(bankId) :: "UserCustomerLinks" :: Nil JsonPost json -> _ => {
|
||||
user =>
|
||||
for {
|
||||
u <- user ?~! "User must be logged in to post Customer"
|
||||
bank <- tryo(Bank(bankId).get) ?~! {ErrorMessages.BankNotFound}
|
||||
user_id <- tryo(u.userId.isEmpty) ?~! "Field user_id is not defined for the logged user!"
|
||||
customer_user <- User.findByUserId(u.userId) ?~! ErrorMessages.UserNotFoundById
|
||||
customer <- tryo(Customer.customerProvider.vend.getCustomer(bankId, customer_user).get) ?~! ErrorMessages.CustomerNotFound
|
||||
userCustomerLink <- booleanToBox(UserCustomerLink.userCustomerLinkProvider.vend.getUserCustomerLink(u.userId, customer.customerId).isEmpty == true) ?~ ErrorMessages.CustomerAlreadyExistsForUser
|
||||
userCustomerLink <- UserCustomerLink.userCustomerLinkProvider.vend.createUserCustomerLink(u.userId, customer.customerId, bankId.value.toString, exampleDate, true) ?~! "Could not create userCustomerLink"
|
||||
} yield {
|
||||
val successJson = Extraction.decompose(code.api.v2_0_0.JSONFactory200.createUserCustomerLinkJSON(userCustomerLink))
|
||||
successJsonResponse(successJson, 201)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@ -111,6 +111,12 @@ case class MeetingPresentJSON(
|
||||
|
||||
)
|
||||
|
||||
case class UserCustomerLinkJSON(customer_id: String,
|
||||
user_id: String,
|
||||
bank_id: String,
|
||||
date_inserted: Date,
|
||||
is_active: Boolean)
|
||||
case class UserCustomerLinkJSONs(l: List[UserCustomerLinkJSON])
|
||||
|
||||
class BasicViewJSON(
|
||||
val id: String,
|
||||
@ -748,7 +754,18 @@ def createTransactionTypeJSON(transactionType : TransactionType) : TransactionTy
|
||||
MeetingJSONs(meetings.map(createMeetingJSON))
|
||||
}
|
||||
|
||||
def createUserCustomerLinkJSON(ucl: code.usercustomerlinks.UserCustomerLink) = {
|
||||
UserCustomerLinkJSON(customer_id = ucl.customerId,
|
||||
user_id = ucl.userId,
|
||||
bank_id = ucl.bankId,
|
||||
date_inserted = ucl.dateInserted,
|
||||
is_active = ucl.isActive
|
||||
)
|
||||
}
|
||||
|
||||
def createUserCustomerLinkJSONs(ucls: List[code.usercustomerlinks.UserCustomerLink]): UserCustomerLinkJSONs = {
|
||||
UserCustomerLinkJSONs(ucls.map(createUserCustomerLinkJSON))
|
||||
}
|
||||
|
||||
// Copied from 1.2.1 (import just this def instead?)
|
||||
def stringOrNull(text : String) =
|
||||
|
||||
@ -169,7 +169,8 @@ object OBPAPI2_0_0 extends OBPRestHelper with APIMethods130 with APIMethods140 w
|
||||
Implementations2_0_0.getMeetings,
|
||||
Implementations2_0_0.getMeeting,
|
||||
Implementations2_0_0.createCustomer,
|
||||
Implementations2_0_0.getCurrentUser
|
||||
Implementations2_0_0.getCurrentUser,
|
||||
Implementations2_0_0.createUserCustomerLinks
|
||||
)
|
||||
|
||||
routes.foreach(route => {
|
||||
|
||||
@ -100,4 +100,7 @@ object User {
|
||||
//versions of the API return this failure message, so if you change it, make sure
|
||||
//that all stable versions retain the same behavior
|
||||
Users.users.vend.getUserByProviderId(provider, idGivenByProvider) ~> UserNotFound(provider, idGivenByProvider)
|
||||
|
||||
def findByUserId(userId : String) =
|
||||
Users.users.vend.getUserByUserId(userId)
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
package code.usercustomerlinks
|
||||
|
||||
import java.util.Date
|
||||
|
||||
import code.customer.Customer
|
||||
import code.model.{User, BankId}
|
||||
import code.util.{DefaultStringField}
|
||||
import net.liftweb.common.Box
|
||||
import net.liftweb.mapper._
|
||||
|
||||
/**
|
||||
* Created by markom on 5/30/16.
|
||||
*/
|
||||
object MappedUserCustomerLinkProvider extends UserCustomerLinkProvider {
|
||||
|
||||
override def createUserCustomerLink(userId: String, customerId: String, bankId: String, dateInserted: Date, isActive: Boolean): Box[UserCustomerLink] = {
|
||||
|
||||
val createUserCustomerLink = MappedUserCustomerLink.create
|
||||
.mUserId(userId)
|
||||
.mCustomerId(customerId)
|
||||
.mBankId(bankId)
|
||||
.mDateInserted(new Date())
|
||||
.mIsActive(isActive)
|
||||
.saveMe()
|
||||
|
||||
Some(createUserCustomerLink)
|
||||
}
|
||||
|
||||
override def getUserCustomerLink(userId : String, customerId: String): Box[UserCustomerLink] = {
|
||||
MappedUserCustomerLink.find(
|
||||
By(MappedUserCustomerLink.mUserId, userId),
|
||||
By(MappedUserCustomerLink.mCustomerId, customerId))
|
||||
}
|
||||
|
||||
override def getUserCustomerLinks: Box[List[UserCustomerLink]] = {
|
||||
//MappedUserCustomerLink.bulkDelete_!!()
|
||||
Some(MappedUserCustomerLink.findAll())
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class MappedUserCustomerLink extends UserCustomerLink with LongKeyedMapper[MappedUserCustomerLink] with IdPK with CreatedUpdated {
|
||||
|
||||
def getSingleton = MappedUserCustomerLink
|
||||
|
||||
// Name the objects m* so that we can give the overridden methods nice names.
|
||||
// Assume we'll have to override all fields so name them all m*
|
||||
object mCustomerId extends DefaultStringField(this)
|
||||
object mBankId extends DefaultStringField(this)
|
||||
object mUserId extends DefaultStringField(this)
|
||||
object mDateInserted extends MappedDateTime(this)
|
||||
object mIsActive extends MappedBoolean(this)
|
||||
|
||||
override def customerId: String = mCustomerId.get // id.toString
|
||||
override def userId: String = mUserId.get
|
||||
override def bankId : String = mBankId.get
|
||||
override def dateInserted: Date = mDateInserted.get
|
||||
override def isActive: Boolean = mIsActive
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
object MappedUserCustomerLink extends MappedUserCustomerLink with LongKeyedMetaMapper[MappedUserCustomerLink] {
|
||||
override def dbIndexes = UniqueIndex(mUserId, mCustomerId) :: super.dbIndexes
|
||||
}
|
||||
29
src/main/scala/code/usercustomerlinks/UserCustomerLink.scala
Normal file
29
src/main/scala/code/usercustomerlinks/UserCustomerLink.scala
Normal file
@ -0,0 +1,29 @@
|
||||
package code.usercustomerlinks
|
||||
|
||||
import java.util.Date
|
||||
import code.model.{User, BankId}
|
||||
import net.liftweb.common.Box
|
||||
import net.liftweb.util.SimpleInjector
|
||||
|
||||
trait UserCustomerLink {
|
||||
def userId: String
|
||||
def customerId: String
|
||||
def bankId: String
|
||||
def dateInserted: Date
|
||||
def isActive: Boolean
|
||||
}
|
||||
|
||||
|
||||
object UserCustomerLink extends SimpleInjector {
|
||||
|
||||
val userCustomerLinkProvider = new Inject(buildOne _) {}
|
||||
|
||||
def buildOne: UserCustomerLinkProvider = MappedUserCustomerLinkProvider
|
||||
|
||||
}
|
||||
|
||||
trait UserCustomerLinkProvider {
|
||||
def createUserCustomerLink(userId: String, customerId: String, bankId: String, dateInserted: Date, isActive: Boolean): Box[UserCustomerLink]
|
||||
def getUserCustomerLink(userId: String, customerId: String): Box[UserCustomerLink]
|
||||
def getUserCustomerLinks: Box[List[UserCustomerLink]]
|
||||
}
|
||||
@ -15,5 +15,9 @@ private object LiftUsers extends Users {
|
||||
def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User] = {
|
||||
APIUser.find(By(APIUser.provider_, provider), By(APIUser.providerId, idGivenByProvider))
|
||||
}
|
||||
|
||||
def getUserByUserId(userId : String) : Box[User] = {
|
||||
APIUser.find(By(APIUser.userId_, userId))
|
||||
}
|
||||
|
||||
}
|
||||
@ -16,4 +16,6 @@ trait Users {
|
||||
def getUserByApiId(id : Long) : Box[User]
|
||||
|
||||
def getUserByProviderId(provider : String, idGivenByProvider : String) : Box[User]
|
||||
|
||||
def getUserByUserId(userId : String) : Box[User]
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user