From 65ceb60983555034ba7fbc3f58f1472e2031dd0e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:01:57 +0430 Subject: [PATCH 01/11] Add pair map database scripts --- .../opex/port/api/postgres/config/PostgresConfig.kt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index bc72c1ad7..cb9d0e437 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -53,10 +53,17 @@ class PostgresConfig(db: DatabaseClient) { taker_uuid VARCHAR(72) NOT NULL, create_date TIMESTAMP ); + CREATE TABLE IF NOT EXISTS pair_map ( + pair VARCHAR(72) PRIMARY KEY, + binance VARCHAR(72) UNIQUE, + ); + INSERT INTO pair_map(pair, binance) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_map(pair, binance) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_map(pair, binance) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; """ val initDb = db.sql { sql } initDb // initialize the database - .then() - .subscribe() // execute + .then() + .subscribe() // execute } } From 9fcc9fdbe778a90d6bf377fe51544b66e67d2cf1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:28:54 +0430 Subject: [PATCH 02/11] Implement repositories --- .../port/api/postgres/dao/PairMapRepository.kt | 17 +++++++++++++++++ .../port/api/postgres/model/PairMapModel.kt | 12 ++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt create mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt new file mode 100644 index 000000000..0cb485821 --- /dev/null +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt @@ -0,0 +1,17 @@ +package co.nilin.opex.port.api.postgres.dao + +import co.nilin.opex.port.api.postgres.model.PairMapModel +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.query.Param +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface PairMapRepository : ReactiveCrudRepository { + + @Query("select * from pair_maps where pair=:pair") + fun findByPair(@Param("pair") pair: String): PairMapModel + + @Query("select * from pair_maps where map=:map") + fun findByMap(@Param("map") map: String): PairMapModel +} \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt new file mode 100644 index 000000000..eae1d4877 --- /dev/null +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.port.api.postgres.model + + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Column +import org.springframework.data.relational.core.mapping.Table + +@Table("pair_maps") +class PairMapModel( + @Id var pair: String?, + @Column("map") val map: String, +) \ No newline at end of file From 0f894239a15157c005924b5c5752f4eaa6263236 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:29:08 +0430 Subject: [PATCH 03/11] Fix table names --- .../co/nilin/opex/port/api/postgres/config/PostgresConfig.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index cb9d0e437..2abe07e27 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -53,9 +53,9 @@ class PostgresConfig(db: DatabaseClient) { taker_uuid VARCHAR(72) NOT NULL, create_date TIMESTAMP ); - CREATE TABLE IF NOT EXISTS pair_map ( + CREATE TABLE IF NOT EXISTS pair_maps ( pair VARCHAR(72) PRIMARY KEY, - binance VARCHAR(72) UNIQUE, + map VARCHAR(72) UNIQUE, ); INSERT INTO pair_map(pair, binance) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; INSERT INTO pair_map(pair, binance) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; From 94f4f0b2af306b121af70e5f22a120909647c8f9 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:34:24 +0430 Subject: [PATCH 04/11] Fix naming issue in insert commands --- .../nilin/opex/port/api/postgres/config/PostgresConfig.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index 2abe07e27..364c4cb7c 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -57,9 +57,9 @@ class PostgresConfig(db: DatabaseClient) { pair VARCHAR(72) PRIMARY KEY, map VARCHAR(72) UNIQUE, ); - INSERT INTO pair_map(pair, binance) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_map(pair, binance) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_map(pair, binance) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, binance) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, binance) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, binance) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; """ val initDb = db.sql { sql } initDb // initialize the database From a3ac80385d0a6fe4da7c62853fae014a35eaa131 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:35:16 +0430 Subject: [PATCH 05/11] Fix naming issue in insert commands again! --- .../nilin/opex/port/api/postgres/config/PostgresConfig.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index 364c4cb7c..7b075a715 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -57,9 +57,9 @@ class PostgresConfig(db: DatabaseClient) { pair VARCHAR(72) PRIMARY KEY, map VARCHAR(72) UNIQUE, ); - INSERT INTO pair_maps(pair, binance) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, binance) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, binance) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; """ val initDb = db.sql { sql } initDb // initialize the database From d4cc7bb23ec6fa4fdb234c088b5fbf1f18e92ca3 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 12:38:44 +0430 Subject: [PATCH 06/11] Add not null to map column --- .../nilin/opex/port/api/postgres/config/PostgresConfig.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index 7b075a715..60764c364 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -55,11 +55,11 @@ class PostgresConfig(db: DatabaseClient) { ); CREATE TABLE IF NOT EXISTS pair_maps ( pair VARCHAR(72) PRIMARY KEY, - map VARCHAR(72) UNIQUE, + map VARCHAR(72) UNIQUE NOT NULL, ); - INSERT INTO pair_maps(pair, map) values('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, map) values('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, map) values('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) VALUES('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) VALUES('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; + INSERT INTO pair_maps(pair, map) VALUES('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; """ val initDb = db.sql { sql } initDb // initialize the database From 5a309e651cdea92b976aba7622c2cd69d40a3763 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 14:41:33 +0430 Subject: [PATCH 07/11] Add symbol adapter --- .../nilin/opex/api/core/spi/SymbolAdapter.kt | 6 ++++ .../binance/controller/AccountController.kt | 29 ++++++++++++------- .../api/postgres/dao/PairMapRepository.kt | 5 ++-- .../api/postgres/impl/SymbolAdapterImpl.kt | 19 ++++++++++++ 4 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt create mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt new file mode 100644 index 000000000..7057dad0e --- /dev/null +++ b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt @@ -0,0 +1,6 @@ +package co.nilin.opex.api.core.spi + +interface SymbolAdapter { + suspend fun mapTo(pair: String?): String? + suspend fun mapFrom(map: String?): String? +} \ No newline at end of file diff --git a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt index 3658c829a..194a844f4 100644 --- a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt @@ -11,6 +11,7 @@ import co.nilin.opex.port.api.binance.util.asMatchConstraint import co.nilin.opex.port.api.binance.util.asMatchingOrderType import co.nilin.opex.port.api.binance.util.asOrderDirection import co.nilin.opex.api.core.inout.* +import co.nilin.opex.api.core.spi.SymbolAdapter import com.fasterxml.jackson.annotation.JsonInclude import io.swagger.annotations.* import kotlinx.coroutines.flow.Flow @@ -28,7 +29,8 @@ import java.util.* class AccountController( val queryHandler: UserQueryHandler, val matchingGatewayProxy: MEGatewayProxy, - val walletProxy: WalletProxy + val walletProxy: WalletProxy, + val symbolAdapter: SymbolAdapter ) { data class FillsData( @@ -156,9 +158,10 @@ class AccountController( timestamp: Long, @AuthenticationPrincipal auth: CustomAuthToken ): NewOrderResponse { + val pairSymbol = symbolAdapter.mapFrom(symbol)!! val request = MEGatewayProxy.CreateOrderRequest( auth.uuid, - symbol, + pairSymbol, price ?: BigDecimal.ZERO, // Maybe make this nullable as well? quantity ?: BigDecimal.ZERO, side.asOrderDirection(), @@ -168,7 +171,7 @@ class AccountController( matchingGatewayProxy.createNewOrder(request, auth.tokenValue) return NewOrderResponse( - symbol, + pairSymbol, -1, -1, null, @@ -220,11 +223,12 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): QueryOrderResponse { - val response = queryHandler.queryOrder(principal, QueryOrderRequest(symbol, orderId, origClientOrderId)) + val pairSymbol = symbolAdapter.mapFrom(symbol)!! + val response = queryHandler.queryOrder(principal, QueryOrderRequest(pairSymbol, orderId, origClientOrderId)) if (response == null) throw IllegalArgumentException("no order found") return QueryOrderResponse( - response.symbol, + symbolAdapter.mapFrom(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -278,10 +282,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - return queryHandler.openOrders(principal, symbol) + val pairSymbol = symbolAdapter.mapFrom(symbol) + return queryHandler.openOrders(principal, pairSymbol) .map { response -> QueryOrderResponse( - response.symbol, + symbolAdapter.mapFrom(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -340,10 +345,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - return queryHandler.allOrders(principal, AllOrderRequest(symbol, startTime, endTime, limit)) + val pairSymbol = symbolAdapter.mapFrom(symbol) + return queryHandler.allOrders(principal, AllOrderRequest(pairSymbol, startTime, endTime, limit)) .map { response -> QueryOrderResponse( - response.symbol, + symbolAdapter.mapFrom(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -406,10 +412,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - return queryHandler.allTrades(principal, TradeRequest(symbol, fromId, startTime, endTime, limit)) + val pairSymbol = symbolAdapter.mapFrom(symbol) + return queryHandler.allTrades(principal, TradeRequest(pairSymbol, fromId, startTime, endTime, limit)) .map { response -> TradeResponse( - response.symbol, response.id, + symbolAdapter.mapFrom(response.symbol)!!, response.id, response.orderId, -1, response.price, response.qty, response.quoteQty, response.commission, response.commissionAsset, response.time, response.isBuyer, response.isMaker, response.isBestMatch diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt index 0cb485821..9bac439d2 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt @@ -5,13 +5,14 @@ import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.query.Param import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository +import reactor.core.publisher.Mono @Repository interface PairMapRepository : ReactiveCrudRepository { @Query("select * from pair_maps where pair=:pair") - fun findByPair(@Param("pair") pair: String): PairMapModel + fun findByPair(@Param("pair") pair: String): Mono @Query("select * from pair_maps where map=:map") - fun findByMap(@Param("map") map: String): PairMapModel + fun findByMap(@Param("map") map: String): Mono } \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt new file mode 100644 index 000000000..894fff56b --- /dev/null +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt @@ -0,0 +1,19 @@ +package co.nilin.opex.port.api.postgres.impl + +import co.nilin.opex.api.core.spi.SymbolAdapter +import co.nilin.opex.port.api.postgres.dao.PairMapRepository +import kotlinx.coroutines.reactive.awaitFirstOrNull +import org.springframework.stereotype.Component + +@Component +class SymbolAdapterImpl(val pairMapRepository: PairMapRepository) : SymbolAdapter { + override suspend fun mapTo(pair: String?): String? { + if (pair == null) return null + return pairMapRepository.findByPair(pair).awaitFirstOrNull()?.map + } + + override suspend fun mapFrom(map: String?): String? { + if (map == null) return null + return pairMapRepository.findByMap(map).awaitFirstOrNull()?.pair + } +} \ No newline at end of file From 1ca761e2055802ed0f92b2b3f0077f94bea0b20f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 17:21:50 +0430 Subject: [PATCH 08/11] Fix sql syntax errors --- .../opex/port/api/binance/controller/AccountController.kt | 1 - .../co/nilin/opex/port/api/postgres/config/PostgresConfig.kt | 2 +- .../co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt | 4 ++-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt index 1548fde67..3ed02e1e6 100644 --- a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt @@ -10,7 +10,6 @@ import co.nilin.opex.port.api.binance.util.BalanceParser import co.nilin.opex.port.api.binance.util.asMatchConstraint import co.nilin.opex.port.api.binance.util.asMatchingOrderType import co.nilin.opex.port.api.binance.util.asOrderDirection -import co.nilin.opex.api.core.inout.* import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException import co.nilin.opex.api.core.spi.SymbolAdapter diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index 60764c364..63061323d 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -55,7 +55,7 @@ class PostgresConfig(db: DatabaseClient) { ); CREATE TABLE IF NOT EXISTS pair_maps ( pair VARCHAR(72) PRIMARY KEY, - map VARCHAR(72) UNIQUE NOT NULL, + map VARCHAR(72) UNIQUE NOT NULL ); INSERT INTO pair_maps(pair, map) VALUES('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; INSERT INTO pair_maps(pair, map) VALUES('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt index 9bac439d2..efca5ec81 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt @@ -10,9 +10,9 @@ import reactor.core.publisher.Mono @Repository interface PairMapRepository : ReactiveCrudRepository { - @Query("select * from pair_maps where pair=:pair") + @Query("select * from pair_maps where pair = :pair") fun findByPair(@Param("pair") pair: String): Mono - @Query("select * from pair_maps where map=:map") + @Query("select * from pair_maps where map = :map") fun findByMap(@Param("map") map: String): Mono } \ No newline at end of file From 3b271fa128792cafe03408989fb289a0ff0d955a Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 21 Aug 2021 17:47:09 +0430 Subject: [PATCH 09/11] Fix return symbol in create order --- .../nilin/opex/port/api/binance/controller/AccountController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt index 3ed02e1e6..e08fa2d8d 100644 --- a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt @@ -172,7 +172,7 @@ class AccountController( matchingGatewayProxy.createNewOrder(request, auth.tokenValue) return NewOrderResponse( - pairSymbol, + symbol, -1, -1, null, From dfabd5290232024a0d83b540e3481cca8ccc60d8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 22 Aug 2021 08:29:43 +0430 Subject: [PATCH 10/11] Improve name conventions --- .../nilin/opex/api/core/spi/SymbolAdapter.kt | 6 ---- .../nilin/opex/api/core/spi/SymbolMapper.kt | 6 ++++ .../binance/controller/AccountController.kt | 33 +++++++++---------- .../api/postgres/config/PostgresConfig.kt | 12 +++---- .../api/postgres/dao/PairMapRepository.kt | 18 ---------- .../api/postgres/dao/SymbolMapRepository.kt | 18 ++++++++++ .../api/postgres/impl/SymbolAdapterImpl.kt | 19 ----------- .../api/postgres/impl/SymbolMapperImpl.kt | 19 +++++++++++ .../{PairMapModel.kt => SymbolMapModel.kt} | 8 ++--- 9 files changed, 69 insertions(+), 70 deletions(-) delete mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt create mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolMapper.kt delete mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt create mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt delete mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt create mode 100644 Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt rename Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/{PairMapModel.kt => SymbolMapModel.kt} (66%) diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt deleted file mode 100644 index 7057dad0e..000000000 --- a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolAdapter.kt +++ /dev/null @@ -1,6 +0,0 @@ -package co.nilin.opex.api.core.spi - -interface SymbolAdapter { - suspend fun mapTo(pair: String?): String? - suspend fun mapFrom(map: String?): String? -} \ No newline at end of file diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolMapper.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolMapper.kt new file mode 100644 index 000000000..e1117590f --- /dev/null +++ b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/SymbolMapper.kt @@ -0,0 +1,6 @@ +package co.nilin.opex.api.core.spi + +interface SymbolMapper { + suspend fun map(symbol: String?): String? + suspend fun unmap(value: String?): String? +} \ No newline at end of file diff --git a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt index e08fa2d8d..bcc7f623e 100644 --- a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/AccountController.kt @@ -12,7 +12,7 @@ import co.nilin.opex.port.api.binance.util.asMatchingOrderType import co.nilin.opex.port.api.binance.util.asOrderDirection import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException -import co.nilin.opex.api.core.spi.SymbolAdapter +import co.nilin.opex.api.core.spi.SymbolMapper import com.fasterxml.jackson.annotation.JsonInclude import io.swagger.annotations.* import kotlinx.coroutines.flow.Flow @@ -31,7 +31,7 @@ class AccountController( val queryHandler: UserQueryHandler, val matchingGatewayProxy: MEGatewayProxy, val walletProxy: WalletProxy, - val symbolAdapter: SymbolAdapter + val symbolMapper: SymbolMapper ) { data class FillsData( @@ -159,17 +159,16 @@ class AccountController( timestamp: Long, @AuthenticationPrincipal auth: CustomAuthToken ): NewOrderResponse { - val pairSymbol = symbolAdapter.mapFrom(symbol)!! + val internalSymbol = symbolMapper.unmap(symbol)!! val request = MEGatewayProxy.CreateOrderRequest( auth.uuid, - pairSymbol, + internalSymbol, price ?: BigDecimal.ZERO, // Maybe make this nullable as well? quantity ?: BigDecimal.ZERO, side.asOrderDirection(), timeInForce?.asMatchConstraint(), type.asMatchingOrderType() ) - matchingGatewayProxy.createNewOrder(request, auth.tokenValue) return NewOrderResponse( symbol, @@ -224,11 +223,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): QueryOrderResponse { - val pairSymbol = symbolAdapter.mapFrom(symbol)!! - val response = queryHandler.queryOrder(principal, QueryOrderRequest(pairSymbol, orderId, origClientOrderId)) + val internalSymbol = symbolMapper.unmap(symbol)!! + val response = queryHandler.queryOrder(principal, QueryOrderRequest(internalSymbol, orderId, origClientOrderId)) ?: throw OpexException(OpexError.OrderNotFound) return QueryOrderResponse( - symbolAdapter.mapFrom(response.symbol)!!, + symbolMapper.map(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -282,11 +281,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - val pairSymbol = symbolAdapter.mapFrom(symbol) - return queryHandler.openOrders(principal, pairSymbol) + val internalSymbol = symbolMapper.unmap(symbol) + return queryHandler.openOrders(principal, internalSymbol) .map { response -> QueryOrderResponse( - symbolAdapter.mapFrom(response.symbol)!!, + symbolMapper.map(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -345,11 +344,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - val pairSymbol = symbolAdapter.mapFrom(symbol) - return queryHandler.allOrders(principal, AllOrderRequest(pairSymbol, startTime, endTime, limit)) + val internalSymbol = symbolMapper.unmap(symbol) + return queryHandler.allOrders(principal, AllOrderRequest(internalSymbol, startTime, endTime, limit)) .map { response -> QueryOrderResponse( - symbolAdapter.mapFrom(response.symbol)!!, + symbolMapper.map(response.symbol)!!, response.orderId, response.orderListId, response.clientOrderId, @@ -412,11 +411,11 @@ class AccountController( @RequestParam(name = "timestamp") timestamp: Long ): Flow { - val pairSymbol = symbolAdapter.mapFrom(symbol) - return queryHandler.allTrades(principal, TradeRequest(pairSymbol, fromId, startTime, endTime, limit)) + val internalSymbol = symbolMapper.unmap(symbol) + return queryHandler.allTrades(principal, TradeRequest(internalSymbol, fromId, startTime, endTime, limit)) .map { response -> TradeResponse( - symbolAdapter.mapFrom(response.symbol)!!, response.id, + symbolMapper.map(response.symbol)!!, response.id, response.orderId, -1, response.price, response.qty, response.quoteQty, response.commission, response.commissionAsset, response.time, response.isBuyer, response.isMaker, response.isBestMatch diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt index 63061323d..c88b8f921 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/config/PostgresConfig.kt @@ -53,13 +53,13 @@ class PostgresConfig(db: DatabaseClient) { taker_uuid VARCHAR(72) NOT NULL, create_date TIMESTAMP ); - CREATE TABLE IF NOT EXISTS pair_maps ( - pair VARCHAR(72) PRIMARY KEY, - map VARCHAR(72) UNIQUE NOT NULL + CREATE TABLE IF NOT EXISTS symbol_maps ( + symbol VARCHAR(72) PRIMARY KEY, + value VARCHAR(72) UNIQUE NOT NULL ); - INSERT INTO pair_maps(pair, map) VALUES('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, map) VALUES('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; - INSERT INTO pair_maps(pair, map) VALUES('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; + INSERT INTO symbol_maps(symbol, value) VALUES('btc_usdt', 'BTCUSDT') ON CONFLICT DO NOTHING; + INSERT INTO symbol_maps(symbol, value) VALUES('eth_usdt', 'ETHUSDT') ON CONFLICT DO NOTHING; + INSERT INTO symbol_maps(symbol, value) VALUES('eth_btc', 'ETHBTC') ON CONFLICT DO NOTHING; """ val initDb = db.sql { sql } initDb // initialize the database diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt deleted file mode 100644 index efca5ec81..000000000 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/PairMapRepository.kt +++ /dev/null @@ -1,18 +0,0 @@ -package co.nilin.opex.port.api.postgres.dao - -import co.nilin.opex.port.api.postgres.model.PairMapModel -import org.springframework.data.r2dbc.repository.Query -import org.springframework.data.repository.query.Param -import org.springframework.data.repository.reactive.ReactiveCrudRepository -import org.springframework.stereotype.Repository -import reactor.core.publisher.Mono - -@Repository -interface PairMapRepository : ReactiveCrudRepository { - - @Query("select * from pair_maps where pair = :pair") - fun findByPair(@Param("pair") pair: String): Mono - - @Query("select * from pair_maps where map = :map") - fun findByMap(@Param("map") map: String): Mono -} \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt new file mode 100644 index 000000000..f1fc16837 --- /dev/null +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt @@ -0,0 +1,18 @@ +package co.nilin.opex.port.api.postgres.dao + +import co.nilin.opex.port.api.postgres.model.SymbolMapModel +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.query.Param +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository +import reactor.core.publisher.Mono + +@Repository +interface SymbolMapRepository : ReactiveCrudRepository { + + @Query("select * from symbol_maps where symbol = :symbol") + fun findBySymbol(@Param("symbol") symbol: String): Mono + + @Query("select * from symbol_maps where value = :value") + fun findByMapValue(@Param("value") value: String): Mono +} \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt deleted file mode 100644 index 894fff56b..000000000 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolAdapterImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package co.nilin.opex.port.api.postgres.impl - -import co.nilin.opex.api.core.spi.SymbolAdapter -import co.nilin.opex.port.api.postgres.dao.PairMapRepository -import kotlinx.coroutines.reactive.awaitFirstOrNull -import org.springframework.stereotype.Component - -@Component -class SymbolAdapterImpl(val pairMapRepository: PairMapRepository) : SymbolAdapter { - override suspend fun mapTo(pair: String?): String? { - if (pair == null) return null - return pairMapRepository.findByPair(pair).awaitFirstOrNull()?.map - } - - override suspend fun mapFrom(map: String?): String? { - if (map == null) return null - return pairMapRepository.findByMap(map).awaitFirstOrNull()?.pair - } -} \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt new file mode 100644 index 000000000..2844c8ce5 --- /dev/null +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt @@ -0,0 +1,19 @@ +package co.nilin.opex.port.api.postgres.impl + +import co.nilin.opex.api.core.spi.SymbolMapper +import co.nilin.opex.port.api.postgres.dao.SymbolMapRepository +import kotlinx.coroutines.reactive.awaitFirstOrNull +import org.springframework.stereotype.Component + +@Component +class SymbolMapperImpl(val symbolMapRepository: SymbolMapRepository) : SymbolMapper { + override suspend fun map(symbol: String?): String? { + if (symbol == null) return null + return symbolMapRepository.findBySymbol(symbol).awaitFirstOrNull()?.value + } + + override suspend fun unmap(value: String?): String? { + if (value == null) return null + return symbolMapRepository.findByMapValue(value).awaitFirstOrNull()?.symbol + } +} \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/SymbolMapModel.kt similarity index 66% rename from Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt rename to Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/SymbolMapModel.kt index eae1d4877..d43ee4e63 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/PairMapModel.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/model/SymbolMapModel.kt @@ -5,8 +5,8 @@ import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Column import org.springframework.data.relational.core.mapping.Table -@Table("pair_maps") -class PairMapModel( - @Id var pair: String?, - @Column("map") val map: String, +@Table("symbol_maps") +class SymbolMapModel( + @Id val symbol: String, + @Column("value") val value: String, ) \ No newline at end of file From 4321ad8bd23f419c72e50e515cd3315f3c6474bb Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 22 Aug 2021 08:32:13 +0430 Subject: [PATCH 11/11] Fix symbol map repository function name --- .../co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt | 2 +- .../co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt index f1fc16837..8c377a94f 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/dao/SymbolMapRepository.kt @@ -14,5 +14,5 @@ interface SymbolMapRepository : ReactiveCrudRepository { fun findBySymbol(@Param("symbol") symbol: String): Mono @Query("select * from symbol_maps where value = :value") - fun findByMapValue(@Param("value") value: String): Mono + fun findByValue(@Param("value") value: String): Mono } \ No newline at end of file diff --git a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt index 2844c8ce5..e252214a4 100644 --- a/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt +++ b/Api/api-ports/api-persister-postgres/src/main/kotlin/co/nilin/opex/port/api/postgres/impl/SymbolMapperImpl.kt @@ -14,6 +14,6 @@ class SymbolMapperImpl(val symbolMapRepository: SymbolMapRepository) : SymbolMap override suspend fun unmap(value: String?): String? { if (value == null) return null - return symbolMapRepository.findByMapValue(value).awaitFirstOrNull()?.symbol + return symbolMapRepository.findByValue(value).awaitFirstOrNull()?.symbol } } \ No newline at end of file