From e14946b85accf50637a77b707521928a2f7d9227 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20Mili=C4=87?= Date: Tue, 16 Jan 2024 12:05:58 +0100 Subject: [PATCH] feature/Add Berlin Group Signing Basket; DB model --- .../main/scala/bootstrap/liftweb/Boot.scala | 4 + .../scala/code/api/constant/constant.scala | 2 +- .../main/scala/code/api/util/NewStyle.scala | 45 ++++ .../scala/code/bankconnectors/Connector.scala | 14 +- .../bankconnectors/ConnectorBuilderUtil.scala | 1 + .../bankconnectors/LocalMappedConnector.scala | 47 +++- .../akka/AkkaConnector_vDec2018.scala | 227 ++++++++++++++---- .../rest/RestConnector_vMar2019.scala | 56 ++++- .../StoredProcedureConnector_vDec2019.scala | 56 ++++- .../remotedata/RemotedataChallenges.scala | 8 +- .../RemotedataChallengesActor.scala | 5 +- .../MappedSigningBasketProvider.scala | 105 ++++++++ .../code/signingbaskets/SigningBasket.scala | 27 +++ .../ChallengeProvider.scala | 11 +- .../MappedChallengeProvider.scala | 40 +-- .../MappedExpectedChallengeAnswer.scala | 59 ++--- .../RestConnector_vMar2019_frozen_meta_data | Bin 113208 -> 114141 bytes .../scala/code/util/MappedClassNameTest.scala | 3 + .../commons/dto/JsonsTransfer.scala | 11 + .../commons/model/CommonModel.scala | 1 + .../commons/model/CommonModelTrait.scala | 14 ++ release_notes.md | 1 + 22 files changed, 618 insertions(+), 119 deletions(-) create mode 100644 obp-api/src/main/scala/code/signingbaskets/MappedSigningBasketProvider.scala create mode 100644 obp-api/src/main/scala/code/signingbaskets/SigningBasket.scala diff --git a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala index b4d0725be..c370280e6 100644 --- a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala @@ -110,6 +110,7 @@ import code.regulatedentities.MappedRegulatedEntity import code.remotedata.RemotedataActors import code.scheduler.{DataBaseCleanerScheduler, DatabaseDriverScheduler, JobScheduler, MetricsArchiveScheduler} import code.scope.{MappedScope, MappedUserScope} +import code.signingbaskets.{MappedSigningBasket, MappedSigningBasketConsent, MappedSigningBasketPayment} import code.snippet.{OAuthAuthorisation, OAuthWorkedThanks} import code.socialmedia.MappedSocialMedia import code.standingorders.StandingOrder @@ -1040,6 +1041,9 @@ object ToSchemify { AuthUser, JobScheduler, MappedETag, + MappedSigningBasket, + MappedSigningBasketPayment, + MappedSigningBasketConsent, MappedRegulatedEntity, AtmAttribute, Admin, diff --git a/obp-api/src/main/scala/code/api/constant/constant.scala b/obp-api/src/main/scala/code/api/constant/constant.scala index bc0163d0a..86a601cfe 100644 --- a/obp-api/src/main/scala/code/api/constant/constant.scala +++ b/obp-api/src/main/scala/code/api/constant/constant.scala @@ -22,7 +22,7 @@ object Constant extends MdcLoggable { final val h2DatabaseDefaultUrlValue = "jdbc:h2:mem:OBPTest_H2_v2.1.214;NON_KEYWORDS=VALUE;DB_CLOSE_DELAY=10" - final val HostName = APIUtil.getPropsValue("hostname").openOrThrowException(ErrorMessages.HostnameNotSpecified) + def HostName = APIUtil.getPropsValue("hostname").openOrThrowException(ErrorMessages.HostnameNotSpecified) final val ApiInstanceId = { val apiInstanceIdFromProps = APIUtil.getPropsValue("api_instance_id") diff --git a/obp-api/src/main/scala/code/api/util/NewStyle.scala b/obp-api/src/main/scala/code/api/util/NewStyle.scala index 5042e4402..5b0338bc3 100644 --- a/obp-api/src/main/scala/code/api/util/NewStyle.scala +++ b/obp-api/src/main/scala/code/api/util/NewStyle.scala @@ -1402,6 +1402,51 @@ object NewStyle extends MdcLoggable{ } } } + + /** + * + * @param userIds OBP support multiple challenges, we can ask different users to answer different challenges + * @param challengeType OBP support different challenge types, @see the Enum ChallengeType + * @param scaMethod @see the Enum StrongCustomerAuthentication + * @param scaStatus @see the Enum StrongCustomerAuthenticationStatus + * @param transactionRequestId it is also the BelinGroup PaymentId + * @param consentId + * @param basketId + * @param authenticationMethodId this is used for BelinGroup Consent + * @param callContext + * @return + */ + def createChallengesC3( + userIds: List[String], + challengeType: ChallengeType.Value, + transactionRequestId: Option[String], + scaMethod: Option[SCA], + scaStatus: Option[SCAStatus],//Only use for BerlinGroup Now + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + authenticationMethodId: Option[String], + callContext: Option[CallContext] + ) : OBPReturnType[List[ChallengeTrait]] = { + if(challengeType == ChallengeType.BERLINGROUP_PAYMENT_CHALLENGE && (transactionRequestId.isEmpty || scaStatus.isEmpty || scaMethod.isEmpty)){ + Future{ throw new Exception(s"$UnknownError The following parameters can not be empty for BERLINGROUP_PAYMENT challengeType: paymentId($transactionRequestId), scaStatus($scaStatus), scaMethod($scaMethod) ")} + }else if(challengeType == ChallengeType.BERLINGROUP_CONSENT_CHALLENGE && (consentId.isEmpty || scaStatus.isEmpty || scaMethod.isEmpty)){ + Future{ throw new Exception(s"$UnknownError The following parameters can not be empty for BERLINGROUP_CONSENT challengeType: consentId($consentId), scaStatus($scaStatus), scaMethod($scaMethod) ")} + }else{ + Connector.connector.vend.createChallengesC3( + userIds: List[String], + challengeType: ChallengeType.Value, + transactionRequestId: Option[String], + scaMethod: Option[SCA], + scaStatus: Option[SCAStatus],//Only use for BerlinGroup Now + consentId: Option[String], // Note: consentId and transactionRequestId and consentId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and consentId are exclusive here. + authenticationMethodId: Option[String], + callContext: Option[CallContext] + ) map { i => + (unboxFullOrFail(i._1, callContext, s"$InvalidConnectorResponseForCreateChallenge ", 400), i._2) + } + } + } def getChallengesByTransactionRequestId( transactionRequestId: String, diff --git a/obp-api/src/main/scala/code/bankconnectors/Connector.scala b/obp-api/src/main/scala/code/bankconnectors/Connector.scala index 08278efb5..0d4e8217b 100644 --- a/obp-api/src/main/scala/code/bankconnectors/Connector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/Connector.scala @@ -421,7 +421,19 @@ trait Connector extends MdcLoggable { consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. authenticationMethodId: Option[String], callContext: Option[CallContext]) : OBPReturnType[Box[List[ChallengeTrait]]]= Future{(Failure(setUnimplementedError), callContext)} - + + // now, we try to share the same challenges for obp payments, berlin group payments, berlin group consents and signing baskets + def createChallengesC3( + userIds: List[String], + challengeType: ChallengeType.Value, + transactionRequestId: Option[String], + scaMethod: Option[SCA], + scaStatus: Option[SCAStatus],//Only use for BerlinGroup Now + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + authenticationMethodId: Option[String], + callContext: Option[CallContext]) : OBPReturnType[Box[List[ChallengeTrait]]]= Future{(Failure(setUnimplementedError), callContext)} + // Validates an answer for a challenge and returns if the answer is correct or not def validateChallengeAnswer(challengeId: String, hashOfSuppliedAnswer: String, callContext: Option[CallContext]): OBPReturnType[Box[Boolean]] = Future{(Full(true), callContext)} diff --git a/obp-api/src/main/scala/code/bankconnectors/ConnectorBuilderUtil.scala b/obp-api/src/main/scala/code/bankconnectors/ConnectorBuilderUtil.scala index bdce90a3f..5418bac7c 100644 --- a/obp-api/src/main/scala/code/bankconnectors/ConnectorBuilderUtil.scala +++ b/obp-api/src/main/scala/code/bankconnectors/ConnectorBuilderUtil.scala @@ -365,6 +365,7 @@ object ConnectorBuilderUtil { "checkExternalUserCredentials", "checkExternalUserExists", "createChallengesC2", + "createChallengesC3", "getChallenge", "getChallengesByTransactionRequestId", "getChallengesByConsentId", diff --git a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala index a963fe985..fe23129b5 100644 --- a/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala +++ b/obp-api/src/main/scala/code/bankconnectors/LocalMappedConnector.scala @@ -266,6 +266,7 @@ object LocalMappedConnector extends Connector with MdcLoggable { None, //there are only for new version, set the empty here. None,//there are only for new version, set the empty here. None,//there are only for new version, set the empty here. + None,//there are only for new version, set the empty here. challengeType = OBP_TRANSACTION_REQUEST_CHALLENGE.toString, callContext: Option[CallContext]) (challenge._1.map(_.challengeId),challenge._2) @@ -296,6 +297,7 @@ object LocalMappedConnector extends Connector with MdcLoggable { None, //there are only for new version, set the empty here. None,//there are only for new version, set the empty here. None,//there are only for new version, set the empty here. + None,//there are only for new version, set the empty here. challengeType = OBP_TRANSACTION_REQUEST_CHALLENGE.toString, callContext ) @@ -323,24 +325,43 @@ object LocalMappedConnector extends Connector with MdcLoggable { scaMethod, scaStatus, consentId, + None, // Signing Baskets are introduced in case of version createChallengesC3 authenticationMethodId, challengeType = OBP_TRANSACTION_REQUEST_CHALLENGE.toString, callContext ) challengeId.toList } + (Full(challenges.flatten), callContext) + } - //We use obp MappedExpectedChallengeAnswer instead of Authorisations now. - // please also check Challenges.ChallengeProvider.vend.saveChallenge -// Authorisations.authorisationProvider.vend.createAuthorization( -// transactionRequestId.getOrElse(""), -// consentId.getOrElse(""), -// AuthenticationType.SMS_OTP.toString, -// "", -// ScaStatus.received.toString, -// "12345" // TODO Implement SMS sending -// ) - + override def createChallengesC3( + userIds: List[String], + challengeType: ChallengeType.Value, + transactionRequestId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + scaMethod: Option[SCA], + scaStatus: Option[SCAStatus],//Only use for BerlinGroup Now + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + authenticationMethodId: Option[String], + callContext: Option[CallContext] + ): OBPReturnType[Box[List[ChallengeTrait]]] = Future { + val challenges = for { + userId <- userIds + } yield { + val (challengeId, _) = createChallengeInternal( + userId, + transactionRequestId.getOrElse(""), + scaMethod, + scaStatus, + consentId, + basketId, + authenticationMethodId, + challengeType = OBP_TRANSACTION_REQUEST_CHALLENGE.toString, + callContext + ) + challengeId.toList + } (Full(challenges.flatten), callContext) } @@ -349,7 +370,8 @@ object LocalMappedConnector extends Connector with MdcLoggable { transactionRequestId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], //Only use for BerlinGroup Now - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: consentId and transactionRequestId and BasketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and BasketId are exclusive here. authenticationMethodId: Option[String], challengeType: String, callContext: Option[CallContext] @@ -367,6 +389,7 @@ object LocalMappedConnector extends Connector with MdcLoggable { scaMethod, scaStatus, consentId, + basketId, authenticationMethodId, challengeType), callContext) } diff --git a/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala b/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala index 9e6ca7c2c..54ab9297d 100644 --- a/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala +++ b/obp-api/src/main/scala/code/bankconnectors/akka/AkkaConnector_vDec2018.scala @@ -308,7 +308,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { //---------------- dynamic start -------------------please don't modify this line -// ---------- created on 2022-03-11T18:42:02Z +// ---------- created on 2024-01-15T10:29:27Z messageDocs += validateAndCheckIbanNumberDoc def validateAndCheckIbanNumberDoc = MessageDoc( @@ -332,7 +332,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { city=cityExample.value, zip="string", phone=phoneExample.value, - country="string", + country=countryExample.value, countryIso="string", sepaCreditTransfer=sepaCreditTransferExample.value, sepaDirectDebit=sepaDirectDebitExample.value, @@ -545,9 +545,11 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), - authenticationMethodId=Some("string")))) + authenticationMethodId=Some("string"), + attemptCounter=123))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -559,6 +561,51 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { response.map(convertToTuple[List[ChallengeCommons]](callContext)) } + messageDocs += createChallengesC3Doc + def createChallengesC3Doc = MessageDoc( + process = "obp.createChallengesC3", + messageFormat = messageFormat, + description = "Create Challenges C3", + outboundTopic = None, + inboundTopic = None, + exampleOutboundMessage = ( + OutBoundCreateChallengesC3(outboundAdapterCallContext=MessageDocsSwaggerDefinitions.outboundAdapterCallContext, + userIds=listExample.value.split("[,;]").toList, + challengeType=com.openbankproject.commons.model.enums.ChallengeType.example, + transactionRequestId=Some(transactionRequestIdExample.value), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + consentId=Some(consentIdExample.value), + basketId=Some("string"), + authenticationMethodId=Some("string")) + ), + exampleInboundMessage = ( + InBoundCreateChallengesC3(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, + status=MessageDocsSwaggerDefinitions.inboundStatus, + data=List( ChallengeCommons(challengeId=challengeIdExample.value, + transactionRequestId=transactionRequestIdExample.value, + expectedAnswer="string", + expectedUserId="string", + salt="string", + successful=true, + challengeType=challengeTypeExample.value, + consentId=Some(consentIdExample.value), + basketId=Some("string"), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + authenticationMethodId=Some("string"), + attemptCounter=123))) + ), + adapterImplementation = Some(AdapterImplementation("- Core", 1)) + ) + + override def createChallengesC3(userIds: List[String], challengeType: ChallengeType.Value, transactionRequestId: Option[String], scaMethod: Option[StrongCustomerAuthentication.SCA], scaStatus: Option[SCAStatus], consentId: Option[String], basketId: Option[String], authenticationMethodId: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[List[ChallengeTrait]]] = { + import com.openbankproject.commons.dto.{InBoundCreateChallengesC3 => InBound, OutBoundCreateChallengesC3 => OutBound} + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, userIds, challengeType, transactionRequestId, scaMethod, scaStatus, consentId, basketId, authenticationMethodId) + val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _) + response.map(convertToTuple[List[ChallengeCommons]](callContext)) + } + messageDocs += validateChallengeAnswerDoc def validateChallengeAnswerDoc = MessageDoc( process = "obp.validateChallengeAnswer", @@ -611,9 +658,11 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), - authenticationMethodId=Some("string"))) + authenticationMethodId=Some("string"), + attemptCounter=123)) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -647,9 +696,11 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), - authenticationMethodId=Some("string")))) + authenticationMethodId=Some("string"), + attemptCounter=123))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -683,9 +734,11 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), - authenticationMethodId=Some("string")))) + authenticationMethodId=Some("string"), + attemptCounter=123))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -719,9 +772,11 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), - authenticationMethodId=Some("string"))) + authenticationMethodId=Some("string"), + attemptCounter=123)) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -958,7 +1013,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) - override def getBankAccountByRoutingLegacy(bankId: Option[BankId], scheme: String, address: String, callContext: Option[CallContext]): Box[(BankAccount, Option[CallContext])] = { + override def getBankAccountByRouting(bankId: Option[BankId], scheme: String, address: String, callContext: Option[CallContext]): OBPReturnType[Box[BankAccount]] = { import com.openbankproject.commons.dto.{InBoundGetBankAccountByRouting => InBound, OutBoundGetBankAccountByRouting => OutBound} val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, scheme, address) val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _) @@ -1431,8 +1486,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { reasonRequested=com.openbankproject.commons.model.PinResetReason.FORGOT)), collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), - customerId=customerIdExample.value - ))) + customerId=customerIdExample.value, + cvv=Some(cvvExample.value), + brand=Some(brandExample.value)))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -1498,8 +1554,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { reasonRequested=com.openbankproject.commons.model.PinResetReason.FORGOT)), collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), - customerId=customerIdExample.value - )) + customerId=customerIdExample.value, + cvv=Some(cvvExample.value), + brand=Some(brandExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -1613,7 +1670,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { reasonRequested=com.openbankproject.commons.model.PinResetReason.FORGOT)), collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), - customerId=customerIdExample.value))) + customerId=customerIdExample.value, + cvv=Some(cvvExample.value), + brand=Some(brandExample.value)))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -1656,8 +1715,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), customerId=customerIdExample.value, - cvv = cvvExample.value, - brand = brandExample.value) + cvv=cvvExample.value, + brand=brandExample.value) ), exampleInboundMessage = ( InBoundCreatePhysicalCard(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, @@ -1701,17 +1760,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { reasonRequested=com.openbankproject.commons.model.PinResetReason.FORGOT)), collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), - customerId=customerIdExample.value)) + customerId=customerIdExample.value, + cvv=Some(cvvExample.value), + brand=Some(brandExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) - override def createPhysicalCard(bankCardNumber: String, nameOnCard: String, cardType: String, issueNumber: String, - serialNumber: String, validFrom: Date, expires: Date, enabled: Boolean, cancelled: Boolean, onHotList: Boolean, - technology: String, networks: List[String], allows: List[String], accountId: String, bankId: String, - replacement: Option[CardReplacementInfo], pinResets: List[PinResetInfo], collected: Option[CardCollectionInfo], - posted: Option[CardPostedInfo], customerId: String, cvv: String, brand: String, - callContext: Option[CallContext]): OBPReturnType[Box[PhysicalCard]] = { + override def createPhysicalCard(bankCardNumber: String, nameOnCard: String, cardType: String, issueNumber: String, serialNumber: String, validFrom: Date, expires: Date, enabled: Boolean, cancelled: Boolean, onHotList: Boolean, technology: String, networks: List[String], allows: List[String], accountId: String, bankId: String, replacement: Option[CardReplacementInfo], pinResets: List[PinResetInfo], collected: Option[CardCollectionInfo], posted: Option[CardPostedInfo], customerId: String, cvv: String, brand: String, callContext: Option[CallContext]): OBPReturnType[Box[PhysicalCard]] = { import com.openbankproject.commons.dto.{InBoundCreatePhysicalCard => InBound, OutBoundCreatePhysicalCard => OutBound} val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankCardNumber, nameOnCard, cardType, issueNumber, serialNumber, validFrom, expires, enabled, cancelled, onHotList, technology, networks, allows, accountId, bankId, replacement, pinResets, collected, posted, customerId, cvv, brand) val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _) @@ -1793,7 +1849,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { reasonRequested=com.openbankproject.commons.model.PinResetReason.FORGOT)), collected=Some(CardCollectionInfo(toDate(collectedExample))), posted=Some(CardPostedInfo(toDate(postedExample))), - customerId=customerIdExample.value)) + customerId=customerIdExample.value, + cvv=Some(cvvExample.value), + brand=Some(brandExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -1950,6 +2008,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -2127,6 +2193,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -2245,6 +2319,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -2336,6 +2418,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -2440,6 +2530,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -2510,6 +2608,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -3016,7 +3122,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { siteName=Some("string"), cashWithdrawalNationalFee=Some(cashWithdrawalNationalFeeExample.value), cashWithdrawalInternationalFee=Some(cashWithdrawalInternationalFeeExample.value), - balanceInquiryFee=Some(balanceInquiryFeeExample.value))) + balanceInquiryFee=Some(balanceInquiryFeeExample.value), + atmType=Some(atmTypeExample.value), + phone=Some(phoneExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -3095,7 +3203,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { siteName=Some("string"), cashWithdrawalNationalFee=Some(cashWithdrawalNationalFeeExample.value), cashWithdrawalInternationalFee=Some(cashWithdrawalInternationalFeeExample.value), - balanceInquiryFee=Some(balanceInquiryFeeExample.value)))) + balanceInquiryFee=Some(balanceInquiryFeeExample.value), + atmType=Some(atmTypeExample.value), + phone=Some(phoneExample.value)))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -3190,6 +3300,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -3447,6 +3565,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -3533,6 +3659,14 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { account_id=account_idExample.value)), to_sepa=Some(TransactionRequestIban(transactionRequestIban.value)), to_counterparty=Some(TransactionRequestCounterpartyId(transactionRequestCounterpartyIdExample.value)), + to_simple=Some( TransactionRequestSimple(otherBankRoutingScheme=otherBankRoutingSchemeExample.value, + otherBankRoutingAddress=otherBankRoutingAddressExample.value, + otherBranchRoutingScheme=otherBranchRoutingSchemeExample.value, + otherBranchRoutingAddress=otherBranchRoutingAddressExample.value, + otherAccountRoutingScheme=otherAccountRoutingSchemeExample.value, + otherAccountRoutingAddress=otherAccountRoutingAddressExample.value, + otherAccountSecondaryRoutingScheme=otherAccountSecondaryRoutingSchemeExample.value, + otherAccountSecondaryRoutingAddress=otherAccountSecondaryRoutingAddressExample.value)), to_transfer_to_phone=Some( TransactionRequestTransferToPhone(value= AmountOfMoneyJsonV121(currency=currencyExample.value, amount=amountExample.value), description=descriptionExample.value, @@ -4491,8 +4625,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { key=keyExample.value, value=valueExample.value, timeStamp=toDate(timeStampExample), - consumerId=consumerIdExample.value - )) + consumerId=consumerIdExample.value)) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -4526,8 +4659,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { value=valueExample.value, challenge=challengeExample.value, status=statusExample.value, - consumerId=consumerIdExample.value - )) + consumerId=consumerIdExample.value)) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -4609,7 +4741,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { userId=userIdExample.value, key=keyExample.value, value=valueExample.value, - timeStamp=toDate(timeStampExample), + timeStamp=toDate(timeStampExample), consumerId=consumerIdExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) @@ -4771,7 +4903,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { accountAttributeId=accountAttributeIdExample.value, name=nameExample.value, attributeType=com.openbankproject.commons.model.enums.AccountAttributeType.example, - value=valueExample.value)) + value=valueExample.value, + productInstanceCode=Some("string"))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -4829,7 +4962,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { productAttributeId=Some(productAttributeIdExample.value), name=nameExample.value, accountAttributeType=com.openbankproject.commons.model.enums.AccountAttributeType.example, - value=valueExample.value) + value=valueExample.value, + productInstanceCode=Some("string")) ), exampleInboundMessage = ( InBoundCreateOrUpdateAccountAttribute(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, @@ -4840,15 +4974,15 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { accountAttributeId=accountAttributeIdExample.value, name=nameExample.value, attributeType=com.openbankproject.commons.model.enums.AccountAttributeType.example, - value=valueExample.value)) + value=valueExample.value, + productInstanceCode=Some("string"))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) - override def createOrUpdateAccountAttribute(bankId: BankId, accountId: AccountId, productCode: ProductCode, productAttributeId: Option[String], name: String, accountAttributeType: AccountAttributeType.Value, value: String, - productInstanceCode: Option[String],callContext: Option[CallContext]): OBPReturnType[Box[AccountAttribute]] = { + override def createOrUpdateAccountAttribute(bankId: BankId, accountId: AccountId, productCode: ProductCode, productAttributeId: Option[String], name: String, accountAttributeType: AccountAttributeType.Value, value: String, productInstanceCode: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[AccountAttribute]] = { import com.openbankproject.commons.dto.{InBoundCreateOrUpdateAccountAttribute => InBound, OutBoundCreateOrUpdateAccountAttribute => OutBound} - val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, accountId, productCode, productAttributeId, name, accountAttributeType, value) + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, accountId, productCode, productAttributeId, name, accountAttributeType, value, productInstanceCode) val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _) response.map(convertToTuple[AccountAttributeCommons](callContext)) } @@ -4943,7 +5077,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { name=nameExample.value, attributeType=com.openbankproject.commons.model.enums.ProductAttributeType.example, value=valueExample.value, - isActive=Some(isActiveExample.value.toBoolean)))) + isActive=Some(isActiveExample.value.toBoolean))), + productInstanceCode=Some("string")) ), exampleInboundMessage = ( InBoundCreateAccountAttributes(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, @@ -4954,15 +5089,15 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { accountAttributeId=accountAttributeIdExample.value, name=nameExample.value, attributeType=com.openbankproject.commons.model.enums.AccountAttributeType.example, - value=valueExample.value))) + value=valueExample.value, + productInstanceCode=Some("string")))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) - override def createAccountAttributes(bankId: BankId, accountId: AccountId, productCode: ProductCode, accountAttributes: List[ProductAttribute], - productInstanceCode: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[List[AccountAttribute]]] = { + override def createAccountAttributes(bankId: BankId, accountId: AccountId, productCode: ProductCode, accountAttributes: List[ProductAttribute], productInstanceCode: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[List[AccountAttribute]]] = { import com.openbankproject.commons.dto.{InBoundCreateAccountAttributes => InBound, OutBoundCreateAccountAttributes => OutBound} - val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, accountId, productCode, accountAttributes) + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, accountId, productCode, accountAttributes, productInstanceCode) val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _) response.map(convertToTuple[List[AccountAttributeCommons]](callContext)) } @@ -4988,7 +5123,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { accountAttributeId=accountAttributeIdExample.value, name=nameExample.value, attributeType=com.openbankproject.commons.model.enums.AccountAttributeType.example, - value=valueExample.value))) + value=valueExample.value, + productInstanceCode=Some("string")))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -6091,7 +6227,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { date=toDate(dateExample), message=messageExample.value, fromDepartment=fromDepartmentExample.value, - fromPerson=fromPersonExample.value)) + fromPerson=fromPersonExample.value, + transport=Some(transportExample.value))) ), adapterImplementation = Some(AdapterImplementation("- Core", 1)) ) @@ -6240,6 +6377,6 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit { response.map(convertToTuple[Boolean](callContext)) } -// ---------- created on 2022-03-11T18:42:02Z -//---------------- dynamic end ---------------------please don't modify this line +// ---------- created on 2024-01-15T10:29:27Z +//---------------- dynamic end ---------------------please don't modify this line } diff --git a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala index cc8f4c8f9..070c7de2d 100644 --- a/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/rest/RestConnector_vMar2019.scala @@ -96,7 +96,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable //---------------- dynamic start -------------------please don't modify this line -// ---------- created on 2023-06-01T16:45:32Z +// ---------- created on 2024-01-15T10:31:47Z messageDocs += getAdapterInfoDoc def getAdapterInfoDoc = MessageDoc( @@ -367,6 +367,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -382,6 +383,51 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable response.map(convertToTuple[List[ChallengeCommons]](callContext)) } + messageDocs += createChallengesC3Doc + def createChallengesC3Doc = MessageDoc( + process = "obp.createChallengesC3", + messageFormat = messageFormat, + description = "Create Challenges C3", + outboundTopic = None, + inboundTopic = None, + exampleOutboundMessage = ( + OutBoundCreateChallengesC3(outboundAdapterCallContext=MessageDocsSwaggerDefinitions.outboundAdapterCallContext, + userIds=listExample.value.split("[,;]").toList, + challengeType=com.openbankproject.commons.model.enums.ChallengeType.example, + transactionRequestId=Some(transactionRequestIdExample.value), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + consentId=Some(consentIdExample.value), + basketId=Some("string"), + authenticationMethodId=Some("string")) + ), + exampleInboundMessage = ( + InBoundCreateChallengesC3(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, + status=MessageDocsSwaggerDefinitions.inboundStatus, + data=List( ChallengeCommons(challengeId=challengeIdExample.value, + transactionRequestId=transactionRequestIdExample.value, + expectedAnswer="string", + expectedUserId="string", + salt="string", + successful=true, + challengeType=challengeTypeExample.value, + consentId=Some(consentIdExample.value), + basketId=Some("string"), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + authenticationMethodId=Some("string"), + attemptCounter=123))) + ), + adapterImplementation = Some(AdapterImplementation("- Core", 1)) + ) + + override def createChallengesC3(userIds: List[String], challengeType: ChallengeType.Value, transactionRequestId: Option[String], scaMethod: Option[StrongCustomerAuthentication.SCA], scaStatus: Option[SCAStatus], consentId: Option[String], basketId: Option[String], authenticationMethodId: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[List[ChallengeTrait]]] = { + import com.openbankproject.commons.dto.{InBoundCreateChallengesC3 => InBound, OutBoundCreateChallengesC3 => OutBound} + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, userIds, challengeType, transactionRequestId, scaMethod, scaStatus, consentId, basketId, authenticationMethodId) + val response: Future[Box[InBound]] = sendRequest[InBound](getUrl(callContext, "createChallengesC3"), HttpMethods.POST, req, callContext) + response.map(convertToTuple[List[ChallengeCommons]](callContext)) + } + messageDocs += validateChallengeAnswerDoc def validateChallengeAnswerDoc = MessageDoc( process = "obp.validateChallengeAnswer", @@ -434,6 +480,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -471,6 +518,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -508,6 +556,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -545,6 +594,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -6516,8 +6566,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable response.map(convertToTuple[Boolean](callContext)) } -// ---------- created on 2023-06-01T16:45:32Z -//---------------- dynamic end ---------------------please don't modify this line +// ---------- created on 2024-01-15T10:31:47Z +//---------------- dynamic end ---------------------please don't modify this line private val availableOperation = DynamicEntityOperation.values.map(it => s""""$it"""").mkString("[", ", ", "]") diff --git a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala index 304c4d0e2..49338a7d3 100644 --- a/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala +++ b/obp-api/src/main/scala/code/bankconnectors/storedprocedure/StoredProcedureConnector_vDec2019.scala @@ -75,7 +75,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { val connectorName = "stored_procedure_vDec2019" //---------------- dynamic start -------------------please don't modify this line -// ---------- created on 2023-06-01T16:47:09Z +// ---------- created on 2024-01-15T10:32:00Z messageDocs += getAdapterInfoDoc def getAdapterInfoDoc = MessageDoc( @@ -346,6 +346,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -361,6 +362,51 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { response.map(convertToTuple[List[ChallengeCommons]](callContext)) } + messageDocs += createChallengesC3Doc + def createChallengesC3Doc = MessageDoc( + process = "obp.createChallengesC3", + messageFormat = messageFormat, + description = "Create Challenges C3", + outboundTopic = None, + inboundTopic = None, + exampleOutboundMessage = ( + OutBoundCreateChallengesC3(outboundAdapterCallContext=MessageDocsSwaggerDefinitions.outboundAdapterCallContext, + userIds=listExample.value.split("[,;]").toList, + challengeType=com.openbankproject.commons.model.enums.ChallengeType.example, + transactionRequestId=Some(transactionRequestIdExample.value), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + consentId=Some(consentIdExample.value), + basketId=Some("string"), + authenticationMethodId=Some("string")) + ), + exampleInboundMessage = ( + InBoundCreateChallengesC3(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext, + status=MessageDocsSwaggerDefinitions.inboundStatus, + data=List( ChallengeCommons(challengeId=challengeIdExample.value, + transactionRequestId=transactionRequestIdExample.value, + expectedAnswer="string", + expectedUserId="string", + salt="string", + successful=true, + challengeType=challengeTypeExample.value, + consentId=Some(consentIdExample.value), + basketId=Some("string"), + scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), + scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), + authenticationMethodId=Some("string"), + attemptCounter=123))) + ), + adapterImplementation = Some(AdapterImplementation("- Core", 1)) + ) + + override def createChallengesC3(userIds: List[String], challengeType: ChallengeType.Value, transactionRequestId: Option[String], scaMethod: Option[StrongCustomerAuthentication.SCA], scaStatus: Option[SCAStatus], consentId: Option[String], basketId: Option[String], authenticationMethodId: Option[String], callContext: Option[CallContext]): OBPReturnType[Box[List[ChallengeTrait]]] = { + import com.openbankproject.commons.dto.{InBoundCreateChallengesC3 => InBound, OutBoundCreateChallengesC3 => OutBound} + val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, userIds, challengeType, transactionRequestId, scaMethod, scaStatus, consentId, basketId, authenticationMethodId) + val response: Future[Box[InBound]] = sendRequest[InBound]("obp_create_challenges_c3", req, callContext) + response.map(convertToTuple[List[ChallengeCommons]](callContext)) + } + messageDocs += validateChallengeAnswerDoc def validateChallengeAnswerDoc = MessageDoc( process = "obp.validateChallengeAnswer", @@ -413,6 +459,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -450,6 +497,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -487,6 +535,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -524,6 +573,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { successful=true, challengeType=challengeTypeExample.value, consentId=Some(consentIdExample.value), + basketId=Some("string"), scaMethod=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SMS), scaStatus=Some(com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.example), authenticationMethodId=Some("string"), @@ -6495,8 +6545,8 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable { response.map(convertToTuple[Boolean](callContext)) } -// ---------- created on 2023-06-01T16:47:09Z -//---------------- dynamic end ---------------------please don't modify this line +// ---------- created on 2024-01-15T10:32:00Z +//---------------- dynamic end ---------------------please don't modify this line private val availableOperation = DynamicEntityOperation.values.map(it => s""""$it"""").mkString("[", ", ", "]") diff --git a/obp-api/src/main/scala/code/remotedata/RemotedataChallenges.scala b/obp-api/src/main/scala/code/remotedata/RemotedataChallenges.scala index 868f4f111..cf0b86ea4 100644 --- a/obp-api/src/main/scala/code/remotedata/RemotedataChallenges.scala +++ b/obp-api/src/main/scala/code/remotedata/RemotedataChallenges.scala @@ -20,12 +20,13 @@ object RemotedataChallenges extends ObpActorInit with ChallengeProvider { expectedUserId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. authenticationMethodId: Option[String], challengeType: String, ): Box[ChallengeTrait] = getValueFromFuture( - (actor ? cc.saveChallenge(challengeId, transactionRequestId, salt, expectedAnswer, expectedUserId, scaMethod, scaStatus, consentId, authenticationMethodId, challengeType)) + (actor ? cc.saveChallenge(challengeId, transactionRequestId, salt, expectedAnswer, expectedUserId, scaMethod, scaStatus, consentId, basketId, authenticationMethodId, challengeType)) .mapTo[Box[ChallengeTrait]] ) @@ -44,5 +45,8 @@ object RemotedataChallenges extends ObpActorInit with ChallengeProvider { override def getChallengesByConsentId(consentId: String): Box[List[ChallengeTrait]] = getValueFromFuture( (actor ? cc.getChallengesByConsentId(consentId)).mapTo[Box[List[ChallengeTrait]]] ) + override def getChallengesByBasketId(basketId: String): Box[List[ChallengeTrait]] = getValueFromFuture( + (actor ? cc.getChallengesByConsentId(basketId )).mapTo[Box[List[ChallengeTrait]]] + ) } diff --git a/obp-api/src/main/scala/code/remotedata/RemotedataChallengesActor.scala b/obp-api/src/main/scala/code/remotedata/RemotedataChallengesActor.scala index f26c530c7..1d5f141da 100644 --- a/obp-api/src/main/scala/code/remotedata/RemotedataChallengesActor.scala +++ b/obp-api/src/main/scala/code/remotedata/RemotedataChallengesActor.scala @@ -17,12 +17,13 @@ class RemotedataChallengesActor extends Actor with ObpActorHelper with MdcLoggab case cc.saveChallenge(challengeId: String, transactionRequestId: String, salt: String, expectedAnswer: String, expectedUserId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. authenticationMethodId: Option[String], challengeType: String, ) => logger.debug(s"saveChallenge($challengeId, $transactionRequestId, $salt, $expectedAnswer, $expectedUserId)") - sender ! (mapper.saveChallenge(challengeId, transactionRequestId, salt, expectedAnswer, expectedUserId, scaMethod, scaStatus, consentId, authenticationMethodId, challengeType: String)) + sender ! (mapper.saveChallenge(challengeId, transactionRequestId, salt, expectedAnswer, expectedUserId, scaMethod, scaStatus, consentId, basketId, authenticationMethodId, challengeType: String)) case cc.getChallenge(challengeId: String) => logger.debug(s"getChallenge($challengeId)") diff --git a/obp-api/src/main/scala/code/signingbaskets/MappedSigningBasketProvider.scala b/obp-api/src/main/scala/code/signingbaskets/MappedSigningBasketProvider.scala new file mode 100644 index 000000000..ee9016857 --- /dev/null +++ b/obp-api/src/main/scala/code/signingbaskets/MappedSigningBasketProvider.scala @@ -0,0 +1,105 @@ +package code.signingbaskets + +import code.util.MappedUUID +import com.openbankproject.commons.model.{RegulatedEntityTrait, SigningBasketConsentTrait, SigningBasketPaymentTrait, SigningBasketTrait} +import net.liftweb.common.Box +import net.liftweb.common.Box.tryo +import net.liftweb.mapper._ + +import scala.concurrent.Future + +object MappedSigningBasketProvider extends SigningBasketProvider { + def getSigningBaskets(): List[SigningBasketTrait] = { + MappedSigningBasket.findAll() + } + + override def getSigningBasketByBasketId(entityId: String): Box[SigningBasketTrait] = { + MappedSigningBasket.find(By(MappedSigningBasket.BasketId, entityId)) + } + + override def createSigningBasket(basketId: Option[String], + status: Option[String], + description: Option[String], + ): Box[SigningBasketTrait] = { + tryo { + val entity = MappedSigningBasket.create + basketId match { + case Some(v) => entity.BasketId(v) + case None => + } + status match { + case Some(v) => entity.Status(v) + case None => + } + description match { + case Some(v) => entity.Description(v) + case None => + } + + if (entity.validate.isEmpty) { + entity.saveMe() + } else { + throw new Error(entity.validate.map(_.msg.toString()).mkString(";")) + } + } + } + + override def deleteSigningBasket(id: String): Box[Boolean] = { + tryo( + MappedSigningBasket.bulkDelete_!!(By(MappedSigningBasket.BasketId, id)) + ) + } + +} + +class MappedSigningBasket extends SigningBasketTrait with LongKeyedMapper[MappedSigningBasket] with IdPK { + override def getSingleton = MappedSigningBasket + object BasketId extends MappedUUID(this) + object Status extends MappedString(this, 50) + object Description extends MappedText(this) + + + + override def basketId: String = BasketId.get + override def status: String = Status.get + override def description: String = Description.get + + +} + +object MappedSigningBasket extends MappedSigningBasket with LongKeyedMetaMapper[MappedSigningBasket] { + override def dbTableName = "SigningBasket" // define the DB table name + override def dbIndexes = Index(BasketId) :: super.dbIndexes +} + + +class MappedSigningBasketPayment extends SigningBasketPaymentTrait with LongKeyedMapper[MappedSigningBasketPayment] with IdPK { + override def getSingleton = MappedSigningBasketPayment + object BasketId extends MappedUUID(this) + object PaymentId extends MappedUUID(this) + + + override def basketId: String = BasketId.get + override def paymentId: String = PaymentId.get + +} +object MappedSigningBasketPayment extends MappedSigningBasketPayment with LongKeyedMetaMapper[MappedSigningBasketPayment] { + override def dbTableName = "SigningBasketPayment" // define the DB table name + override def dbIndexes = Index(BasketId, PaymentId) :: super.dbIndexes +} + +class MappedSigningBasketConsent extends SigningBasketConsentTrait with LongKeyedMapper[MappedSigningBasketConsent] with IdPK { + override def getSingleton = MappedSigningBasketConsent + object BasketId extends MappedUUID(this) + object ConsentId extends MappedUUID(this) + + + override def basketId: String = BasketId.get + override def consentId: String = ConsentId.get + +} +object MappedSigningBasketConsent extends MappedSigningBasketConsent with LongKeyedMetaMapper[MappedSigningBasketConsent] { + override def dbTableName = "SigningBasketConsent" // define the DB table name + override def dbIndexes = Index(BasketId, ConsentId) :: super.dbIndexes +} + diff --git a/obp-api/src/main/scala/code/signingbaskets/SigningBasket.scala b/obp-api/src/main/scala/code/signingbaskets/SigningBasket.scala new file mode 100644 index 000000000..6e2f04181 --- /dev/null +++ b/obp-api/src/main/scala/code/signingbaskets/SigningBasket.scala @@ -0,0 +1,27 @@ +package code.signingbaskets + +import com.openbankproject.commons.model.SigningBasketTrait +import net.liftweb.common.{Box, Logger} +import net.liftweb.util.SimpleInjector + +object SigningBasketX extends SimpleInjector { + val signingBasketProvider: SigningBasketX.Inject[SigningBasketProvider] = new Inject(buildOne _) {} + private def buildOne: SigningBasketProvider = MappedSigningBasketProvider +} + +trait SigningBasketProvider { + + private val logger = Logger(classOf[SigningBasketProvider]) + + def getSigningBaskets(): List[SigningBasketTrait] + + def getSigningBasketByBasketId(entityId: String): Box[SigningBasketTrait] + + def createSigningBasket(basketId: Option[String], + status: Option[String], + description: Option[String], + ): Box[SigningBasketTrait] + + def deleteSigningBasket(id: String): Box[Boolean] + +} \ No newline at end of file diff --git a/obp-api/src/main/scala/code/transactionChallenge/ChallengeProvider.scala b/obp-api/src/main/scala/code/transactionChallenge/ChallengeProvider.scala index 84437e5e5..5c8ea19d8 100644 --- a/obp-api/src/main/scala/code/transactionChallenge/ChallengeProvider.scala +++ b/obp-api/src/main/scala/code/transactionChallenge/ChallengeProvider.scala @@ -10,13 +10,14 @@ import net.liftweb.common.Box trait ChallengeProvider { def saveChallenge( challengeId: String, - transactionRequestId: String, + transactionRequestId: String, // Note: basketId, consentId and transactionRequestId are exclusive here. salt: String, expectedAnswer: String, expectedUserId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: basketId, consentId and transactionRequestId are exclusive here. + basketId: Option[String], // Note: basketId, consentId and transactionRequestId are exclusive here. authenticationMethodId: Option[String], challengeType: String, ): Box[ChallengeTrait] @@ -26,7 +27,8 @@ trait ChallengeProvider { def getChallengesByTransactionRequestId(transactionRequestId: String): Box[List[ChallengeTrait]] def getChallengesByConsentId(consentId: String): Box[List[ChallengeTrait]] - + def getChallengesByBasketId(basketId: String): Box[List[ChallengeTrait]] + /** * There is another method: Connector.validateChallengeAnswer, it validate the challenge over Kafka. * This method, will validate the answer in OBP side. @@ -45,7 +47,8 @@ class RemotedataChallengeProviderCaseClasses { expectedUserId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. authenticationMethodId: Option[String], challengeType: String, ) diff --git a/obp-api/src/main/scala/code/transactionChallenge/MappedChallengeProvider.scala b/obp-api/src/main/scala/code/transactionChallenge/MappedChallengeProvider.scala index 0006d6f5e..3961c3cf3 100644 --- a/obp-api/src/main/scala/code/transactionChallenge/MappedChallengeProvider.scala +++ b/obp-api/src/main/scala/code/transactionChallenge/MappedChallengeProvider.scala @@ -19,40 +19,44 @@ object MappedChallengeProvider extends ChallengeProvider { override def saveChallenge( challengeId: String, - transactionRequestId: String, + transactionRequestId: String, // Note: consentId and transactionRequestId and basketId are exclusive here. salt: String, expectedAnswer: String, expectedUserId: String, scaMethod: Option[SCA], scaStatus: Option[SCAStatus], - consentId: Option[String], // Note: consentId and transactionRequestId are exclusive here. + consentId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. + basketId: Option[String], // Note: consentId and transactionRequestId and basketId are exclusive here. authenticationMethodId: Option[String], challengeType: String, ): Box[ChallengeTrait] = tryo ( MappedExpectedChallengeAnswer .create - .mChallengeId(challengeId) - .mChallengeType(challengeType) - .mTransactionRequestId(transactionRequestId) - .mSalt(salt) - .mExpectedAnswer(expectedAnswer) - .mExpectedUserId(expectedUserId) - .mScaMethod(scaMethod.map(_.toString).getOrElse("")) - .mScaStatus(scaStatus.map(_.toString).getOrElse("")) - .mConsentId(consentId.getOrElse("")) - .mAuthenticationMethodId(expectedUserId) + .ChallengeId(challengeId) + .ChallengeType(challengeType) + .TransactionRequestId(transactionRequestId) + .Salt(salt) + .ExpectedAnswer(expectedAnswer) + .ExpectedUserId(expectedUserId) + .ScaMethod(scaMethod.map(_.toString).getOrElse("")) + .ScaStatus(scaStatus.map(_.toString).getOrElse("")) + .ConsentId(consentId.getOrElse("")) + .BasketId(basketId.getOrElse("")) + .AuthenticationMethodId(expectedUserId) .saveMe() ) override def getChallenge(challengeId: String): Box[MappedExpectedChallengeAnswer] = - MappedExpectedChallengeAnswer.find(By(MappedExpectedChallengeAnswer.mChallengeId,challengeId)) + MappedExpectedChallengeAnswer.find(By(MappedExpectedChallengeAnswer.ChallengeId,challengeId)) override def getChallengesByTransactionRequestId(transactionRequestId: String): Box[List[ChallengeTrait]] = - Full(MappedExpectedChallengeAnswer.findAll(By(MappedExpectedChallengeAnswer.mTransactionRequestId,transactionRequestId))) + Full(MappedExpectedChallengeAnswer.findAll(By(MappedExpectedChallengeAnswer.TransactionRequestId,transactionRequestId))) override def getChallengesByConsentId(consentId: String): Box[List[ChallengeTrait]] = - Full(MappedExpectedChallengeAnswer.findAll(By(MappedExpectedChallengeAnswer.mConsentId,consentId))) + Full(MappedExpectedChallengeAnswer.findAll(By(MappedExpectedChallengeAnswer.ConsentId,consentId))) + override def getChallengesByBasketId(id: String): Box[List[ChallengeTrait]] = + Full(MappedExpectedChallengeAnswer.findAll(By(MappedExpectedChallengeAnswer.BasketId,id))) override def validateChallenge( challengeId: String, @@ -63,7 +67,7 @@ object MappedChallengeProvider extends ChallengeProvider { challenge <- getChallenge(challengeId) ?~! s"${ErrorMessages.InvalidTransactionRequestChallengeId}" currentAttemptCounterValue = challenge.attemptCounter //We update the counter anyway. - _ = challenge.mAttemptCounter(currentAttemptCounterValue+1).saveMe() + _ = challenge.AttemptCounter(currentAttemptCounterValue+1).saveMe() createDateTime = challenge.createdAt.get challengeTTL : Long = Helpers.seconds(APIUtil.transactionRequestChallengeTtl) @@ -76,7 +80,7 @@ object MappedChallengeProvider extends ChallengeProvider { userId match { case None => if(currentHashedAnswer==expectedHashedAnswer) { - tryo{challenge.mSuccessful(true).mScaStatus(StrongCustomerAuthenticationStatus.finalised.toString).saveMe()} + tryo{challenge.Successful(true).ScaStatus(StrongCustomerAuthenticationStatus.finalised.toString).saveMe()} } else { Failure(s"${ s"${ @@ -87,7 +91,7 @@ object MappedChallengeProvider extends ChallengeProvider { } case Some(id) => if(currentHashedAnswer==expectedHashedAnswer && id==challenge.expectedUserId) { - tryo{challenge.mSuccessful(true).mScaStatus(StrongCustomerAuthenticationStatus.finalised.toString).saveMe()} + tryo{challenge.Successful(true).ScaStatus(StrongCustomerAuthenticationStatus.finalised.toString).saveMe()} } else { Failure(s"${ s"${ diff --git a/obp-api/src/main/scala/code/transactionChallenge/MappedExpectedChallengeAnswer.scala b/obp-api/src/main/scala/code/transactionChallenge/MappedExpectedChallengeAnswer.scala index 3fd568343..38bbf97db 100644 --- a/obp-api/src/main/scala/code/transactionChallenge/MappedExpectedChallengeAnswer.scala +++ b/obp-api/src/main/scala/code/transactionChallenge/MappedExpectedChallengeAnswer.scala @@ -2,9 +2,9 @@ package code.transactionChallenge import code.util.MappedUUID import com.openbankproject.commons.model.ChallengeTrait -import com.openbankproject.commons.model.enums.{StrongCustomerAuthentication, StrongCustomerAuthenticationStatus} import com.openbankproject.commons.model.enums.StrongCustomerAuthentication.SCA import com.openbankproject.commons.model.enums.StrongCustomerAuthenticationStatus.SCAStatus +import com.openbankproject.commons.model.enums.{StrongCustomerAuthentication, StrongCustomerAuthenticationStatus} import net.liftweb.mapper._ class MappedExpectedChallengeAnswer extends ChallengeTrait with LongKeyedMapper[MappedExpectedChallengeAnswer] with IdPK with CreatedUpdated { @@ -12,36 +12,39 @@ class MappedExpectedChallengeAnswer extends ChallengeTrait with LongKeyedMapper[ def getSingleton = MappedExpectedChallengeAnswer // Unique - object mChallengeId extends MappedUUID(this) - object mChallengeType extends MappedString(this, 100) - object mTransactionRequestId extends MappedUUID(this) - object mExpectedAnswer extends MappedString(this,50) - object mExpectedUserId extends MappedUUID(this) - object mSalt extends MappedString(this, 50) - object mSuccessful extends MappedBoolean(this) - - object mScaMethod extends MappedString(this,100) - object mScaStatus extends MappedString(this,100) - object mConsentId extends MappedString(this,100) - object mAuthenticationMethodId extends MappedString(this,100) - object mAttemptCounter extends MappedInt(this){ + object ChallengeId extends MappedUUID(this) + object ChallengeType extends MappedString(this, 100) + object TransactionRequestId extends MappedUUID(this) + object ExpectedAnswer extends MappedString(this,50) + object ExpectedUserId extends MappedUUID(this) + object Salt extends MappedString(this, 50) + object Successful extends MappedBoolean(this) + + object ScaMethod extends MappedString(this,100) + object ScaStatus extends MappedString(this,100) + object ConsentId extends MappedString(this,100) + object BasketId extends MappedString(this,100) + object AuthenticationMethodId extends MappedString(this,100) + object AttemptCounter extends MappedInt(this){ override def defaultValue = 0 } - - override def challengeId: String = mChallengeId.get - override def challengeType: String = mChallengeType.get - override def transactionRequestId: String = mTransactionRequestId.get - override def expectedAnswer: String = mExpectedAnswer.get - override def expectedUserId: String = mExpectedUserId.get - override def salt: String = mSalt.get - override def successful: Boolean = mSuccessful.get - override def consentId: Option[String] = Option(mConsentId.get) - override def scaMethod: Option[SCA] = Option(StrongCustomerAuthentication.withName(mScaMethod.get)) - override def scaStatus: Option[SCAStatus] = Option(StrongCustomerAuthenticationStatus.withName(mScaStatus.get)) - override def authenticationMethodId: Option[String] = Option(mAuthenticationMethodId.get) - override def attemptCounter: Int = mAttemptCounter.get + + override def challengeId: String = ChallengeId.get + override def challengeType: String = ChallengeType.get + override def transactionRequestId: String = TransactionRequestId.get + override def expectedAnswer: String = ExpectedAnswer.get + override def expectedUserId: String = ExpectedUserId.get + override def salt: String = Salt.get + override def successful: Boolean = Successful.get + override def consentId: Option[String] = Option(ConsentId.get) + override def basketId: Option[String] = Option(BasketId.get) + override def scaMethod: Option[SCA] = Option(StrongCustomerAuthentication.withName(ScaMethod.get)) + override def scaStatus: Option[SCAStatus] = Option(StrongCustomerAuthenticationStatus.withName(ScaStatus.get)) + override def authenticationMethodId: Option[String] = Option(AuthenticationMethodId.get) + override def attemptCounter: Int = AttemptCounter.get } object MappedExpectedChallengeAnswer extends MappedExpectedChallengeAnswer with LongKeyedMetaMapper[MappedExpectedChallengeAnswer] { - override def dbIndexes = UniqueIndex(mChallengeId):: super.dbIndexes + override def dbTableName = "ExpectedChallengeAnswer" // define the DB table name + override def dbIndexes = UniqueIndex(ChallengeId):: super.dbIndexes } \ No newline at end of file diff --git a/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data b/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data index 5a1f839fd6b5a443eee23752d2b4ab336d09de37..eff03ed3a829ad14ab2c5cc2ef3f1275f049ca18 100644 GIT binary patch delta 6134 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 delta 6244 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 Ks&#x_8TM~pJBxV$ diff --git a/obp-api/src/test/scala/code/util/MappedClassNameTest.scala b/obp-api/src/test/scala/code/util/MappedClassNameTest.scala index 06dc3040f..347bc6ec0 100644 --- a/obp-api/src/test/scala/code/util/MappedClassNameTest.scala +++ b/obp-api/src/test/scala/code/util/MappedClassNameTest.scala @@ -116,6 +116,9 @@ class MappedClassNameTest extends FeatureSpec { "code.UserRefreshes.MappedUserRefreshes", "code.DynamicEndpoint.DynamicEndpoint", "code.regulatedentities.MappedRegulatedEntity", + "code.signingbaskets.MappedSigningBasketConsent", + "code.signingbaskets.MappedSigningBasket", + "code.signingbaskets.MappedSigningBasketPayment", "code.CustomerDependants.MappedCustomerDependant") val newMappedTypes = ClassScanUtils.findTypes{ info => diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala b/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala index deaf224f0..b17aae855 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/dto/JsonsTransfer.scala @@ -1334,8 +1334,19 @@ case class OutBoundCreateChallengesC2( scaStatus: Option[SCAStatus], consentId: Option[String], authenticationMethodId: Option[String]) extends TopicTrait +case class OutBoundCreateChallengesC3( + outboundAdapterCallContext: OutboundAdapterCallContext, + userIds: List[String], + challengeType: ChallengeType.Value, + transactionRequestId: Option[String], + scaMethod: Option[SCA], + scaStatus: Option[SCAStatus], + consentId: Option[String], + basketId: Option[String], + authenticationMethodId: Option[String]) extends TopicTrait case class InBoundCreateChallengesC2(inboundAdapterCallContext: InboundAdapterCallContext, status: Status, data: List[ChallengeCommons]) extends InBoundTrait[List[ChallengeCommons]] +case class InBoundCreateChallengesC3(inboundAdapterCallContext: InboundAdapterCallContext, status: Status, data: List[ChallengeCommons]) extends InBoundTrait[List[ChallengeCommons]] case class OutBoundValidateChallengeAnswerC2( outboundAdapterCallContext: OutboundAdapterCallContext, diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModel.scala b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModel.scala index 31844b7af..3b869c13b 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModel.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModel.scala @@ -532,6 +532,7 @@ case class ChallengeCommons( override val challengeType: String, override val consentId: Option[String], + override val basketId: Option[String] = None, override val scaMethod: Option[SCA], override val scaStatus: Option[SCAStatus], override val authenticationMethodId: Option[String] , diff --git a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala index 7707a607b..e59b311a8 100644 --- a/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala +++ b/obp-commons/src/main/scala/com/openbankproject/commons/model/CommonModelTrait.scala @@ -96,6 +96,19 @@ trait AccountApplication { def status: String } +trait SigningBasketTrait { + def basketId: String + def status: String + def description: String +} +trait SigningBasketPaymentTrait { + def basketId: String + def paymentId: String +} +trait SigningBasketConsentTrait { + def basketId: String + def consentId: String +} trait RegulatedEntityTrait { def entityId: String @@ -590,6 +603,7 @@ trait ChallengeTrait { //NOTE: following are from BerlinGroup, we try to share the same challenges for different standard. //for OBP standard, all the following can be Optional: def consentId: Option[String] // Note: consentId and transactionRequestId are exclusive here. + def basketId: Option[String] // Note: consentId and transactionRequestId are exclusive here. def scaMethod: Option[SCA] def scaStatus: Option[SCAStatus] def authenticationMethodId: Option[String] diff --git a/release_notes.md b/release_notes.md index 489530bf2..7114e7b7f 100644 --- a/release_notes.md +++ b/release_notes.md @@ -3,6 +3,7 @@ ### Most recent changes at top of file ``` Date Commit Action +12/01/2024 Renamed table MappedExpectedChallengeAnswer => ExpectedChallengeAnswer and removed prefix 'm' from fields. 16/11/2023 2b8811dc Added show_used_connector_methods, default is false. 30/10/2023 4e82c66c Added createLocalisedResourceDocJson.cache.ttl.seconds, default is 3600 13/10/2023 d87c99d8 Added props hikari.connectionTimeout, default is from hikari.