Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Api/api-app/src/main/resources/application-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package co.nilin.opex.api.core.inout

data class AssignResponse(
val addresses: List<AssignedAddress>
)
Original file line number Diff line number Diff line change
@@ -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<AddressType>, val endpoints: List<Endpoint>)
data class AssignedAddress(
val uuid: String,
val address: String,
val memo: String?,
val type: AddressType,
val chains: MutableList<Chain>
)
Original file line number Diff line number Diff line change
@@ -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

}
Original file line number Diff line number Diff line change
@@ -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, "", "")
}

}
Original file line number Diff line number Diff line change
@@ -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,
)
Original file line number Diff line number Diff line change
@@ -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 <reified T : Any?> typeRef(): ParameterizedTypeReference<T> =
object : ParameterizedTypeReference<T>() {}

@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<AssignResponse>())
.awaitSingleOrNull()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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? {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand Down
5 changes: 5 additions & 0 deletions Deployment/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}