Began work on mapping to Stellar currency issuer, in preparation for
making outbound transactions. Had first go at inbound transactions.
diff --git a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/client/StellarBridgeManager.java b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/client/StellarBridgeManager.java
index 6128beb..04584c4 100644
--- a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/client/StellarBridgeManager.java
+++ b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/client/StellarBridgeManager.java
@@ -18,17 +18,19 @@
*/
package org.apache.fineract.cn.stellarbridge.api.v1.client;
+import java.util.List;
import org.apache.fineract.cn.api.util.CustomFeignClientsConfiguration;
import org.apache.fineract.cn.stellarbridge.api.v1.domain.BridgeConfiguration;
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@SuppressWarnings("unused")
@FeignClient(value="stellarbridge-v1", path="/stellarbridge/v1", configuration = CustomFeignClientsConfiguration.class)
public interface StellarBridgeManager {
-
@RequestMapping(
value = "/config",
method = RequestMethod.GET,
@@ -37,6 +39,7 @@
)
BridgeConfiguration getBridgeConfiguration();
+
@RequestMapping(
value = "/config",
method = RequestMethod.PUT,
@@ -44,4 +47,25 @@
consumes = MediaType.APPLICATION_JSON_VALUE
)
void setBridgeConfiguration(final BridgeConfiguration bridgeConfiguration);
+
+/**
+ * A currency with the same code can be available from many issuers. The stellar bridge needs to
+ * know which one to use.
+ */
+ @RequestMapping(
+ value = "/currencyissuers",
+ method = RequestMethod.GET,
+ produces = {MediaType.ALL_VALUE},
+ consumes = {MediaType.APPLICATION_JSON_VALUE}
+ )
+ List<StellarCurrencyIssuer> getAllCurrencyIssuers();
+
+ @RequestMapping(
+ value = "/currencyissuers/{currencycode}/",
+ method = RequestMethod.GET,
+ produces = {MediaType.ALL_VALUE},
+ consumes = {MediaType.APPLICATION_JSON_VALUE}
+ )
+ StellarCurrencyIssuer getCurrencyIssuerForCurrency(
+ @PathVariable("currencycode") final String currencyCode);
}
diff --git a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfiguration.java b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfiguration.java
index eb0c09a..9f65eac 100644
--- a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfiguration.java
+++ b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfiguration.java
@@ -24,38 +24,60 @@
@SuppressWarnings({"WeakerAccess", "unused"})
public class BridgeConfiguration {
@ValidIdentifier
- private String fineractIncomingAccountIdentifier;
+ private String fineractOutgoingStagingLedgerIdentifier;
@ValidIdentifier
- private String fineractOutgoingAccountIdentifier;
+ private String fineractStellarAssetsLedgerIdentifier;
+
+ @ValidIdentifier
+ private String fineractIncomingStagingLedgerIdentifier;
private String stellarAccountIdentifier;
+ private String stellarPrivateKey;
+
public BridgeConfiguration() {
super();
}
- public BridgeConfiguration(String fineractIncomingAccountIdentifier,
- String fineractOutgoingAccountIdentifier, String stellarAccountIdentifier) {
- this.fineractIncomingAccountIdentifier = fineractIncomingAccountIdentifier;
- this.fineractOutgoingAccountIdentifier = fineractOutgoingAccountIdentifier;
+ public BridgeConfiguration(
+ String fineractOutgoingStagingLedgerIdentifier,
+ String fineractStellarAssetsLedgerIdentifier,
+ String fineractIncomingStagingLedgerIdentifier,
+ String stellarAccountIdentifier,
+ String stellarPrivateKey) {
+ this.fineractOutgoingStagingLedgerIdentifier = fineractOutgoingStagingLedgerIdentifier;
+ this.fineractStellarAssetsLedgerIdentifier = fineractStellarAssetsLedgerIdentifier;
+ this.fineractIncomingStagingLedgerIdentifier = fineractIncomingStagingLedgerIdentifier;
this.stellarAccountIdentifier = stellarAccountIdentifier;
+ this.stellarPrivateKey = stellarPrivateKey;
}
- public String getFineractIncomingAccountIdentifier() {
- return fineractIncomingAccountIdentifier;
+ public String getFineractOutgoingStagingLedgerIdentifier() {
+ return fineractOutgoingStagingLedgerIdentifier;
}
- public void setFineractIncomingAccountIdentifier(String fineractIncomingAccountIdentifier) {
- this.fineractIncomingAccountIdentifier = fineractIncomingAccountIdentifier;
+ public void setFineractOutgoingStagingLedgerIdentifier(
+ String fineractOutgoingStagingLedgerIdentifier) {
+ this.fineractOutgoingStagingLedgerIdentifier = fineractOutgoingStagingLedgerIdentifier;
}
- public String getFineractOutgoingAccountIdentifier() {
- return fineractOutgoingAccountIdentifier;
+ public String getFineractStellarAssetsLedgerIdentifier() {
+ return fineractStellarAssetsLedgerIdentifier;
}
- public void setFineractOutgoingAccountIdentifier(String fineractOutgoingAccountIdentifier) {
- this.fineractOutgoingAccountIdentifier = fineractOutgoingAccountIdentifier;
+ public void setFineractStellarAssetsLedgerIdentifier(
+ String fineractStellarAssetsLedgerIdentifier) {
+ this.fineractStellarAssetsLedgerIdentifier = fineractStellarAssetsLedgerIdentifier;
+ }
+
+ public String getFineractIncomingStagingLedgerIdentifier() {
+ return fineractIncomingStagingLedgerIdentifier;
+ }
+
+ public void setFineractIncomingStagingLedgerIdentifier(
+ String fineractIncomingStagingLedgerIdentifier) {
+ this.fineractIncomingStagingLedgerIdentifier = fineractIncomingStagingLedgerIdentifier;
}
public String getStellarAccountIdentifier() {
@@ -66,6 +88,14 @@
this.stellarAccountIdentifier = stellarAccountIdentifier;
}
+ public String getStellarPrivateKey() {
+ return stellarPrivateKey;
+ }
+
+ public void setStellarPrivateKey(String stellarPrivateKey) {
+ this.stellarPrivateKey = stellarPrivateKey;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -76,24 +106,36 @@
}
BridgeConfiguration that = (BridgeConfiguration) o;
return Objects
- .equals(fineractIncomingAccountIdentifier, that.fineractIncomingAccountIdentifier) &&
+ .equals(fineractOutgoingStagingLedgerIdentifier,
+ that.fineractOutgoingStagingLedgerIdentifier)
+ &&
Objects
- .equals(fineractOutgoingAccountIdentifier, that.fineractOutgoingAccountIdentifier) &&
- Objects.equals(stellarAccountIdentifier, that.stellarAccountIdentifier);
+ .equals(fineractStellarAssetsLedgerIdentifier,
+ that.fineractStellarAssetsLedgerIdentifier)
+ &&
+ Objects.equals(fineractIncomingStagingLedgerIdentifier,
+ that.fineractIncomingStagingLedgerIdentifier) &&
+ Objects.equals(stellarAccountIdentifier, that.stellarAccountIdentifier) &&
+ Objects.equals(stellarPrivateKey, that.stellarPrivateKey);
}
@Override
public int hashCode() {
- return Objects.hash(fineractIncomingAccountIdentifier, fineractOutgoingAccountIdentifier,
- stellarAccountIdentifier);
+ return Objects
+ .hash(fineractOutgoingStagingLedgerIdentifier, fineractStellarAssetsLedgerIdentifier,
+ fineractIncomingStagingLedgerIdentifier, stellarAccountIdentifier, stellarPrivateKey);
}
@Override
public String toString() {
return "BridgeConfiguration{" +
- "fineractIncomingAccountIdentifier='" + fineractIncomingAccountIdentifier + '\'' +
- ", fineractOutgoingAccountIdentifier='" + fineractOutgoingAccountIdentifier + '\'' +
+ "fineractOutgoingStagingLedgerIdentifier='" + fineractOutgoingStagingLedgerIdentifier + '\''
+ +
+ ", fineractStellarAssetsLedgerIdentifier='" + fineractStellarAssetsLedgerIdentifier + '\'' +
+ ", fineractIncomingStagingLedgerIdentifier='" + fineractIncomingStagingLedgerIdentifier
+ + '\''
+ +
", stellarAccountIdentifier='" + stellarAccountIdentifier + '\'' +
'}';
}
diff --git a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/StellarCurrencyIssuer.java b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/StellarCurrencyIssuer.java
new file mode 100644
index 0000000..b9097f6
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/StellarCurrencyIssuer.java
@@ -0,0 +1,62 @@
+package org.apache.fineract.cn.stellarbridge.api.v1.domain;
+
+import java.util.Objects;
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+
+public class StellarCurrencyIssuer {
+ @ValidIdentifier
+ String currencyCode;
+
+ String stellarIssuer;
+
+ public StellarCurrencyIssuer() {
+ }
+
+ public StellarCurrencyIssuer(String currencyCode, String stellarIssuer) {
+ this.currencyCode = currencyCode;
+ this.stellarIssuer = stellarIssuer;
+ }
+
+ public String getCurrencyCode() {
+ return currencyCode;
+ }
+
+ public void setCurrencyCode(String currencyCode) {
+ this.currencyCode = currencyCode;
+ }
+
+ public String getStellarIssuer() {
+ return stellarIssuer;
+ }
+
+ public void setStellarIssuer(String stellarIssuer) {
+ this.stellarIssuer = stellarIssuer;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ StellarCurrencyIssuer that = (StellarCurrencyIssuer) o;
+ return Objects.equals(currencyCode, that.currencyCode) &&
+ Objects.equals(stellarIssuer, that.stellarIssuer);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(currencyCode, stellarIssuer);
+ }
+
+ @Override
+ public String toString() {
+ return "StellarCurrencyIssuer{" +
+ "currencyCode='" + currencyCode + '\'' +
+ ", stellarIssuer='" + stellarIssuer + '\'' +
+ '}';
+ }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/events/EventConstants.java b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/events/EventConstants.java
index c644272..8a4e5f8 100644
--- a/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/events/EventConstants.java
+++ b/api/src/main/java/org/apache/fineract/cn/stellarbridge/api/v1/events/EventConstants.java
@@ -25,10 +25,12 @@
String SELECTOR_NAME = "action";
String INITIALIZE = "initialize";
String PUT_CONFIG = "put-config";
+ String PUT_STELLAR_CURRENCY_ISSUER = "put-stellar-currency-issuer";
String STELLAR_PAYMENT_PROCESSED = "bridge-stellar-payment";
String FINERACT_PAYMENT_PROCESSED = "bridge-fineract-payment";
String SELECTOR_INITIALIZE = SELECTOR_NAME + " = '" + INITIALIZE + "'";
String SELECTOR_PUT_CONFIG = SELECTOR_NAME + " = '" + PUT_CONFIG + "'";
String SELECTOR_STELLAR_PAYMENT_PROCESSED = SELECTOR_NAME + " = '" + STELLAR_PAYMENT_PROCESSED + "'";
String SELECTOR_FINERACT_PAYMENT_PROCESSED = SELECTOR_NAME + " = '" + FINERACT_PAYMENT_PROCESSED + "'";
+ String SELECTOR_PUT_STELLAR_CURRENCY_ISSUER = SELECTOR_NAME + " = '" + PUT_STELLAR_CURRENCY_ISSUER + "'";
}
diff --git a/api/src/test/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfigurationTest.java b/api/src/test/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfigurationTest.java
index cb13f9e..120d5c5 100644
--- a/api/src/test/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfigurationTest.java
+++ b/api/src/test/java/org/apache/fineract/cn/stellarbridge/api/v1/domain/BridgeConfigurationTest.java
@@ -33,7 +33,7 @@
@Override
protected BridgeConfiguration createValidTestSubject() {
- return new BridgeConfiguration("xxxx", "yyy", "zzz");
+ return new BridgeConfiguration("aaa", "xxxx", "yyy", "zzz", "oo");
}
@Parameterized.Parameters
@@ -43,13 +43,13 @@
.adjustment(x -> {})
.valid(true));
ret.add(new ValidationTestCase<BridgeConfiguration>("nullIdentifier")
- .adjustment(x -> x.setFineractIncomingAccountIdentifier(null))
+ .adjustment(x -> x.setFineractIncomingStagingLedgerIdentifier(null))
.valid(false));
ret.add(new ValidationTestCase<BridgeConfiguration>("tooShortIdentifier")
- .adjustment(x -> x.setFineractIncomingAccountIdentifier("z"))
+ .adjustment(x -> x.setFineractIncomingStagingLedgerIdentifier("z"))
.valid(false));
ret.add(new ValidationTestCase<BridgeConfiguration>("tooLongPayload")
- .adjustment(x -> x.setFineractIncomingAccountIdentifier(RandomStringUtils.randomAlphanumeric(513)))
+ .adjustment(x -> x.setFineractIncomingStagingLedgerIdentifier(RandomStringUtils.randomAlphanumeric(513)))
.valid(false));
return ret;
}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/stellarbridge/TestBridgeConfiguration.java b/component-test/src/main/java/org/apache/fineract/cn/stellarbridge/TestBridgeConfiguration.java
index 1a91fde..c2af92d 100644
--- a/component-test/src/main/java/org/apache/fineract/cn/stellarbridge/TestBridgeConfiguration.java
+++ b/component-test/src/main/java/org/apache/fineract/cn/stellarbridge/TestBridgeConfiguration.java
@@ -122,6 +122,8 @@
new BridgeConfiguration(
"blah",
"blah",
+ "blah",
+ "blah",
"blah");
this.testSubject.setBridgeConfiguration(bridgeConfiguration);
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/accounting/AccountingAdapter.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/accounting/AccountingAdapter.java
index 6075143..8513b34 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/accounting/AccountingAdapter.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/accounting/AccountingAdapter.java
@@ -1,6 +1,15 @@
package org.apache.fineract.cn.stellarbridge.service.internal.accounting;
import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.fineract.cn.accounting.api.v1.client.JournalEntryAlreadyExistsException;
+import org.apache.fineract.cn.accounting.api.v1.domain.Creditor;
+import org.apache.fineract.cn.accounting.api.v1.domain.Debtor;
+import org.apache.fineract.cn.accounting.api.v1.domain.JournalEntry;
+import org.apache.fineract.cn.lang.DateConverter;
+import org.apache.fineract.cn.stellarbridge.service.internal.config.StellarBridgeProperties;
import org.apache.fineract.cn.stellarbridge.service.internal.repository.BridgeConfigurationEntity;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -8,24 +17,83 @@
@Service
public class AccountingAdapter {
private final JournalEntryCreator journalEntryCreator;
+ private final StellarBridgeProperties stellarBridgeProperties;
@Autowired
public AccountingAdapter(
- final JournalEntryCreator journalEntryCreator) {
+ final JournalEntryCreator journalEntryCreator,
+ StellarBridgeProperties stellarBridgeProperties) {
this.journalEntryCreator = journalEntryCreator;
+ this.stellarBridgeProperties = stellarBridgeProperties;
}
- public String adjustFineractBalances(
+ public String acceptIncomingPayment(
final BridgeConfigurationEntity bridgeConfigurationEntity,
final BigDecimal amount,
- final String assetCode) {
- //journalEntryCreator.createJournalEntry(journalEntry);
- return null;
+ final String assetCode,
+ final LocalDateTime transactionDate) throws InterruptedException {
+ final JournalEntry journalEntryFundsAcceptance = new JournalEntry();
+ final Creditor creditor = new Creditor(
+ bridgeConfigurationEntity.getFineractStellerLedger() + "." + assetCode,
+ amount.toString());
+ final Debtor debtor = new Debtor(
+ bridgeConfigurationEntity.getFineractIncomingLedger() + "." + assetCode,
+ amount.toString());
+
+ journalEntryFundsAcceptance.setClerk(stellarBridgeProperties.getUser());
+ journalEntryFundsAcceptance.setCreditors(Collections.singleton(creditor));
+ journalEntryFundsAcceptance.setDebtors(Collections.singleton(debtor));
+ journalEntryFundsAcceptance.setTransactionDate(DateConverter.toIsoString(transactionDate));
+ journalEntryFundsAcceptance.setTransactionType("BCHQ");
+
+ final String transactionId = createWithUniqueTransactionIdentifier(journalEntryFundsAcceptance);
+
+ Thread.sleep(2000); //TODO: replace with a wait on the journal entry creation.
+
+ final JournalEntry journalEntryFundsForwarding = new JournalEntry();
+ final Creditor fundsForwardingCreditor = new Creditor(
+ bridgeConfigurationEntity.getFineractStellerLedger() + "." + assetCode,
+ amount.toString());
+ final Debtor fundsForwardingDebtor = new Debtor(
+ bridgeConfigurationEntity.getFineractIncomingLedger() + "." + assetCode,
+ amount.toString());
+
+ journalEntryFundsForwarding.setClerk(stellarBridgeProperties.getUser());
+ journalEntryFundsForwarding.setCreditors(Collections.singleton(fundsForwardingCreditor));
+ journalEntryFundsForwarding.setDebtors(Collections.singleton(fundsForwardingDebtor));
+ journalEntryFundsForwarding.setTransactionDate(DateConverter.toIsoString(transactionDate));
+ journalEntryFundsForwarding.setTransactionType("ICCT");
+
+ createWithUniqueTransactionIdentifier(journalEntryFundsForwarding);
+
+
+ return transactionId;
}
- public void tellFineractPaymentSucceeded(String fineractStagingAccountIdentifier,
- String assetCode, BigDecimal amount)
- {
+ private String createWithUniqueTransactionIdentifier(final JournalEntry journalEntry) {
+ while (true) {
+ try {
+ final String transactionUniqueifier = RandomStringUtils.random(26, true, true);
+ journalEntry.setTransactionIdentifier(formulateTransactionIdentifier(transactionUniqueifier));
+ journalEntryCreator.createJournalEntry(journalEntry);
+ return transactionUniqueifier;
+ } catch (final JournalEntryAlreadyExistsException ignore) {
+ //Try again with a new uniqueifier.
+ }
+ }
+ }
+ private static String formulateTransactionIdentifier(
+ final String transactionUniqueifier) {
+ return "stellarbridge." + transactionUniqueifier;
+ }
+
+ public void tellFineractPaymentSucceeded(
+ final String fineractOutgoingLedger,
+ final String fineractStellerLedger,
+ final String assetCode,
+ final BigDecimal amount)
+ {
+//TODO:
}
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/ChangeStellarCurrencyIssuerCommand.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/ChangeStellarCurrencyIssuerCommand.java
new file mode 100644
index 0000000..34b9c9f
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/ChangeStellarCurrencyIssuerCommand.java
@@ -0,0 +1,31 @@
+package org.apache.fineract.cn.stellarbridge.service.internal.command;
+
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
+
+public class ChangeStellarCurrencyIssuerCommand {
+
+ private final String tenantIdentifier;
+ private final StellarCurrencyIssuer instance;
+
+ public ChangeStellarCurrencyIssuerCommand(String tenantIdentifier,
+ StellarCurrencyIssuer instance) {
+ this.tenantIdentifier = tenantIdentifier;
+ this.instance = instance;
+ }
+
+ public String getTenantIdentifier() {
+ return tenantIdentifier;
+ }
+
+ public StellarCurrencyIssuer getInstance() {
+ return instance;
+ }
+
+ @Override
+ public String toString() {
+ return "ChangeStellarCurrencyIssuerCommand{" +
+ "tenantIdentifier='" + tenantIdentifier + '\'' +
+ ", instance=" + instance +
+ '}';
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/StellarPaymentCommand.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/StellarPaymentCommand.java
index d1cd85a..d6be0d2 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/StellarPaymentCommand.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/StellarPaymentCommand.java
@@ -1,17 +1,24 @@
package org.apache.fineract.cn.stellarbridge.service.internal.command;
import java.math.BigDecimal;
+import java.time.LocalDateTime;
public class StellarPaymentCommand {
private final String tenantIdentifier;
private final String assetCode;
private final BigDecimal amount;
+ private final LocalDateTime transactionDate;
- public StellarPaymentCommand(String tenantIdentifier, String assetCode, BigDecimal amount) {
+ public StellarPaymentCommand(
+ String tenantIdentifier,
+ String assetCode,
+ BigDecimal amount,
+ LocalDateTime transactionDate) {
this.tenantIdentifier = tenantIdentifier;
this.assetCode = assetCode;
this.amount = amount;
+ this.transactionDate = transactionDate;
}
public String getTenantIdentifier() {
@@ -25,4 +32,8 @@
public BigDecimal getAmount() {
return amount;
}
+
+ public LocalDateTime getTransactionDate() {
+ return transactionDate;
+ }
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/BridgeConfigurationCommandHandler.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/BridgeConfigurationCommandHandler.java
index 973eeb4..6019784 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/BridgeConfigurationCommandHandler.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/BridgeConfigurationCommandHandler.java
@@ -23,9 +23,13 @@
import org.apache.fineract.cn.command.annotation.CommandLogLevel;
import org.apache.fineract.cn.stellarbridge.api.v1.events.EventConstants;
import org.apache.fineract.cn.stellarbridge.service.internal.command.ChangeConfigurationCommand;
+import org.apache.fineract.cn.stellarbridge.service.internal.command.ChangeStellarCurrencyIssuerCommand;
import org.apache.fineract.cn.stellarbridge.service.internal.mapper.BridgeConfigurationMapper;
+import org.apache.fineract.cn.stellarbridge.service.internal.mapper.StellarCurrencyIssuerMapper;
import org.apache.fineract.cn.stellarbridge.service.internal.repository.BridgeConfigurationEntity;
import org.apache.fineract.cn.stellarbridge.service.internal.repository.BridgeConfigurationRepository;
+import org.apache.fineract.cn.stellarbridge.service.internal.repository.StellarCurrencyIssuerEntity;
+import org.apache.fineract.cn.stellarbridge.service.internal.repository.StellarCurrencyIssuerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -34,13 +38,16 @@
public class BridgeConfigurationCommandHandler {
private final BridgeConfigurationRepository bridgeConfigurationRepository;
+ private final StellarCurrencyIssuerRepository stellarCurrencyIssuerRepository;
private final EventHelper eventHelper;
@Autowired
public BridgeConfigurationCommandHandler(
final BridgeConfigurationRepository bridgeConfigurationRepository,
+ StellarCurrencyIssuerRepository stellarCurrencyIssuerRepository,
final EventHelper eventHelper) {
this.bridgeConfigurationRepository = bridgeConfigurationRepository;
+ this.stellarCurrencyIssuerRepository = stellarCurrencyIssuerRepository;
this.eventHelper = eventHelper;
}
@@ -55,4 +62,16 @@
eventHelper.sendEvent(EventConstants.PUT_CONFIG, changeConfigurationCommand.tenantIdentifier(), null);
}
+
+ @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+ @Transactional
+ public void handle(final ChangeStellarCurrencyIssuerCommand changeStellarCurrencyIssuerCommand) {
+
+ final StellarCurrencyIssuerEntity entity = StellarCurrencyIssuerMapper.map(
+ changeStellarCurrencyIssuerCommand.getTenantIdentifier(),
+ changeStellarCurrencyIssuerCommand.getInstance());
+ this.stellarCurrencyIssuerRepository.save(entity);
+
+ eventHelper.sendEvent(EventConstants.PUT_STELLAR_CURRENCY_ISSUER, changeStellarCurrencyIssuerCommand.getTenantIdentifier(), null);
+ }
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/FineractPaymentCommandHandler.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/FineractPaymentCommandHandler.java
index 328a542..76ef0ad 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/FineractPaymentCommandHandler.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/FineractPaymentCommandHandler.java
@@ -57,7 +57,7 @@
StellarAddress.forTenant(command.getTargetAccount(), command.getSinkDomain()));
final char[] decodedStellarPrivateKey =
- bridgeConfigurationEntity.getStellarAccountPrivateKey();
+ bridgeConfigurationEntity.getStellarAccountPrivateKey().toCharArray();
horizonServerUtilities.findPathPay(
targetAccountId,
@@ -65,7 +65,8 @@
decodedStellarPrivateKey);
accountingAdapter.tellFineractPaymentSucceeded(
- bridgeConfigurationEntity.getFineractStagingAccountIdentifier(),
+ bridgeConfigurationEntity.getFineractOutgoingLedger(),
+ bridgeConfigurationEntity.getFineractStellerLedger(),
command.getAssetCode(),
command.getAmount());
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/StellarPaymentCommandHandler.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/StellarPaymentCommandHandler.java
index 00ea780..c0c9904 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/StellarPaymentCommandHandler.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/command/handler/StellarPaymentCommandHandler.java
@@ -31,16 +31,22 @@
@CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
@Transactional
- public void handle(final StellarPaymentCommand command) {
+ public void handle(final StellarPaymentCommand command) throws InterruptedException {
final Optional<BridgeConfigurationEntity> accountBridge =
bridgeConfigurationRepository.findByTenantIdentifier(command.getTenantIdentifier());
- final Optional<String> transactionIdentifier = accountBridge.map(x -> accountingAdapter.adjustFineractBalances(
- x, command.getAmount(), command.getAssetCode()));
+ if (accountBridge.isPresent())
+ {
+ final String transactionIdentifier = accountingAdapter.acceptIncomingPayment(
+ accountBridge.get(), command.getAmount(), command.getAssetCode(),
+ command.getTransactionDate());
- transactionIdentifier.ifPresent(x ->
- eventHelper.sendEvent(EventConstants.STELLAR_PAYMENT_PROCESSED, command.getTenantIdentifier(), x));
+ eventHelper.sendEvent(
+ EventConstants.STELLAR_PAYMENT_PROCESSED,
+ command.getTenantIdentifier(),
+ transactionIdentifier);
+ }
}
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerEffectsListener.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerEffectsListener.java
index f9726a9..f071b8b 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerEffectsListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerEffectsListener.java
@@ -1,6 +1,8 @@
package org.apache.fineract.cn.stellarbridge.service.internal.horizonadapter;
import java.math.BigDecimal;
+import java.time.Clock;
+import java.time.LocalDateTime;
import java.util.Date;
import java.util.Optional;
import org.apache.fineract.cn.command.gateway.CommandGateway;
@@ -96,7 +98,8 @@
return;
final StellarPaymentCommand receivePaymentCommand =
- new StellarPaymentCommand(toAccount.getTenantIdentifier(), assetCode, amount);
+ new StellarPaymentCommand(toAccount.getTenantIdentifier(), assetCode, amount,
+ LocalDateTime.now(Clock.systemUTC()));
commandGateway.process(receivePaymentCommand);
}
else if (effect instanceof AccountDebitedEffectResponse)
@@ -121,7 +124,8 @@
return;
final StellarPaymentCommand receivePaymentCommand =
- new StellarPaymentCommand(toAccount.getTenantIdentifier(), assetCode, amount.negate());
+ new StellarPaymentCommand(toAccount.getTenantIdentifier(), assetCode, amount.negate(),
+ LocalDateTime.now(Clock.systemUTC()));
commandGateway.process(receivePaymentCommand);
}
else
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerPaymentObserver.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerPaymentObserver.java
index 53e9acd..d1d0d96 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerPaymentObserver.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/horizonadapter/HorizonServerPaymentObserver.java
@@ -13,6 +13,7 @@
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.dao.InvalidDataAccessResourceUsageException;
import org.springframework.stereotype.Component;
import org.stellar.sdk.KeyPair;
import org.stellar.sdk.requests.EffectsRequestBuilder;
@@ -29,11 +30,17 @@
@PostConstruct
void init()
{
- final Optional<String> cursor = getCurrentCursor();
+ try {
+ final Optional<String> cursor = this.getCurrentCursor();
- bridgeConfigurationRepository.findAll()
- .forEach(config -> setupListeningForAccount(
- StellarAccountId.mainAccount(config.getStellarAccountIdentifier()), cursor));
+ bridgeConfigurationRepository.findAll()
+ .forEach(config -> setupListeningForAccount(
+ StellarAccountId.mainAccount(config.getStellarAccountIdentifier()), cursor));
+ }
+ catch (InvalidDataAccessResourceUsageException x) {
+ //Nothing. If the repository hasn't been provisioned yet, there are no mapped accounts to
+ //listen in on.
+ }
}
@Autowired
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/BridgeConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/BridgeConfigurationMapper.java
index 5605187..39b4128 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/BridgeConfigurationMapper.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/BridgeConfigurationMapper.java
@@ -30,18 +30,22 @@
public static BridgeConfiguration map(final BridgeConfigurationEntity toMap) {
final BridgeConfiguration bridgeConfiguration = new BridgeConfiguration();
- bridgeConfiguration.setFineractIncomingAccountIdentifier(toMap.getFineractIncomingAccountIdentifier());
- bridgeConfiguration.setFineractOutgoingAccountIdentifier(toMap.getFineractOutgoingAccountIdentifier());
+ bridgeConfiguration.setFineractIncomingStagingLedgerIdentifier(toMap.getFineractIncomingLedger());
+ bridgeConfiguration.setFineractOutgoingStagingLedgerIdentifier(toMap.getFineractOutgoingLedger());
+ bridgeConfiguration.setFineractStellarAssetsLedgerIdentifier(toMap.getFineractStellerLedger());
bridgeConfiguration.setStellarAccountIdentifier(toMap.getStellarAccountIdentifier());
+ bridgeConfiguration.setStellarPrivateKey(toMap.getStellarAccountPrivateKey());
return bridgeConfiguration;
}
public static BridgeConfigurationEntity map(final String forTenant, final BridgeConfiguration toMap) {
final BridgeConfigurationEntity bridgeConfigurationEntity = new BridgeConfigurationEntity();
bridgeConfigurationEntity.setTenantIdentifier(forTenant);
- bridgeConfigurationEntity.setFineractIncomingAccountIdentifier(toMap.getFineractIncomingAccountIdentifier());
- bridgeConfigurationEntity.setFineractOutgoingAccountIdentifier(toMap.getFineractOutgoingAccountIdentifier());
+ bridgeConfigurationEntity.setFineractIncomingLedger(toMap.getFineractIncomingStagingLedgerIdentifier());
+ bridgeConfigurationEntity.setFineractOutgoingLedger(toMap.getFineractOutgoingStagingLedgerIdentifier());
+ bridgeConfigurationEntity.setFineractStellerLedger(toMap.getFineractStellarAssetsLedgerIdentifier());
bridgeConfigurationEntity.setStellarAccountIdentifier(toMap.getStellarAccountIdentifier());
+ bridgeConfigurationEntity.setStellarAccountPrivateKey(toMap.getStellarPrivateKey());
return bridgeConfigurationEntity;
}
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/StellarCurrencyIssuerMapper.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/StellarCurrencyIssuerMapper.java
new file mode 100644
index 0000000..25cc0b8
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/mapper/StellarCurrencyIssuerMapper.java
@@ -0,0 +1,26 @@
+package org.apache.fineract.cn.stellarbridge.service.internal.mapper;
+
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
+import org.apache.fineract.cn.stellarbridge.service.internal.repository.StellarCurrencyIssuerEntity;
+
+public class StellarCurrencyIssuerMapper {
+ private StellarCurrencyIssuerMapper() {
+ super();
+ }
+
+ public static StellarCurrencyIssuer map(final StellarCurrencyIssuerEntity toMap) {
+ final StellarCurrencyIssuer ret = new StellarCurrencyIssuer();
+ ret.setCurrencyCode(toMap.getCurrencyCode());
+ ret.setStellarIssuer(toMap.getStellarIssuer());
+ return ret;
+ }
+
+ public static StellarCurrencyIssuerEntity map(final String tenantIdentifier, final StellarCurrencyIssuer toMap) {
+ final StellarCurrencyIssuerEntity ret = new StellarCurrencyIssuerEntity();
+ ret.setTenantIdentifier(tenantIdentifier);
+ ret.setCurrencyCode(toMap.getCurrencyCode());
+ ret.setStellarIssuer(toMap.getStellarIssuer());
+ return ret;
+ }
+
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/BridgeConfigurationEntity.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/BridgeConfigurationEntity.java
index 9c582eb..66dbd99 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/BridgeConfigurationEntity.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/BridgeConfigurationEntity.java
@@ -25,23 +25,22 @@
@Entity
@Table(name = "nenet_configuration")
public class BridgeConfigurationEntity {
-
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "tenant_identifier")
private String tenantIdentifier;
- @Column(name = "fineract_incoming_identifier")
- private String fineractIncomingAccountIdentifier;
- @Column(name = "fineract_outgoing_identifier")
- private String fineractOutgoingAccountIdentifier;
- @Column(name = "fineract_staging_identifier")
- private String fineractStagingAccountIdentifier;
+ @Column(name = "fineract_incoming_ledger")
+ private String fineractIncomingLedger;
+ @Column(name = "fineract_outgoing_ledger")
+ private String fineractOutgoingLedger;
+ @Column(name = "fineract_stellar_ledger")
+ private String fineractStellerLedger;
@Column(name = "stellar_identifier")
private String stellarAccountIdentifier;
- @Column(name = "stellar_account_private_key")
- private char[] stellarAccountPrivateKey;
+ @Column(name = "stellar_private_key")
+ private String stellarAccountPrivateKey;
public BridgeConfigurationEntity() {
super();
@@ -63,28 +62,28 @@
this.tenantIdentifier = tenantIdentifier;
}
- public String getFineractIncomingAccountIdentifier() {
- return fineractIncomingAccountIdentifier;
+ public String getFineractIncomingLedger() {
+ return fineractIncomingLedger;
}
- public void setFineractIncomingAccountIdentifier(String fineractIncomingAccountIdentifier) {
- this.fineractIncomingAccountIdentifier = fineractIncomingAccountIdentifier;
+ public void setFineractIncomingLedger(String fineractIncomingLedger) {
+ this.fineractIncomingLedger = fineractIncomingLedger;
}
- public String getFineractOutgoingAccountIdentifier() {
- return fineractOutgoingAccountIdentifier;
+ public String getFineractOutgoingLedger() {
+ return fineractOutgoingLedger;
}
- public void setFineractOutgoingAccountIdentifier(String fineractOutgoingAccountIdentifier) {
- this.fineractOutgoingAccountIdentifier = fineractOutgoingAccountIdentifier;
+ public void setFineractOutgoingLedger(String fineractOutgoingLedger) {
+ this.fineractOutgoingLedger = fineractOutgoingLedger;
}
- public String getFineractStagingAccountIdentifier() {
- return fineractStagingAccountIdentifier;
+ public String getFineractStellerLedger() {
+ return fineractStellerLedger;
}
- public void setFineractStagingAccountIdentifier(String fineractStagingAccountIdentifier) {
- this.fineractStagingAccountIdentifier = fineractStagingAccountIdentifier;
+ public void setFineractStellerLedger(String fineractStellerLedger) {
+ this.fineractStellerLedger = fineractStellerLedger;
}
public String getStellarAccountIdentifier() {
@@ -95,11 +94,11 @@
this.stellarAccountIdentifier = stellarAccountIdentifier;
}
- public char[] getStellarAccountPrivateKey() {
+ public String getStellarAccountPrivateKey() {
return stellarAccountPrivateKey;
}
- public void setStellarAccountPrivateKey(char[] stellarAccountPrivateKey) {
+ public void setStellarAccountPrivateKey(String stellarAccountPrivateKey) {
this.stellarAccountPrivateKey = stellarAccountPrivateKey;
}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerEntity.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerEntity.java
new file mode 100644
index 0000000..11c5a62
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerEntity.java
@@ -0,0 +1,80 @@
+package org.apache.fineract.cn.stellarbridge.service.internal.repository;
+
+import java.util.Objects;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "nenet_currency_issuer")
+public class StellarCurrencyIssuerEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ @Column(name = "id")
+ private Long id;
+ @Column(name = "tenant_identifier")
+ private String tenantIdentifier;
+ @Column(name = "currency_code")
+ private String currencyCode;
+ @Column(name = "stellar_issuer")
+ private String stellarIssuer;
+
+ public StellarCurrencyIssuerEntity() {
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTenantIdentifier() {
+ return tenantIdentifier;
+ }
+
+ public void setTenantIdentifier(String tenantIdentifier) {
+ this.tenantIdentifier = tenantIdentifier;
+ }
+
+ public String getCurrencyCode() {
+ return currencyCode;
+ }
+
+ public void setCurrencyCode(String currencyCode) {
+ this.currencyCode = currencyCode;
+ }
+
+ public String getStellarIssuer() {
+ return stellarIssuer;
+ }
+
+ public void setStellarIssuer(String stellarIssuer) {
+ this.stellarIssuer = stellarIssuer;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ StellarCurrencyIssuerEntity that = (StellarCurrencyIssuerEntity) o;
+ return Objects.equals(tenantIdentifier, that.tenantIdentifier) &&
+ Objects.equals(currencyCode, that.currencyCode);
+ }
+
+ @Override
+ public int hashCode() {
+
+ return Objects.hash(tenantIdentifier, currencyCode);
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerRepository.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerRepository.java
new file mode 100644
index 0000000..64499c0
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCurrencyIssuerRepository.java
@@ -0,0 +1,17 @@
+package org.apache.fineract.cn.stellarbridge.service.internal.repository;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface StellarCurrencyIssuerRepository extends
+ JpaRepository<StellarCurrencyIssuerEntity, Long>
+{
+
+ Optional<StellarCurrencyIssuerEntity> findByTenantIdentifierAndCurrencyCode(String tenantIdentifier, String currencyCode);
+
+ Stream<StellarCurrencyIssuerEntity> findByTenantIdentifier(String tenantIdentifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCursorEntity.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCursorEntity.java
index c69bc17..a546f8e 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCursorEntity.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/repository/StellarCursorEntity.java
@@ -20,7 +20,7 @@
@Column(name = "id")
private Long id;
- @Column(name = "cursor")
+ @Column(name = "xcursor")
private String cursor;
@SuppressWarnings("unused")
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/service/StellarCurrencyIssuerService.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/service/StellarCurrencyIssuerService.java
new file mode 100644
index 0000000..56d13b2
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/internal/service/StellarCurrencyIssuerService.java
@@ -0,0 +1,32 @@
+package org.apache.fineract.cn.stellarbridge.service.internal.service;
+
+import java.util.Optional;
+import java.util.stream.Stream;
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
+import org.apache.fineract.cn.stellarbridge.service.internal.mapper.StellarCurrencyIssuerMapper;
+import org.apache.fineract.cn.stellarbridge.service.internal.repository.StellarCurrencyIssuerRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class StellarCurrencyIssuerService {
+
+ final private StellarCurrencyIssuerRepository stellarCurrencyIssuerRepository;
+
+ @Autowired
+ public StellarCurrencyIssuerService(
+ final StellarCurrencyIssuerRepository stellarCurrencyIssuerRepository) {
+ this.stellarCurrencyIssuerRepository = stellarCurrencyIssuerRepository;
+ }
+
+ public Optional<StellarCurrencyIssuer> find(final String tenantIdentifier, final String currencyCode) {
+ return this.stellarCurrencyIssuerRepository
+ .findByTenantIdentifierAndCurrencyCode(tenantIdentifier, currencyCode)
+ .map(StellarCurrencyIssuerMapper::map);
+ }
+
+ public Stream<StellarCurrencyIssuer> findAll(final String tenantIdentifier) {
+ return this.stellarCurrencyIssuerRepository.findByTenantIdentifier(tenantIdentifier)
+ .map(StellarCurrencyIssuerMapper::map);
+ }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/BridgeConfigurationRestController.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/BridgeConfigurationRestController.java
index 6bfcc8d..3ae5e2a 100644
--- a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/BridgeConfigurationRestController.java
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/BridgeConfigurationRestController.java
@@ -24,6 +24,7 @@
import org.apache.fineract.cn.anubis.annotation.AcceptedTokenType;
import org.apache.fineract.cn.anubis.annotation.Permittable;
import org.apache.fineract.cn.command.gateway.CommandGateway;
+import org.apache.fineract.cn.lang.ServiceException;
import org.apache.fineract.cn.stellarbridge.api.v1.PermittableGroupIds;
import org.apache.fineract.cn.stellarbridge.api.v1.domain.BridgeConfiguration;
import org.apache.fineract.cn.stellarbridge.service.internal.command.ChangeConfigurationCommand;
@@ -81,8 +82,9 @@
@ResponseBody
ResponseEntity<BridgeConfiguration> getBridgeConfiguration(
@RequestHeader(TENANT_HEADER) final String tenantIdentifier) {
- return ResponseEntity.ok(this.bridgeConfigurationService.findByTenantIdentifier(tenantIdentifier)
- .orElseGet(() -> new BridgeConfiguration(null, null, null)));
+ return this.bridgeConfigurationService.findByTenantIdentifier(tenantIdentifier)
+ .map(ResponseEntity::ok)
+ .orElseThrow(() -> ServiceException.notFound("Tenant not found."));
}
@Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.CONFIGURATION_MANAGEMENT)
diff --git a/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/StellarCurrencyIssuerRestController.java b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/StellarCurrencyIssuerRestController.java
new file mode 100644
index 0000000..d5507ed
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/stellarbridge/service/rest/StellarCurrencyIssuerRestController.java
@@ -0,0 +1,91 @@
+package org.apache.fineract.cn.stellarbridge.service.rest;
+
+import static org.apache.fineract.cn.lang.config.TenantHeaderFilter.TENANT_HEADER;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import javax.validation.Valid;
+import org.apache.fineract.cn.anubis.annotation.AcceptedTokenType;
+import org.apache.fineract.cn.anubis.annotation.Permittable;
+import org.apache.fineract.cn.command.gateway.CommandGateway;
+import org.apache.fineract.cn.lang.ServiceException;
+import org.apache.fineract.cn.stellarbridge.api.v1.PermittableGroupIds;
+import org.apache.fineract.cn.stellarbridge.api.v1.domain.StellarCurrencyIssuer;
+import org.apache.fineract.cn.stellarbridge.service.internal.command.ChangeStellarCurrencyIssuerCommand;
+import org.apache.fineract.cn.stellarbridge.service.internal.service.StellarCurrencyIssuerService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/currencyissuers")
+public class StellarCurrencyIssuerRestController {
+
+ private final CommandGateway commandGateway;
+ private final StellarCurrencyIssuerService stellarCurrencyIssuerService;
+
+ @Autowired
+ public StellarCurrencyIssuerRestController(
+ final CommandGateway commandGateway,
+ final StellarCurrencyIssuerService stellarCurrencyIssuerService) {
+ this.commandGateway = commandGateway;
+ this.stellarCurrencyIssuerService = stellarCurrencyIssuerService;
+ }
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.CONFIGURATION_MANAGEMENT)
+ @RequestMapping(
+ method = RequestMethod.GET,
+ consumes = MediaType.ALL_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ ResponseEntity<List<StellarCurrencyIssuer>> get(
+ @RequestHeader(TENANT_HEADER) final String tenantIdentifier) {
+ return ResponseEntity.ok(this.stellarCurrencyIssuerService.findAll(tenantIdentifier)
+ .collect(Collectors.toList()));
+ }
+
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.CONFIGURATION_MANAGEMENT)
+ @RequestMapping(
+ value = "/{currencycode}",
+ method = RequestMethod.GET,
+ consumes = MediaType.ALL_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public
+ @ResponseBody
+ ResponseEntity<StellarCurrencyIssuer> getBridgeConfiguration(
+ @RequestHeader(TENANT_HEADER) final String tenantIdentifier,
+ @PathVariable("currencycode") String currencyCode) {
+ return this.stellarCurrencyIssuerService.find(tenantIdentifier, currencyCode)
+ .map(ResponseEntity::ok)
+ .orElseThrow(() -> ServiceException.notFound("Tenant not found."));
+ }
+
+ @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.CONFIGURATION_MANAGEMENT)
+ @RequestMapping(
+ value = "{currencycode}",
+ method = RequestMethod.PUT,
+ consumes = MediaType.APPLICATION_JSON_VALUE,
+ produces = MediaType.APPLICATION_JSON_VALUE
+ )
+ public @ResponseBody ResponseEntity<Void> changeCase(
+ @RequestHeader(TENANT_HEADER) final String tenantIdentifier,
+ @PathVariable("currencycode") final String currencyCode,
+ @RequestBody @Valid final StellarCurrencyIssuer instance)
+ {
+ if (!currencyCode.equals(instance.getCurrencyCode()))
+ throw ServiceException.badRequest("Instance currency code may not be changed.");
+
+ this.commandGateway.process(new ChangeStellarCurrencyIssuerCommand(tenantIdentifier, instance));
+ return new ResponseEntity<>(HttpStatus.ACCEPTED);
+ }
+}
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
index d5d568e..b51df47 100644
--- a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -36,4 +36,13 @@
created_on TIMESTAMP NOT NULL,
CONSTRAINT nenet_stellar_cursor_uq UNIQUE (xcursor),
CONSTRAINT nenet_stellar_cursor_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE nenet_currency_issuer (
+ id BIGINT NOT NULL AUTO_INCREMENT,
+ tenant_identifier VARCHAR(32) NOT NULL,
+ currency_code VARCHAR(3) NOT NULL,
+ stellar_issuer VARCHAR(512) NULL,
+ CONSTRAINT nenet_currency_issuer_uq UNIQUE (tenant_identifier, currency_code),
+ CONSTRAINT nenet_currency_issuer_pk PRIMARY KEY (id)
);
\ No newline at end of file