From 36ba29aad634cb3a25ea8ed48033685aa1b1baa6 Mon Sep 17 00:00:00 2001 From: Peyman Date: Tue, 19 Oct 2021 17:07:22 +0330 Subject: [PATCH] close #114: assign address api --- .../src/main/resources/application-docker.yml | 2 + .../opex/api/core/inout/AssignResponse.kt | 5 +++ .../opex/api/core/inout/AssignedAddress.kt | 12 ++++++ .../api/core/spi/BlockchainGatewayProxy.kt | 9 ++++ .../binance/controller/WalletController.kt | 32 ++++++++++++++ .../api/binance/data/AssignAddressResponse.kt | 8 ++++ .../proxy/BlockchainGatewayProxyImpl.kt | 43 +++++++++++++++++++ .../impl/AssignedAddressHandlerImpl.kt | 22 ++++++---- .../postgres/model/AddressTypeModel.kt | 3 +- Deployment/nginx.conf | 5 +++ 10 files changed, 131 insertions(+), 10 deletions(-) create mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignResponse.kt create mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignedAddress.kt create mode 100644 Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/BlockchainGatewayProxy.kt create mode 100644 Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/WalletController.kt create mode 100644 Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/data/AssignAddressResponse.kt create mode 100644 Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/proxy/BlockchainGatewayProxyImpl.kt diff --git a/Api/api-app/src/main/resources/application-docker.yml b/Api/api-app/src/main/resources/application-docker.yml index f87b32140..a09ea2e3b 100644 --- a/Api/api-app/src/main/resources/application-docker.yml +++ b/Api/api-app/src/main/resources/application-docker.yml @@ -24,5 +24,7 @@ app: url: lb://opex-gateway wallet: url: lb://opex-wallet + opex-bc-gateway: + url: lb://opex-bc-gateway auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignResponse.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignResponse.kt new file mode 100644 index 000000000..c2d6f6534 --- /dev/null +++ b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignResponse.kt @@ -0,0 +1,5 @@ +package co.nilin.opex.api.core.inout + +data class AssignResponse( + val addresses: List +) \ No newline at end of file diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignedAddress.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignedAddress.kt new file mode 100644 index 000000000..1744ded89 --- /dev/null +++ b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/inout/AssignedAddress.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.api.core.inout + +data class Endpoint(val url: String) +data class AddressType(val id: Long, val type: String, val addressRegex: String, val memoRegex: String) +data class Chain(val name: String, val addressTypes: List, val endpoints: List) +data class AssignedAddress( + val uuid: String, + val address: String, + val memo: String?, + val type: AddressType, + val chains: MutableList +) diff --git a/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/BlockchainGatewayProxy.kt b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/BlockchainGatewayProxy.kt new file mode 100644 index 000000000..2f3edb4f3 --- /dev/null +++ b/Api/api-core/src/main/kotlin/co/nilin/opex/api/core/spi/BlockchainGatewayProxy.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.api.core.spi + +import co.nilin.opex.api.core.inout.AssignResponse + +interface BlockchainGatewayProxy { + + suspend fun assignAddress(uuid: String, currency: String): AssignResponse + +} \ 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/WalletController.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/WalletController.kt new file mode 100644 index 000000000..32c2bf4b0 --- /dev/null +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/controller/WalletController.kt @@ -0,0 +1,32 @@ +package co.nilin.opex.port.api.binance.controller + +import co.nilin.opex.api.core.spi.BlockchainGatewayProxy +import co.nilin.opex.port.api.binance.data.AssignAddressResponse +import co.nilin.opex.port.api.binance.util.jwtAuthentication +import org.springframework.security.core.annotation.CurrentSecurityContext +import org.springframework.security.core.context.SecurityContext +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +class WalletController(private val bcGatewayProxy: BlockchainGatewayProxy) { + + @GetMapping("/v1/capital/deposit/address") + suspend fun assignAddress( + @RequestParam("coin") + coin: String, + @RequestParam("network", required = false) + network: String, + @RequestParam(name = "recvWindow", required = false) + recvWindow: Long?, //The value cannot be greater than 60000 + @RequestParam(name = "timestamp") + timestamp: Long, + @CurrentSecurityContext securityContext: SecurityContext + ): AssignAddressResponse { + val response = bcGatewayProxy.assignAddress(securityContext.jwtAuthentication().name, coin) + val address = if (response.addresses.isNotEmpty()) response.addresses[0] else null + return AssignAddressResponse(address?.address ?: "", coin, "", "") + } + +} \ No newline at end of file diff --git a/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/data/AssignAddressResponse.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/data/AssignAddressResponse.kt new file mode 100644 index 000000000..d82d7207f --- /dev/null +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/data/AssignAddressResponse.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.port.api.binance.data + +data class AssignAddressResponse( + val address: String, + val coin: String, + val tag: String, + val url: 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/proxy/BlockchainGatewayProxyImpl.kt b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/proxy/BlockchainGatewayProxyImpl.kt new file mode 100644 index 000000000..64551b92b --- /dev/null +++ b/Api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/port/api/binance/proxy/BlockchainGatewayProxyImpl.kt @@ -0,0 +1,43 @@ +package co.nilin.opex.port.api.binance.proxy + +import co.nilin.opex.api.core.inout.AssignResponse +import co.nilin.opex.api.core.spi.BlockchainGatewayProxy +import co.nilin.opex.port.api.binance.util.LoggerDelegate +import kotlinx.coroutines.reactive.awaitSingleOrNull +import org.springframework.beans.factory.annotation.Value +import org.springframework.core.ParameterizedTypeReference +import org.springframework.http.MediaType +import org.springframework.stereotype.Component +import org.springframework.web.reactive.function.client.WebClient +import org.springframework.web.reactive.function.client.body +import reactor.core.publisher.Mono +import java.net.URI + +private inline fun typeRef(): ParameterizedTypeReference = + object : ParameterizedTypeReference() {} + +@Component +class BlockchainGatewayProxyImpl(private val client: WebClient) : BlockchainGatewayProxy { + + private data class AssignAddressRequest( + val uuid: String, val currency: String + ) + + private val logger by LoggerDelegate() + + @Value("\${app.opex-bc-gateway.url}") + private lateinit var baseUrl: String + + override suspend fun assignAddress(uuid: String, currency: String): AssignResponse { + logger.info("calling bc-gateway assign") + return client.post() + .uri(URI.create("$baseUrl/deposits/assign")) + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .body(Mono.just(AssignAddressRequest(uuid, currency))) + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono(typeRef()) + .awaitSingleOrNull() + } +} \ No newline at end of file diff --git a/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/impl/AssignedAddressHandlerImpl.kt b/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/impl/AssignedAddressHandlerImpl.kt index 1e7695999..615797256 100644 --- a/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/impl/AssignedAddressHandlerImpl.kt +++ b/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/impl/AssignedAddressHandlerImpl.kt @@ -44,15 +44,19 @@ class AssignedAddressHandlerImpl( } override suspend fun persist(assignedAddress: AssignedAddress) { - assignedAddressRepository.save( - AssignedAddressModel( - null, - assignedAddress.uuid, - assignedAddress.address, - assignedAddress.memo, - assignedAddress.type.id - ) - ).awaitFirst() + try { + assignedAddressRepository.save( + AssignedAddressModel( + null, + assignedAddress.uuid, + assignedAddress.address, + assignedAddress.memo, + assignedAddress.type.id + ) + ).awaitFirst() + } catch (e: Exception) { + + } } override suspend fun findUuid(address: String, memo: String?): String? { diff --git a/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/model/AddressTypeModel.kt b/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/model/AddressTypeModel.kt index fc1995fe5..14d1d330f 100644 --- a/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/model/AddressTypeModel.kt +++ b/BlockchainGateway/bc-gateway-ports/bc-persister-postgres/src/main/kotlin/co/nilin/opex/port/bcgateway/postgres/model/AddressTypeModel.kt @@ -1,11 +1,12 @@ package co.nilin.opex.port.bcgateway.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("address_types") data class AddressTypeModel( - val id: Long?, + @Id val id: Long?, @Column("address_type") val type: String, @Column("address_regex") val addressRegex: String, @Column("memo_regex") val memoRegex: String diff --git a/Deployment/nginx.conf b/Deployment/nginx.conf index a76049f65..e5a94cc6e 100644 --- a/Deployment/nginx.conf +++ b/Deployment/nginx.conf @@ -57,5 +57,10 @@ http { proxy_pass http://docker-api; rewrite ^/api(.*)$ $1 break; } + + location /sapi { + proxy_pass http://docker-api; + rewrite ^/sapi(.*)$ $1 break; + } } }