feature/add regulated entity attribute management functionality

This commit is contained in:
hongwei 2025-04-07 11:20:54 +02:00
parent 52090a2532
commit c056777b0d
6 changed files with 180 additions and 2 deletions

View File

@ -133,10 +133,10 @@ import code.views.Views
import code.views.system.{AccountAccess, ViewDefinition, ViewPermission}
import code.webhook.{BankAccountNotificationWebhook, MappedAccountWebhook, SystemAccountNotificationWebhook}
import code.webuiprops.WebUiProps
import code.regulatedentities.attribute.RegulatedEntityAttribute
import com.openbankproject.commons.model.ErrorMessage
import com.openbankproject.commons.util.Functions.Implicits._
import com.openbankproject.commons.util.{ApiVersion, Functions}
import javax.mail.internet.MimeMessage
import net.liftweb.common._
import net.liftweb.db.{DB, DBLogEntry}
@ -1124,7 +1124,8 @@ object ToSchemify {
MappedCustomerDependant,
AttributeDefinition,
CustomerAccountLink,
TransactionIdMapping
TransactionIdMapping,
RegulatedEntityAttribute,
)
// start grpc server

View File

@ -0,0 +1,104 @@
package code.regulatedentities.attribute
import code.util.{MappedUUID, UUIDString}
import com.openbankproject.commons.ExecutionContext.Implicits.global
import com.openbankproject.commons.model.enums.RegulatedEntityAttributeType
import com.openbankproject.commons.model.{RegulatedEntityAttributeTrait, RegulatedEntityId}
import net.liftweb.common.{Box, Empty, Full}
import net.liftweb.mapper.{MappedBoolean, _}
import net.liftweb.util.Helpers.tryo
import scala.concurrent.Future
object RegulatedEntityAttributeProvider extends RegulatedEntityAttributeProviderTrait {
override def getRegulatedEntityAttributesFromProvider(regulatedEntityId: RegulatedEntityId): Future[Box[List[RegulatedEntityAttribute]]] =
Future {
Box !! RegulatedEntityAttribute.findAll(
By(RegulatedEntityAttribute.RegulatedEntityId_, regulatedEntityId.value)
)
}
override def getRegulatedEntityAttributeById(RegulatedEntityAttributeId: String): Future[Box[RegulatedEntityAttribute]] = Future {
RegulatedEntityAttribute.find(By(RegulatedEntityAttribute.RegulatedEntityAttributeId, RegulatedEntityAttributeId))
}
override def createOrUpdateRegulatedEntityAttribute(
regulatedEntityId: RegulatedEntityId,
RegulatedEntityAttributeId: Option[String],
name: String,
attributeType: RegulatedEntityAttributeType.Value,
value: String,
isActive: Option[Boolean]
): Future[Box[RegulatedEntityAttribute]] = {
RegulatedEntityAttributeId match {
case Some(id) => Future {
RegulatedEntityAttribute.find(By(RegulatedEntityAttribute.RegulatedEntityAttributeId, id)) match {
case Full(attribute) => tryo {
attribute
.RegulatedEntityId_(regulatedEntityId.value)
.Name(name)
.Type(attributeType.toString)
.`Value`(value)
.IsActive(isActive.getOrElse(true))
.saveMe()
}
case _ => Empty
}
}
case None => Future {
Full {
RegulatedEntityAttribute.create
.RegulatedEntityId_(regulatedEntityId.value)
.Name(name)
.Type(attributeType.toString())
.`Value`(value)
.IsActive(isActive.getOrElse(true))
.saveMe()
}
}
}
}
override def deleteRegulatedEntityAttribute(RegulatedEntityAttributeId: String): Future[Box[Boolean]] = Future {
tryo (
RegulatedEntityAttribute.bulkDelete_!!(By(RegulatedEntityAttribute.RegulatedEntityAttributeId, RegulatedEntityAttributeId))
)
}
override def deleteRegulatedEntityAttributesByRegulatedEntityId(regulatedEntityId: RegulatedEntityId): Future[Box[Boolean]]= Future {
tryo(
RegulatedEntityAttribute.bulkDelete_!!(By(RegulatedEntityAttribute.RegulatedEntityId_, regulatedEntityId.value))
)
}
}
class RegulatedEntityAttribute extends RegulatedEntityAttributeTrait with LongKeyedMapper[RegulatedEntityAttribute] with IdPK {
override def getSingleton = RegulatedEntityAttribute
object RegulatedEntityId_ extends UUIDString(this) {
override def dbColumnName = "RegulatedEntityId"
}
object RegulatedEntityAttributeId extends MappedUUID(this)
object Name extends MappedString(this, 50)
object Type extends MappedString(this, 50)
object `Value` extends MappedString(this, 255)
object IsActive extends MappedBoolean(this) {
override def defaultValue = true
}
override def regulatedEntityId: RegulatedEntityId = RegulatedEntityId(RegulatedEntityId_.get)
override def regulatedEntityAttributeId: String = RegulatedEntityAttributeId.get
override def name: String = Name.get
override def attributeType: RegulatedEntityAttributeType.Value = RegulatedEntityAttributeType.withName(Type.get)
override def value: String = `Value`.get
override def isActive: Option[Boolean] = if (IsActive.jdbcFriendly(IsActive.calcFieldName) == null) { None } else Some(IsActive.get)
}
object RegulatedEntityAttribute extends RegulatedEntityAttribute with LongKeyedMetaMapper[RegulatedEntityAttribute] {
override def dbIndexes: List[BaseIndex[RegulatedEntityAttribute]] = Index(RegulatedEntityId_) :: super.dbIndexes
}

View File

@ -0,0 +1,50 @@
package code.regulatedentities.attribute
/* For ProductAttribute */
import com.openbankproject.commons.model.{RegulatedEntityId, BankId}
import com.openbankproject.commons.model.enums.RegulatedEntityAttributeType
import net.liftweb.common.{Box, Logger}
import net.liftweb.util.SimpleInjector
import scala.concurrent.Future
object RegulatedEntityAttributeX extends SimpleInjector {
val regulatedEntityAttributeProvider = new Inject(buildOne _) {}
def buildOne: RegulatedEntityAttributeProviderTrait = RegulatedEntityAttributeProvider
// Helper to get the count out of an option
def countOfRegulatedEntityAttribute(listOpt: Option[List[RegulatedEntityAttribute]]): Int = {
val count = listOpt match {
case Some(list) => list.size
case None => 0
}
count
}
}
trait RegulatedEntityAttributeProviderTrait {
private val logger = Logger(classOf[RegulatedEntityAttributeProviderTrait])
def getRegulatedEntityAttributesFromProvider(regulatedEntityId: RegulatedEntityId): Future[Box[List[RegulatedEntityAttribute]]]
def getRegulatedEntityAttributeById(regulatedEntityAttributeId: String): Future[Box[RegulatedEntityAttribute]]
def createOrUpdateRegulatedEntityAttribute(
regulatedEntityId: RegulatedEntityId,
regulatedEntityAttributeId: Option[String],
name: String,
attributeType: RegulatedEntityAttributeType.Value,
value: String,
isActive: Option[Boolean]): Future[Box[RegulatedEntityAttribute]]
def deleteRegulatedEntityAttribute(regulatedEntityAttributeId: String): Future[Box[Boolean]]
def deleteRegulatedEntityAttributesByRegulatedEntityId(regulatedEntityId: RegulatedEntityId): Future[Box[Boolean]]
// End of Trait
}

View File

@ -128,6 +128,13 @@ case class TransactionTypeId(val value : String) {
object TransactionTypeId {
def unapply(id : String) = Some(TransactionTypeId(id))
}
case class RegulatedEntityId(val value : String) {
override def toString = value
}
object RegulatedEntityId {
def unapply(id : String) = Some(RegulatedEntityId(id))
}
case class AccountId(val value : String) {
override def toString = value

View File

@ -532,6 +532,15 @@ trait AtmAttributeTrait {
def isActive: Option[Boolean]
}
trait RegulatedEntityAttributeTrait {
def regulatedEntityId: RegulatedEntityId
def regulatedEntityAttributeId: String
def attributeType: RegulatedEntityAttributeType.Value
def name: String
def value: String
def isActive: Option[Boolean]
}
trait BankAttributeTrait {
def bankId: BankId
def bankAttributeId: String

View File

@ -22,6 +22,13 @@ object AtmAttributeType extends OBPEnumeration[AtmAttributeType]{
object DOUBLE extends Value
object DATE_WITH_DAY extends Value
}
sealed trait RegulatedEntityAttributeType extends EnumValue
object RegulatedEntityAttributeType extends OBPEnumeration[RegulatedEntityAttributeType]{
object STRING extends Value
object INTEGER extends Value
object DOUBLE extends Value
object DATE_WITH_DAY extends Value
}
sealed trait BankAttributeType extends EnumValue
object BankAttributeType extends OBPEnumeration[BankAttributeType]{
object STRING extends Value