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 5a1f839fd..eff03ed3a 100644 Binary files a/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data and b/obp-api/src/test/scala/code/connector/RestConnector_vMar2019_frozen_meta_data differ 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.