diff --git a/src/main/java/se/koc/trader/TraderServer.java b/src/main/java/se/koc/trader/TraderServer.java index 6f75689..58572b0 100644 --- a/src/main/java/se/koc/trader/TraderServer.java +++ b/src/main/java/se/koc/trader/TraderServer.java @@ -4,6 +4,7 @@ import se.koc.trader.api.ExchangeConfig; import se.koc.trader.endpoint.AlertEndpoint; import se.koc.trader.api.TraderApiEndpoint; import se.koc.trader.daemon.TraderMarketUpdateManager; +import se.koc.trader.endpoint.ExchangeEndpoint; import se.koc.trader.struct.Exchange; import se.koc.trader.struct.PluginConfig; import se.koc.trader.api.TraderPage; @@ -13,6 +14,7 @@ import zutil.log.LogUtil; import zutil.net.http.HttpServer; import zutil.net.http.page.HttpFilePage; import zutil.net.http.page.HttpRedirectPage; +import zutil.net.ws.rest.RESTHttpPage; import zutil.plugin.PluginData; import zutil.plugin.PluginManager; @@ -96,6 +98,7 @@ public class TraderServer { registerPage(it.next()); for (Iterator it = pluginManager.getSingletonIterator(TraderPage.class); it.hasNext(); ) registerPage(it.next()); + http.setPage(ExchangeEndpoint.API_PATH, new RESTHttpPage(new ExchangeEndpoint())); http.start(); } diff --git a/src/main/java/se/koc/trader/endpoint/ExchangeEndpoint.java b/src/main/java/se/koc/trader/endpoint/ExchangeEndpoint.java new file mode 100644 index 0000000..fbb66c3 --- /dev/null +++ b/src/main/java/se/koc/trader/endpoint/ExchangeEndpoint.java @@ -0,0 +1,30 @@ +package se.koc.trader.endpoint; + +import se.koc.trader.TraderContext; +import se.koc.trader.struct.Exchange; +import se.koc.trader.struct.Symbol; +import zutil.db.DBConnection; +import zutil.net.ws.WSInterface; +import zutil.parser.DataNode; + +import java.sql.SQLException; + + +public class ExchangeEndpoint implements WSInterface { + public static final String API_PATH = "/api/exchange"; + + + @WSPath(API_PATH + "/symbols") + public DataNode getAllSymbols(int exchangeId) throws SQLException { + DBConnection db = TraderContext.getDB(); + DataNode root = new DataNode(DataNode.DataType.Map); + + Exchange exchange = Exchange.getExchange(db, exchangeId); + DataNode symbols = root.set("symbols", DataNode.DataType.List); + for (Symbol symbol : exchange.getObject().getExchangeMarket().getSymbols()) { + symbols.add(symbol.getName()); + } + + return root; + } +} diff --git a/src/main/java/se/koc/trader/exchange/binance/BinanceExchange.java b/src/main/java/se/koc/trader/exchange/binance/BinanceExchange.java index 402a813..b6e27be 100644 --- a/src/main/java/se/koc/trader/exchange/binance/BinanceExchange.java +++ b/src/main/java/se/koc/trader/exchange/binance/BinanceExchange.java @@ -3,9 +3,24 @@ package se.koc.trader.exchange.binance; import se.koc.trader.api.ExchangeConfig; import se.koc.trader.api.ExchangeMarket; import se.koc.trader.api.ExchangeWallet; +import zutil.ui.conf.Configurator; public class BinanceExchange extends ExchangeConfig { - private BinanceMarket market; + + @Configurator.Configurable("Binance API Key") + private String apiKey; + + transient private BinanceMarket market; + + + public String getApiKey() { + return apiKey; + } + + public void setApiKey(String apiKey) { + this.apiKey = apiKey; + } + @Override public ExchangeMarket getExchangeMarket() { diff --git a/src/main/java/se/koc/trader/page/SymbolConfigPage.java b/src/main/java/se/koc/trader/page/SymbolConfigPage.java index e8c711c..24dc8b3 100644 --- a/src/main/java/se/koc/trader/page/SymbolConfigPage.java +++ b/src/main/java/se/koc/trader/page/SymbolConfigPage.java @@ -2,6 +2,7 @@ package se.koc.trader.page; import se.koc.trader.TraderContext; import se.koc.trader.api.TraderPage; +import se.koc.trader.struct.Exchange; import se.koc.trader.struct.Symbol; import zutil.ObjectUtil; import zutil.db.DBConnection; @@ -80,6 +81,7 @@ public class SymbolConfigPage extends TraderPage { // Output Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); + tmpl.set("exchanges", Exchange.getExchanges(db)); tmpl.set("symbols", Symbol.getSymbols(db)); return tmpl; diff --git a/src/main/java/se/koc/trader/struct/Symbol.java b/src/main/java/se/koc/trader/struct/Symbol.java index e4a211c..2dff550 100644 --- a/src/main/java/se/koc/trader/struct/Symbol.java +++ b/src/main/java/se/koc/trader/struct/Symbol.java @@ -1,9 +1,11 @@ package se.koc.trader.struct; import se.koc.trader.api.ExchangeConfig; +import se.koc.trader.util.ConfigExchangeValueProvider; import zutil.db.DBConnection; import zutil.db.bean.DBBean; import zutil.db.bean.DBBeanObjectDSO; +import zutil.ui.Configurator; import java.sql.SQLException; import java.util.List; @@ -19,6 +21,7 @@ public class Symbol extends DBBean { private double price; private long priceTimestamp; + @Configurator.Configurable(value = "Exchange", description = "The exchange instance where symbol exists.", valueProvider = ConfigExchangeValueProvider.class) private ExchangeConfig exchangeConfig; diff --git a/src/main/java/se/koc/trader/util/ConfigExchangeValueProvider.java b/src/main/java/se/koc/trader/util/ConfigExchangeValueProvider.java new file mode 100644 index 0000000..3b8430e --- /dev/null +++ b/src/main/java/se/koc/trader/util/ConfigExchangeValueProvider.java @@ -0,0 +1,37 @@ +package se.koc.trader.util; + +import se.koc.trader.TraderContext; +import se.koc.trader.struct.Exchange; +import zutil.db.DBConnection; +import zutil.ui.Configurator; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +/** + * A value provider that will give all Enum values + */ +public class ConfigExchangeValueProvider implements Configurator.ConfigValueProvider { + Map map = new HashMap<>(); + + @Override + public String[] getPossibleValues() { + DBConnection db = TraderContext.getDB(); + + try { + for (Exchange exchange : Exchange.getExchanges(db)) { + map.put(exchange.getName() + " (Id: " + exchange.getId() + ")", exchange); + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return map.keySet().toArray(new String[0]); + } + + @Override + public Exchange getValueObject(String value) { + return map.get(value); + } +} \ No newline at end of file diff --git a/src/main/resources/web/exchange_config.tmpl b/src/main/resources/web/exchange_config.tmpl index f96bf1e..414cf28 100644 --- a/src/main/resources/web/exchange_config.tmpl +++ b/src/main/resources/web/exchange_config.tmpl @@ -1,15 +1,6 @@
-
-
-
- -
-
Exchange Instances
@@ -21,7 +12,16 @@ Name Type Configuration - Actions + +
+
+ +
+
+ @@ -83,12 +83,12 @@
- +
- {{#exchangeConfigClasses}} {{/exchangeConfigClasses}} @@ -116,13 +116,13 @@ {{#.isTypeString()}}{{/#.isTypeString()}} - {{#.isTypeInt()}}{{/#.isTypeInt()}} + {{#.isTypeNumber()}}{{/#.isTypeNumber()}} {{#.isTypeBoolean()}}{{/#.isTypeBoolean()}} - {{#.isTypeEnum()}} + {{#.isTypeSelection()}} - {{/#.isTypeEnum()}} + {{/#.isTypeSelection()}} {{#.getDescription()}}
{{.getDescription()}}
diff --git a/src/main/resources/web/js/trader.js b/src/main/resources/web/js/trader.js index f2d42ed..264d885 100644 --- a/src/main/resources/web/js/trader.js +++ b/src/main/resources/web/js/trader.js @@ -70,7 +70,7 @@ function initDynamicModalForm(modalId, formTemplateId = null, templateID = null) }); // Update dynamic inputs $("#" + modalId + " select[name=type]").change(function(){ - $("#" + modalId + " #"+formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]); + $("#" + modalId + " #" + formTemplateId).html(dynamicConf[formTemplateId][$(this).val()]); }); } diff --git a/src/main/resources/web/symbol_config.tmpl b/src/main/resources/web/symbol_config.tmpl index 24e3677..a287979 100644 --- a/src/main/resources/web/symbol_config.tmpl +++ b/src/main/resources/web/symbol_config.tmpl @@ -1,82 +1,74 @@
-
-
-
-
@@ -84,24 +76,35 @@ -