Merge pull request #1935 from constantine2nd/develop

Add is_active (boolean) to Product Attribute
This commit is contained in:
Simon Redfern 2021-08-24 16:02:54 +02:00 committed by GitHub
commit 50da2398c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 87 additions and 40 deletions

View File

@ -3452,6 +3452,12 @@ object SwaggerDefinitionsJSON {
name = "OVERDRAFT_START_DATE",
`type` = "DATE_WITH_DAY",
value = "2012-04-23"
)
val productAttributeJsonV400 = ProductAttributeJsonV400(
name = "OVERDRAFT_START_DATE",
`type` = "DATE_WITH_DAY",
value = "2012-04-23",
is_active = Some(true)
)
val productAttributeResponseJson = ProductAttributeResponseWithoutBankIdJson(
product_code = "saving1",
@ -3460,6 +3466,14 @@ object SwaggerDefinitionsJSON {
`type` = "DATE_WITH_DAY",
value = "2012-04-23"
)
val productAttributeResponseJsonV400 = ProductAttributeResponseWithoutBankIdJsonV400(
product_code = "saving1",
product_attribute_id = "613c83ea-80f9-4560-8404-b9cd4ec42a7f",
name = "OVERDRAFT_START_DATE",
`type` = "DATE_WITH_DAY",
value = "2012-04-23",
is_active = Some(true)
)
val accountAttributeJson = AccountAttributeJson(
name = "OVERDRAFT_START_DATE",

View File

@ -1322,6 +1322,7 @@ object NewStyle {
name: String,
attributType: ProductAttributeType.Value,
value: String,
isActive: Option[Boolean],
callContext: Option[CallContext]
): OBPReturnType[ProductAttribute] = {
Connector.connector.vend.createOrUpdateProductAttribute(
@ -1331,6 +1332,7 @@ object NewStyle {
name: String,
attributType: ProductAttributeType.Value,
value: String,
isActive: Option[Boolean],
callContext: Option[CallContext]
) map {
i => (connectorEmptyResponse(i._1, callContext), i._2)

View File

@ -2058,6 +2058,7 @@ trait APIMethods310 {
postedData.name,
productAttributeType,
postedData.value,
None,
callContext: Option[CallContext]
)
} yield {
@ -2154,6 +2155,7 @@ trait APIMethods310 {
postedData.name,
productAttributeType,
postedData.value,
None,
callContext: Option[CallContext]
)
} yield {

View File

@ -5487,8 +5487,8 @@ trait APIMethods400 {
|${authenticationRequiredMessage(true)}
|
|""",
productAttributeJson,
productAttributeResponseJson,
productAttributeJsonV400,
productAttributeResponseJsonV400,
List(
InvalidJsonFormat,
UnknownError
@ -5506,14 +5506,16 @@ trait APIMethods400 {
(_, callContext) <- NewStyle.function.getBank(BankId(bankId), callContext)
failMsg = s"$InvalidJsonFormat The Json body should be the $ProductAttributeJson "
postedData <- NewStyle.function.tryons(failMsg, 400, callContext) {
json.extract[ProductAttributeJson]
json.extract[ProductAttributeJsonV400]
}
failMsg = s"$InvalidJsonFormat The `Type` field can only accept the following field: " +
s"${ProductAttributeType.DOUBLE}(12.1234), ${ProductAttributeType.STRING}(TAX_NUMBER), ${ProductAttributeType.INTEGER}(123) and ${ProductAttributeType.DATE_WITH_DAY}(2012-04-23)"
productAttributeType <- NewStyle.function.tryons(failMsg, 400, callContext) {
ProductAttributeType.withName(postedData.`type`)
}
_ <- Future(Connector.connector.vend.getProduct(BankId(bankId), ProductCode(productCode))) map {
getFullBoxOrFail(_, callContext, ProductNotFoundByProductCode + " {" + productCode + "}", 400)
}
(productAttribute, callContext) <- NewStyle.function.createOrUpdateProductAttribute(
BankId(bankId),
ProductCode(productCode),
@ -5521,6 +5523,7 @@ trait APIMethods400 {
postedData.name,
productAttributeType,
postedData.value,
postedData.is_active,
callContext: Option[CallContext]
)
} yield {
@ -5546,8 +5549,8 @@ trait APIMethods400 {
|${authenticationRequiredMessage(true)}
|
|""",
productAttributeJson,
productAttributeResponseJson,
productAttributeJsonV400,
productAttributeResponseJsonV400,
List(
UserHasMissingRoles,
UnknownError
@ -5563,7 +5566,7 @@ trait APIMethods400 {
(_, callContext) <- NewStyle.function.getBank(BankId(bankId), callContext)
failMsg = s"$InvalidJsonFormat The Json body should be the $ProductAttributeJson "
postedData <- NewStyle.function.tryons(failMsg, 400, callContext) {
json.extract[ProductAttributeJson]
json.extract[ProductAttributeJsonV400]
}
failMsg = s"$InvalidJsonFormat The `Type` field can only accept the following field: " +
s"${ProductAttributeType.DOUBLE}(12.1234), ${ProductAttributeType.STRING}(TAX_NUMBER), ${ProductAttributeType.INTEGER}(123) and ${ProductAttributeType.DATE_WITH_DAY}(2012-04-23)"
@ -5578,6 +5581,7 @@ trait APIMethods400 {
postedData.name,
productAttributeType,
postedData.value,
postedData.is_active,
callContext: Option[CallContext]
)
} yield {
@ -5603,7 +5607,7 @@ trait APIMethods400 {
|
|""",
emptyObjectJson,
productAttributeResponseJson,
productAttributeResponseJsonV400,
List(
UserHasMissingRoles,
UnknownError

View File

@ -649,8 +649,13 @@ case class JsonSchemaV400(
case class JsonValidationV400(operation_id: String, json_schema: JsonSchemaV400)
// Validation related END
case class ProductAttributeResponseJson(
case class ProductAttributeJsonV400(
name: String,
`type`: String,
value: String,
is_active: Option[Boolean]
)
case class ProductAttributeResponseJsonV400(
bank_id: String,
product_code: String,
product_attribute_id: String,
@ -659,6 +664,14 @@ case class ProductAttributeResponseJson(
value: String,
is_active: Option[Boolean]
)
case class ProductAttributeResponseWithoutBankIdJsonV400(
product_code: String,
product_attribute_id: String,
name: String,
`type`: String,
value: String,
is_active: Option[Boolean]
)
case class IbanCheckerJsonV400(
is_valid: Boolean,
@ -1369,8 +1382,8 @@ object JSONFactory400 {
}
def createProductAttributeJson(productAttribute: ProductAttribute): ProductAttributeResponseJson =
ProductAttributeResponseJson(
def createProductAttributeJson(productAttribute: ProductAttribute): ProductAttributeResponseJsonV400 =
ProductAttributeResponseJsonV400(
bank_id = productAttribute.bankId.value,
product_code = productAttribute.productCode.value,
product_attribute_id = productAttribute.productAttributeId,

View File

@ -1989,6 +1989,7 @@ trait Connector extends MdcLoggable {
name: String,
productAttributeType: ProductAttributeType.Value,
value: String,
isActive: Option[Boolean],
callContext: Option[CallContext]
): OBPReturnType[Box[ProductAttribute]] = Future{(Failure(setUnimplementedError), callContext)}

View File

@ -3402,6 +3402,7 @@ object LocalMappedConnector extends Connector with MdcLoggable {
name: String,
attributType: ProductAttributeType.Value,
value: String,
isActive: Option[Boolean],
callContext: Option[CallContext]
): OBPReturnType[Box[ProductAttribute]] =
ProductAttributeX.productAttributeProvider.vend.createOrUpdateProductAttribute(
@ -3410,7 +3411,7 @@ object LocalMappedConnector extends Connector with MdcLoggable {
productAttributeId: Option[String],
name: String,
attributType: ProductAttributeType.Value,
value: String) map {
value: String, isActive: Option[Boolean]) map {
(_, callContext)
}

View File

@ -307,7 +307,7 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit {
//---------------- dynamic start -------------------please don't modify this line
// ---------- created on 2021-08-19T16:36:57Z
// ---------- created on 2021-08-24T13:21:14Z
messageDocs += validateAndCheckIbanNumberDoc
def validateAndCheckIbanNumberDoc = MessageDoc(
@ -4609,7 +4609,8 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit {
productAttributeId=Some(productAttributeIdExample.value),
name=nameExample.value,
productAttributeType=com.openbankproject.commons.model.enums.ProductAttributeType.example,
value=valueExample.value)
value=valueExample.value,
isActive=Some(isActiveExample.value.toBoolean))
),
exampleInboundMessage = (
InBoundCreateOrUpdateProductAttribute(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext,
@ -4625,9 +4626,9 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit {
adapterImplementation = Some(AdapterImplementation("- Core", 1))
)
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, isActive: Option[Boolean], callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
import com.openbankproject.commons.dto.{InBoundCreateOrUpdateProductAttribute => InBound, OutBoundCreateOrUpdateProductAttribute => OutBound}
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value)
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value, isActive)
val response: Future[Box[InBound]] = (southSideActor ? req).mapTo[InBound].recoverWith(recoverFunction).map(Box !! _)
response.map(convertToTuple[ProductAttributeCommons](callContext))
}
@ -6204,6 +6205,6 @@ object AkkaConnector_vDec2018 extends Connector with AkkaConnectorActorInit {
response.map(convertToTuple[Boolean](callContext))
}
// ---------- created on 2021-08-19T16:36:57Z
//---------------- dynamic end ---------------------please don't modify this line
// ---------- created on 2021-08-24T13:21:14Z
//---------------- dynamic end ---------------------please don't modify this line
}

View File

@ -95,7 +95,7 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable
//---------------- dynamic start -------------------please don't modify this line
// ---------- created on 2021-08-19T16:37:18Z
// ---------- created on 2021-08-24T13:22:01Z
messageDocs += getAdapterInfoDoc
def getAdapterInfoDoc = MessageDoc(
@ -4796,7 +4796,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable
productAttributeId=Some(productAttributeIdExample.value),
name=nameExample.value,
productAttributeType=com.openbankproject.commons.model.enums.ProductAttributeType.example,
value=valueExample.value)
value=valueExample.value,
isActive=Some(isActiveExample.value.toBoolean))
),
exampleInboundMessage = (
InBoundCreateOrUpdateProductAttribute(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext,
@ -4812,9 +4813,9 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable
adapterImplementation = Some(AdapterImplementation("- Core", 1))
)
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, isActive: Option[Boolean], callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
import com.openbankproject.commons.dto.{InBoundCreateOrUpdateProductAttribute => InBound, OutBoundCreateOrUpdateProductAttribute => OutBound}
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value)
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value, isActive)
val response: Future[Box[InBound]] = sendRequest[InBound](getUrl(callContext, "createOrUpdateProductAttribute"), HttpMethods.POST, req, callContext)
response.map(convertToTuple[ProductAttributeCommons](callContext))
}
@ -6391,8 +6392,8 @@ trait RestConnector_vMar2019 extends Connector with KafkaHelper with MdcLoggable
response.map(convertToTuple[Boolean](callContext))
}
// ---------- created on 2021-08-19T16:37:18Z
//---------------- dynamic end ---------------------please don't modify this line
// ---------- created on 2021-08-24T13:22:01Z
//---------------- dynamic end ---------------------please don't modify this line
private val availableOperation = DynamicEntityOperation.values.map(it => s""""$it"""").mkString("[", ", ", "]")

View File

@ -76,7 +76,7 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable {
val connectorName = "stored_procedure_vDec2019"
//---------------- dynamic start -------------------please don't modify this line
// ---------- created on 2021-08-19T16:41:22Z
// ---------- created on 2021-08-24T13:22:36Z
messageDocs += getAdapterInfoDoc
def getAdapterInfoDoc = MessageDoc(
@ -4777,7 +4777,8 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable {
productAttributeId=Some(productAttributeIdExample.value),
name=nameExample.value,
productAttributeType=com.openbankproject.commons.model.enums.ProductAttributeType.example,
value=valueExample.value)
value=valueExample.value,
isActive=Some(isActiveExample.value.toBoolean))
),
exampleInboundMessage = (
InBoundCreateOrUpdateProductAttribute(inboundAdapterCallContext=MessageDocsSwaggerDefinitions.inboundAdapterCallContext,
@ -4793,9 +4794,9 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable {
adapterImplementation = Some(AdapterImplementation("- Core", 1))
)
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, productAttributeType: ProductAttributeType.Value, value: String, isActive: Option[Boolean], callContext: Option[CallContext]): OBPReturnType[Box[ProductAttribute]] = {
import com.openbankproject.commons.dto.{InBoundCreateOrUpdateProductAttribute => InBound, OutBoundCreateOrUpdateProductAttribute => OutBound}
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value)
val req = OutBound(callContext.map(_.toOutboundAdapterCallContext).orNull, bankId, productCode, productAttributeId, name, productAttributeType, value, isActive)
val response: Future[Box[InBound]] = sendRequest[InBound]("obp_create_or_update_product_attribute", req, callContext)
response.map(convertToTuple[ProductAttributeCommons](callContext))
}
@ -6372,8 +6373,8 @@ trait StoredProcedureConnector_vDec2019 extends Connector with MdcLoggable {
response.map(convertToTuple[Boolean](callContext))
}
// ---------- created on 2021-08-19T16:41:22Z
//---------------- dynamic end ---------------------please don't modify this line
// ---------- created on 2021-08-24T13:22:36Z
//---------------- dynamic end ---------------------please don't modify this line
private val availableOperation = DynamicEntityOperation.values.map(it => s""""$it"""").mkString("[", ", ", "]")

View File

@ -8,7 +8,6 @@ import com.openbankproject.commons.model.{BankId, ProductAttribute, ProductCode}
import net.liftweb.common.{Box, Empty, Full}
import net.liftweb.mapper.{BaseMappedField, MappedBoolean, _}
import net.liftweb.util.Helpers.tryo
import com.openbankproject.commons.ExecutionContext.Implicits.global
import scala.concurrent.Future
@ -32,7 +31,8 @@ object MappedProductAttributeProvider extends ProductAttributeProvider {
productAttributeId: Option[String],
name: String,
attributType: ProductAttributeType.Value,
value: String): Future[Box[ProductAttribute]] = {
value: String,
isActive: Option[Boolean]): Future[Box[ProductAttribute]] = {
productAttributeId match {
case Some(id) => Future {
MappedProductAttribute.find(By(MappedProductAttribute.mProductAttributeId, id)) match {
@ -42,6 +42,7 @@ object MappedProductAttributeProvider extends ProductAttributeProvider {
.mName(name)
.mType(attributType.toString)
.mValue(value)
.IsActive(isActive.getOrElse(true))
.saveMe()
}
case _ => Empty
@ -55,6 +56,7 @@ object MappedProductAttributeProvider extends ProductAttributeProvider {
.mName(name)
.mType(attributType.toString())
.mValue(value)
.IsActive(isActive.getOrElse(true))
.saveMe()
}
}

View File

@ -47,7 +47,8 @@ trait ProductAttributeProvider {
productAttributeId: Option[String],
name: String,
attributType: ProductAttributeType.Value,
value: String): Future[Box[ProductAttribute]]
value: String,
isActive: Option[Boolean]): Future[Box[ProductAttribute]]
def deleteProductAttribute(productAttributeId: String): Future[Box[Boolean]]
// End of Trait
}
@ -62,7 +63,8 @@ class RemotedataProductAttributeCaseClasses {
productAttributeId: Option[String],
name: String,
attributType: ProductAttributeType.Value,
value: String)
value: String,
isActive: Option[Boolean])
case class deleteProductAttribute(productAttributeId: String)
}

View File

@ -19,7 +19,7 @@ object RemotedataProductAttribute extends ObpActorInit with ProductAttributeProv
override def getProductAttributeById(productAttributeId: String): Future[Box[ProductAttribute]] = (actor ? cc.getProductAttributeById(productAttributeId)).mapTo[Box[ProductAttribute]]
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, attributType: ProductAttributeType.Value, value: String): Future[Box[ProductAttribute]] = (actor ? cc.createOrUpdateProductAttribute(bankId, productCode, productAttributeId , name , attributType , value )).mapTo[Box[ProductAttribute]]
override def createOrUpdateProductAttribute(bankId: BankId, productCode: ProductCode, productAttributeId: Option[String], name: String, attributType: ProductAttributeType.Value, value: String, isActive: Option[Boolean]): Future[Box[ProductAttribute]] = (actor ? cc.createOrUpdateProductAttribute(bankId, productCode, productAttributeId , name , attributType , value, isActive)).mapTo[Box[ProductAttribute]]
override def deleteProductAttribute(productAttributeId: String): Future[Box[Boolean]] = (actor ? cc.deleteProductAttribute(productAttributeId)).mapTo[Box[Boolean]]
}

View File

@ -31,14 +31,16 @@ class RemotedataProductAttributeActor extends Actor with ObpActorHelper with Mdc
productAttributeId: Option[String],
name: String,
attributType: ProductAttributeType.Value,
value: String) =>
logger.debug(s"createOrUpdateProductAttribute(${bankId}, ${productCode}, ${productAttributeId}, ${name}, ${attributType}, ${value})")
value: String,
isActive: Option[Boolean]) =>
logger.debug(s"createOrUpdateProductAttribute(${bankId}, ${productCode}, ${productAttributeId}, ${name}, ${attributType}, ${value}, ${isActive})")
mapper.createOrUpdateProductAttribute(bankId,
productCode,
productAttributeId,
name,
attributType,
value) pipeTo sender
value,
isActive) pipeTo sender
case cc.deleteProductAttribute(productAttributeId: String) =>
logger.debug(s"deleteProductAttribute(${productAttributeId})")

View File

@ -378,7 +378,8 @@ case class OutBoundCreateOrUpdateProductAttribute(outboundAdapterCallContext: Ou
productAttributeId: Option[String],
name: String,
productAttributeType: enums.ProductAttributeType.Value,
value: String) extends TopicTrait
value: String,
isActive: Option[Boolean]) extends TopicTrait
case class InBoundCreateOrUpdateProductAttribute(inboundAdapterCallContext: InboundAdapterCallContext, status: Status, data: ProductAttributeCommons) extends InBoundTrait[ProductAttributeCommons]