diff --git a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ProfileController.kt b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ProfileController.kt index 6ee993593..1939a55d9 100644 --- a/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ProfileController.kt +++ b/api/api-ports/api-opex-rest/src/main/kotlin/co/nilin/opex/api/ports/opex/controller/ProfileController.kt @@ -128,7 +128,7 @@ Security: Bearer user-token required. Requires authenticated user JWT. return profileProxy.requestContactUpdate(securityContext.jwtAuthentication().tokenValue(), request) } - @PatchMapping("/contact/update/otp-verification") + @PostMapping("/contact/update/otp-verification") @Operation( summary = "Confirm contact update", description = """PATCH /opex/v1/profile/contact/update/otp-verification. diff --git a/market/market-app/src/main/kotlin/co/nilin/opex/market/app/config/SecurityConfig.kt b/market/market-app/src/main/kotlin/co/nilin/opex/market/app/config/SecurityConfig.kt index 0f2132e1a..5ff1278c8 100644 --- a/market/market-app/src/main/kotlin/co/nilin/opex/market/app/config/SecurityConfig.kt +++ b/market/market-app/src/main/kotlin/co/nilin/opex/market/app/config/SecurityConfig.kt @@ -28,6 +28,7 @@ class SecurityConfig(private val webClient: WebClient) { .authorizeExchange() { it.pathMatchers(HttpMethod.GET, "/v1/admin/**").hasAnyAuthority("ROLE_monitoring", "ROLE_admin") .pathMatchers("/actuator/**").permitAll() + .pathMatchers("/v1/user/*/orders/open").permitAll() .pathMatchers("/v1/user/**").authenticated() .anyExchange().permitAll() } diff --git a/market/market-app/src/main/kotlin/co/nilin/opex/market/app/controller/UserDataController.kt b/market/market-app/src/main/kotlin/co/nilin/opex/market/app/controller/UserDataController.kt index 911200e69..538713e2d 100644 --- a/market/market-app/src/main/kotlin/co/nilin/opex/market/app/controller/UserDataController.kt +++ b/market/market-app/src/main/kotlin/co/nilin/opex/market/app/controller/UserDataController.kt @@ -32,11 +32,12 @@ class UserDataController( ?: throw OpexError.NotFound.exception() } - @GetMapping("/orders/open") + //todo should be authenticated as soon as possible + @GetMapping("/{uuid}/orders/open") suspend fun getUserOpenOrders( - @RequestParam limit: Int, @CurrentSecurityContext securityContext: SecurityContext, + @RequestParam limit: Int, @PathVariable uuid: String, ): List { - return userQueryHandler.openOrders(securityContext.authentication.name, limit) + return userQueryHandler.openOrders(uuid, limit) } @GetMapping("/orders/{symbol}/open") diff --git a/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/Trade.kt b/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/Trade.kt index 89ab64eef..7a899cefb 100644 --- a/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/Trade.kt +++ b/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/Trade.kt @@ -2,13 +2,12 @@ package co.nilin.opex.market.core.inout import java.math.BigDecimal import java.time.LocalDateTime -import java.util.* // User trade data data class Trade( val symbol: String, val id: Long, - val ouid: String, + val ouid: String? = null, val price: BigDecimal, val quantity: BigDecimal, val quoteQuantity: BigDecimal, diff --git a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/dao/TradeRepository.kt b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/dao/TradeRepository.kt index 41a32fb4c..c0eacbe01 100644 --- a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/dao/TradeRepository.kt +++ b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/dao/TradeRepository.kt @@ -1,6 +1,8 @@ package co.nilin.opex.market.ports.postgres.dao import co.nilin.opex.market.core.inout.* +import co.nilin.opex.market.ports.postgres.data.MarketTradeProjection +import co.nilin.opex.market.ports.postgres.data.TradeUserContextProjection import co.nilin.opex.market.ports.postgres.model.* import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.query.Param @@ -32,9 +34,8 @@ interface TradeRepository : ReactiveCrudRepository { """ SELECT t.symbol AS symbol, - t.base_asset AS baseAsset, - t.quote_asset AS quoteAsset, - + t.base_asset AS base_asset, + t.quote_asset AS quote_asset, t.trade_id AS id, t.matched_price AS price, t.matched_quantity AS quantity, @@ -46,24 +47,15 @@ interface TradeRepository : ReactiveCrudRepository { ELSE to2.quote_quantity END, 0 - ) AS quoteQuantity, + ) AS quote_quantity, - t.create_date AS createDate, + t.create_date AS create_date, - COALESCE( - CASE - WHEN mo.side = 'BID' - THEN TRUE - ELSE FALSE - END, - FALSE - ) AS isMakerBuyer, - - NULL AS ouid, - NULL AS commission, - NULL AS commissionAsset, - NULL AS isBuyer, - NULL AS isMaker + CASE + WHEN mo.side = 'BID' + THEN TRUE + ELSE FALSE + END AS is_maker_buyer FROM trades t @@ -80,12 +72,9 @@ interface TradeRepository : ReactiveCrudRepository { """ ) fun findRecentMarketTrades( - @Param("symbol") - symbol: String?, - - @Param("limit") - limit: Int - ): Flux + @Param("symbol") symbol: String?, + @Param("limit") limit: Int + ): Flux @Query(""" diff --git a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/MarketTradeProjection.kt b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/MarketTradeProjection.kt new file mode 100644 index 000000000..f24cc5c63 --- /dev/null +++ b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/MarketTradeProjection.kt @@ -0,0 +1,16 @@ +package co.nilin.opex.market.ports.postgres.data + +import java.math.BigDecimal +import java.time.LocalDateTime + +data class MarketTradeProjection( + val symbol: String, + val baseAsset: String, + val quoteAsset: String, + val id: Long, + val price: BigDecimal, + val quantity: BigDecimal, + val quoteQuantity: BigDecimal, + val createDate: LocalDateTime, + val isMakerBuyer: Boolean +) \ No newline at end of file diff --git a/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/TradeUserContextProjection.kt b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/TradeUserContextProjection.kt similarity index 91% rename from market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/TradeUserContextProjection.kt rename to market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/TradeUserContextProjection.kt index 53aab72fe..5ff2a61a5 100644 --- a/market/market-core/src/main/kotlin/co/nilin/opex/market/core/inout/TradeUserContextProjection.kt +++ b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/data/TradeUserContextProjection.kt @@ -1,4 +1,4 @@ -package co.nilin.opex.market.core.inout +package co.nilin.opex.market.ports.postgres.data import java.math.BigDecimal import java.time.LocalDateTime @@ -18,5 +18,4 @@ data class TradeUserContextProjection( val commissionAsset: String? = null, val isBuyer: Boolean? = null, val isMaker: Boolean? = null -) - +) \ No newline at end of file diff --git a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerImpl.kt b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerImpl.kt index 6ec4b0c27..fe8673002 100644 --- a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerImpl.kt +++ b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerImpl.kt @@ -89,8 +89,8 @@ class MarketQueryHandlerImpl( .map { MarketTrade( symbol = it.symbol, - baseAsset = it.baseAsset!!, - quoteAsset = it.quoteAsset!!, + baseAsset = it.baseAsset, + quoteAsset = it.quoteAsset, id = it.id, price = it.price, quantity = it.quantity, diff --git a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/UserQueryHandlerImpl.kt b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/UserQueryHandlerImpl.kt index 7ac27a5e6..2af1e9417 100644 --- a/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/UserQueryHandlerImpl.kt +++ b/market/market-ports/market-persister-postgres/src/main/kotlin/co/nilin/opex/market/ports/postgres/impl/UserQueryHandlerImpl.kt @@ -101,7 +101,7 @@ class UserQueryHandlerImpl( Trade( it.symbol, it.id, - requireNotNull(it.ouid), + it.ouid, it.price, it.quantity, it.quoteQuantity, diff --git a/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerTest.kt b/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerTest.kt index b496540d6..bb25377ae 100644 --- a/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerTest.kt +++ b/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/MarketQueryHandlerTest.kt @@ -116,7 +116,7 @@ class MarketQueryHandlerTest { } returns Flux.just(VALID.TRADE_MODEL) every { tradeRepository.findRecentMarketTrades(VALID.ETH_USDT, 1) - } returns Flux.just(VALID.TRADE_USER_CONTEXT) + } returns Flux.just(VALID.MARKET_TRADE) every { orderRepository.findByOuid(VALID.TRADE_MODEL.makerOuid) } returns Mono.just(VALID.MAKER_ORDER_MODEL) diff --git a/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/sample/Samples.kt b/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/sample/Samples.kt index 1556b0d10..0eca09735 100644 --- a/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/sample/Samples.kt +++ b/market/market-ports/market-persister-postgres/src/test/kotlin/co/nilin/opex/market/ports/postgres/impl/sample/Samples.kt @@ -4,6 +4,8 @@ import co.nilin.opex.market.core.event.RichOrder import co.nilin.opex.market.core.event.RichOrderUpdate import co.nilin.opex.market.core.event.RichTrade import co.nilin.opex.market.core.inout.* +import co.nilin.opex.market.ports.postgres.data.MarketTradeProjection +import co.nilin.opex.market.ports.postgres.data.TradeUserContextProjection import co.nilin.opex.market.ports.postgres.model.LastPrice import co.nilin.opex.market.ports.postgres.model.OrderModel import co.nilin.opex.market.ports.postgres.model.OrderStatusModel @@ -126,6 +128,19 @@ object VALID { true ) + val MARKET_TRADE = MarketTradeProjection( + ETH_USDT, + "ETH", + "USDT", + 1, + BigDecimal.valueOf(100000), + BigDecimal.valueOf(0.001), // Minimum of orders quantities + BigDecimal.valueOf(100).stripTrailingZeros(), + UPDATE_DATE, + false, + + ) + val LAST_PRICE_MODEL = LastPrice("ETH_USDT", BigDecimal.valueOf(100000)) val AGGREGATED_ORDER_PRICE_MODEL = AggregatedOrderPriceModel( diff --git a/profile/profile-app/src/main/kotlin/co/nilin/opex/profile/app/controller/ProfileController.kt b/profile/profile-app/src/main/kotlin/co/nilin/opex/profile/app/controller/ProfileController.kt index 2b0513676..864a5b680 100644 --- a/profile/profile-app/src/main/kotlin/co/nilin/opex/profile/app/controller/ProfileController.kt +++ b/profile/profile-app/src/main/kotlin/co/nilin/opex/profile/app/controller/ProfileController.kt @@ -49,7 +49,7 @@ class ProfileController( } } - @PatchMapping("/contact/update/otp-verification") + @PostMapping("/contact/update/otp-verification") suspend fun confirmContactUpdate( @RequestBody request: ContactUpdateConfirmRequest, @CurrentSecurityContext securityContext: SecurityContext