Crear Configuraciones
El siguiente es un ejemplo de cómo agregar una configuración, en este caso un DpsSampleSetting, que será gestionada por la plataforma. Necesita configurar un proyecto de dominio.
Configuración del proyecto de dominio
Para agregar una configuración que será gestionada por Dynamic Processing Settings Platform, es necesario crear lo siguiente:
-
Definición de la configuración
-
Objeto de dominio
-
Campos de búsqueda para la configuración
Definición de la configuración
Especifica cómo calcular la clave única lógica para la configuración y asocia todos los demás componentes (objeto de dominio y campos de búsqueda) al concepto de configuración
@Bean
public SettingDefinition<DpsSampleSetting> dpsSampleSettingDefinition() {
return SettingDefinition.<DpsSampleSetting>builder()
.settingType(DpsSampleSetting.SETTING_TYPE) (1)
.collectionName("setting-" + DpsSampleSetting.SETTING_TYPE) (2)
.idFunction(setting -> setting.getProcessingEntity() + "-" + setting.getPayload().getFullName()) (3)
.historyEnabled(true) (4)
.notificationsEnabled(false) (5)
.payloadClass(DpsSampleSetting.class) (6)
.payloadExample(payloadExample()) (7)
.searchableFieldsClass(DpsSampleSettingSearchableFields.class) (8)
.searchableFieldsExample(dpsSampleSettingQueryExample()) (9)
.build();
}
La definición de la configuración puede describirse mediante los siguientes atributos:
| 1 | setting type - (obligatorio) define el tipo de configuración que debe ser único en todas las configuraciones. p. ej., ibanplus |
| 2 | collection name - (obligatorio) define el nombre de la colección en la que se almacenarán las configuraciones dinámicas de este tipo de configuración |
| 3 | ID function - (obligatorio) deriva una clave única lógica para una configuración dentro de la colección |
| 4 | history enabled - (opcional) indica si se debe rastrear el historial de cambios de la configuración o no. Está habilitado por defecto. |
| 5 | notifications enabled - (opcional) indica si se envían notificaciones de Kafka cuando se crea, actualiza o elimina una configuración. Está desactivado por defecto ya que DPSv1 no tenía esta funcionalidad. |
| 6 | payload class - (obligatorio) describe el payload (estructura) de este tipo de configuración |
| 7 | payload example - (obligatorio) proporciona un ejemplo del payload |
| 8 | search fields class - (opcional) proporciona una lista de los campos buscables |
| 9 | searchable fields example - (condicionalmente obligatorio) si se proporciona la clase de campos de búsqueda, también se deben proporcionar ejemplos. |
Objeto de dominio
Este será el payload de un objeto de configuración y debe contener todos los atributos relevantes para la configuración que desea definir.
@Data
@Builder(toBuilder = true)
public class DpsSampleSetting {
public static final SettingType SETTING_TYPE = SettingType.of("sample");
@NotEmpty
private String description;
@NotBlank
private String fullName;
@NotNull
@Pattern(regexp = "[0-9A-Z]{3}")
private String statusPattern;
@Min(5)
@Max(50)
private String stringWithMinMax;
@Min(5)
private String stringWithMin;
@Max(50)
private String stringWithMax;
@Size(min = 6, max = 60)
private String stringWithSize;
@Size(min = 6)
private String stringWithSizeMin;
@Size(max = 60)
private String stringWithSizeMax;
@Min(5)
@Max(50)
private Integer numberWithMinMax;
@Min(5)
private Integer numberWithMin;
@Max(50)
private Integer numberWithMax;
@Size(min = 6, max = 60)
private Integer numberWithSize;
@Size(min = 6)
private Integer numberWithSizeMin;
@Size(max = 60)
private Integer numberWithSizeMax;
@Valid
private Limit defaultLimit;
@Valid
private List<Limit> limits;
@Valid
@Size(max = 10)
private List<@Pattern(regexp = "[0-9A-Z]{3}") String> paymentTypeAllowedList;
@Size(min = 1)
@Valid
private List<OnUsCurrency> onUsCurrencyList;
private ParticipantType participantType;
@Data
@Builder
public static class SuspenseAccount {
@Size(max = 3, min = 3)
private String currency;
}
@Data
@Builder
public static class OnUsCurrency {
@Size(max = 3, min = 3)
private String currency;
}
@Data
@Builder
public static class Limit {
String id;
LimitType limitType;
Amount amount;
}
@Data
@Builder
public static class Amount {
BigDecimal amountValue;
@Size(min = 3, max = 3)
String currency;
}
public enum LimitType {
MAX_TRANSACTION_VALUE("MaxTransactionValue"),
MIN_TRANSACTION_VALUE("MinTransactionValue");
private final String label;
LimitType(String label) {
this.label = label;
}
}
public enum ParticipantType {
DIRECT, INDIRECT
}
}
Campos buscables
Cada definición de configuración puede buscarse por campos buscables comunes y específicos de la configuración. Para ver más sobre los campos buscables comunes, vaya a Common Searchable Fields
Los campos buscables específicos de la configuración se definen mediante la implementación de SearchField y SearchableFields.
La implementación de SearchField contiene un mapeo entre la constante del campo buscable y la ruta del campo en el objeto de dominio. La ruta debe representar la posición exacta del campo en el objeto de dominio.
-
ej.
DpsSampleSetting contiene el campo defaultLimit de tipo Limit.
Limit contiene el campo amount de tipo Amount.
Amount contiene el campo amountValue de tipo BigDecimal
Por eso la constante para el campo buscable DEFAULT_LIMIT_AMOUNT_VALUE tiene el valor: defaultLimit.amount.amountValue
package com.iconsolutions.ipf.demo.setting.sample.search;
import com.iconsolutions.ipf.dynamicsettings.v2.search.SearchField;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
public enum DpsSampleSettingSearchFields implements SearchField {
DESCRIPTION("description"),
FULL_NAME("fullName"),
DEFAULT_LIMIT_ID("defaultLimit.id"),
DEFAULT_LIMIT_TYPE("defaultLimit.limitType"),
DEFAULT_LIMIT_AMOUNT_VALUE("defaultLimit.amount.amountValue"),
DEFAULT_LIMIT_AMOUNT_CURRENCY("defaultLimit.amount.currency"),
LIMIT_TYPE("limits.limitType"),
LIMIT_AMOUNT_VALUE("limits.amount.amountValue"),
LIMIT_AMOUNT_CURRENCY("limits.amount.currency"),
PARTICIPANT_TYPE("participantType"),
ON_US_CURRENCY("onUsCurrencyList.currency"),
LIMITS("limits"),
LIMIT_TYPE("limitType"),
AMOUNT("amount");
private final String name;
@Override
public String getName() {
return name;
}
}
La implementación de SearchableFields debe extender CommonSearchableFields. Esto permite que la configuración se busque también por campos buscables comunes.
SearchableFields define qué operador de consulta se utiliza para cada campo buscable mediante Criterion build. Luego Criterion se convierte a un formato de consulta específico de la base de datos.
@Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
@AllArgsConstructor
public class DpsSampleSettingSearchableFields extends CommonSearchableFields {
private String description;
private String fullName;
private String defaultLimitId;
private DpsSampleSetting.LimitType defaultLimitType;
private BigDecimal defaultLimitAmountValue;
private String defaultLimitAmountCurrency;
private DpsSampleSetting.LimitType limitType;
private BigDecimal limitAmountValue;
private String limitAmountCurrency;
private DpsSampleSetting.ParticipantType participantType;
private String onUsCurrency;
@Override
public List<Criterion> criteria() {
final List<Criterion> criteria = new ArrayList<>(super.criteria());
if (description != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.DESCRIPTION, description));
}
if (fullName != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.FULL_NAME, fullName));
}
if (defaultLimitId != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.DEFAULT_LIMIT_ID, defaultLimitId));
}
if (defaultLimitType != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.DEFAULT_LIMIT_TYPE, defaultLimitType));
}
if (defaultLimitAmountValue != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.DEFAULT_LIMIT_AMOUNT_VALUE, defaultLimitAmountValue));
}
if (defaultLimitAmountCurrency != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.DEFAULT_LIMIT_AMOUNT_CURRENCY, defaultLimitAmountCurrency));
}
if (limitType != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.LIMIT_TYPE, limitType));
}
if (limitAmountValue != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.LIMIT_AMOUNT_VALUE, limitAmountValue));
}
if (limitAmountCurrency != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.LIMIT_AMOUNT_CURRENCY, limitAmountCurrency));
}
if (participantType != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.PARTICIPANT_TYPE, participantType));
}
if (onUsCurrency != null) {
criteria.add(Criterion.equalTo(DpsSampleSettingSearchFields.ON_US_CURRENCY, onUsCurrency));
}
if (limitType != null && amount != null) {
criteria.add(Criterion.elemMatch(DpsSampleSettingSearchFields.LIMITS, List.of(
Criterion.equalTo(DpsSampleSettingSearchFields.LIMIT_TYPE, limitType),
Criterion.equalTo(DpsSampleSettingSearchFields.AMOUNT, amount)
)));
}
return criteria;
}
}