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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ target/
### Other files ###
.env
docker-compose.local.yml
docker-compose.legacy.yml
application-local.yml
mvnw
mvnw.cmd
Expand Down
Original file line number Diff line number Diff line change
@@ -1,141 +1,135 @@
package co.nilin.opex.accountant.app.config

import co.nilin.opex.accountant.app.listener.AccountantEventListener
import co.nilin.opex.accountant.app.listener.AccountantTempEventListener
import co.nilin.opex.accountant.app.listener.AccountantTradeListener
import co.nilin.opex.accountant.app.listener.OrderListener
import co.nilin.opex.accountant.core.api.FinancialActionJobManager
import co.nilin.opex.accountant.core.api.OrderManager
import co.nilin.opex.accountant.core.api.TradeManager
import co.nilin.opex.accountant.core.service.FinancialActionJobManagerImpl
import co.nilin.opex.accountant.core.service.OrderManagerImpl
import co.nilin.opex.accountant.core.service.TradeManagerImpl
import co.nilin.opex.accountant.core.spi.*
import co.nilin.opex.accountant.ports.kafka.listener.consumer.EventKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.OrderKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.TempEventKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.TradeKafkaListener
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.EnableScheduling

@Configuration
@EnableScheduling
class AppConfig {

@Bean
fun getFinancialActionJobManager(
financialActionLoader: FinancialActionLoader,
financialActionPersister: FinancialActionPersister,
walletProxy: WalletProxy
): FinancialActionJobManager {
return FinancialActionJobManagerImpl(
financialActionLoader,
financialActionPersister,
walletProxy
)
}

@Bean
fun orderManager(
pairConfigLoader: PairConfigLoader,
financialActionPersister: FinancialActionPersister,
financeActionLoader: FinancialActionLoader,
orderPersister: OrderPersister,
tempEventPersister: TempEventPersister,
tempEventRepublisher: TempEventRepublisher,
richOrderPublisher: RichOrderPublisher
): OrderManager {
return OrderManagerImpl(
pairConfigLoader,
financialActionPersister,
financeActionLoader,
orderPersister,
tempEventPersister,
tempEventRepublisher,
richOrderPublisher
)
}

@Bean
fun tradeManager(
pairStaticRateLoader: PairStaticRateLoader,
financeActionPersister: FinancialActionPersister,
financeActionLoader: FinancialActionLoader,
orderPersister: OrderPersister,
tempEventPersister: TempEventPersister,
richTradePublisher: RichTradePublisher,
richOrderPublisher: RichOrderPublisher,
walletProxy: WalletProxy,
@Value("\${app.coin}") platformCoin: String,
@Value("\${app.address}") platformAddress: String
): TradeManager {
return TradeManagerImpl(
pairStaticRateLoader,
financeActionPersister,
financeActionLoader,
orderPersister,
tempEventPersister,
richTradePublisher,
richOrderPublisher,
walletProxy,
platformCoin,
platformAddress
)
}

@Bean
fun orderListener(orderManager: OrderManager): OrderListener {
return OrderListener(orderManager)
}

@Bean
fun accountantTradeListener(tradeManager: TradeManager): AccountantTradeListener {
return AccountantTradeListener(tradeManager)
}

@Bean
fun accountantEventListener(orderManager: OrderManager): AccountantEventListener {
return AccountantEventListener(orderManager)
}

@Bean
fun accountantTempEventListener(
orderManager: OrderManager,
tradeManager: TradeManager
): AccountantTempEventListener {
return AccountantTempEventListener(orderManager, tradeManager)
}

@Autowired
fun configureOrderListener(orderKafkaListener: OrderKafkaListener, orderListener: OrderListener) {
orderKafkaListener.addOrderListener(orderListener)
}

@Autowired
fun configureTradeListener(
tradeKafkaListener: TradeKafkaListener,
accountantTradeListener: AccountantTradeListener
) {
tradeKafkaListener.addTradeListener(accountantTradeListener)
}

@Autowired
fun configureEventListener(
eventKafkaListener: EventKafkaListener,
accountantEventListener: AccountantEventListener
) {
eventKafkaListener.addEventListener(accountantEventListener)
}

@Autowired
fun configureTempEventListener(
tempEventKafkaListener: TempEventKafkaListener,
accountantTempEventListener: AccountantTempEventListener
) {
tempEventKafkaListener.addEventListener(accountantTempEventListener)
}

package co.nilin.opex.accountant.app.config

import co.nilin.opex.accountant.app.listener.AccountantEventListener
import co.nilin.opex.accountant.app.listener.AccountantTempEventListener
import co.nilin.opex.accountant.app.listener.AccountantTradeListener
import co.nilin.opex.accountant.app.listener.OrderListener
import co.nilin.opex.accountant.core.api.FeeCalculator
import co.nilin.opex.accountant.core.api.FinancialActionJobManager
import co.nilin.opex.accountant.core.api.OrderManager
import co.nilin.opex.accountant.core.api.TradeManager
import co.nilin.opex.accountant.core.service.FinancialActionJobManagerImpl
import co.nilin.opex.accountant.core.service.OrderManagerImpl
import co.nilin.opex.accountant.core.service.TradeManagerImpl
import co.nilin.opex.accountant.core.spi.*
import co.nilin.opex.accountant.ports.kafka.listener.consumer.EventKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.OrderKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.TempEventKafkaListener
import co.nilin.opex.accountant.ports.kafka.listener.consumer.TradeKafkaListener
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.scheduling.annotation.EnableScheduling

@Configuration
@EnableScheduling
class AppConfig {

@Bean
fun getFinancialActionJobManager(
financialActionLoader: FinancialActionLoader,
financialActionPersister: FinancialActionPersister,
walletProxy: WalletProxy
): FinancialActionJobManager {
return FinancialActionJobManagerImpl(
financialActionLoader,
financialActionPersister,
walletProxy
)
}

@Bean
fun orderManager(
pairConfigLoader: PairConfigLoader,
financialActionPersister: FinancialActionPersister,
financeActionLoader: FinancialActionLoader,
orderPersister: OrderPersister,
tempEventPersister: TempEventPersister,
tempEventRepublisher: TempEventRepublisher,
richOrderPublisher: RichOrderPublisher
): OrderManager {
return OrderManagerImpl(
pairConfigLoader,
financialActionPersister,
financeActionLoader,
orderPersister,
tempEventPersister,
tempEventRepublisher,
richOrderPublisher
)
}

@Bean
fun tradeManager(
financeActionPersister: FinancialActionPersister,
financeActionLoader: FinancialActionLoader,
orderPersister: OrderPersister,
tempEventPersister: TempEventPersister,
richTradePublisher: RichTradePublisher,
richOrderPublisher: RichOrderPublisher,
feeCalculator: FeeCalculator,
): TradeManager {
return TradeManagerImpl(
financeActionPersister,
financeActionLoader,
orderPersister,
tempEventPersister,
richTradePublisher,
richOrderPublisher,
feeCalculator
)
}

@Bean
fun orderListener(orderManager: OrderManager): OrderListener {
return OrderListener(orderManager)
}

@Bean
fun accountantTradeListener(tradeManager: TradeManager): AccountantTradeListener {
return AccountantTradeListener(tradeManager)
}

@Bean
fun accountantEventListener(orderManager: OrderManager): AccountantEventListener {
return AccountantEventListener(orderManager)
}

@Bean
fun accountantTempEventListener(
orderManager: OrderManager,
tradeManager: TradeManager
): AccountantTempEventListener {
return AccountantTempEventListener(orderManager, tradeManager)
}

@Autowired
fun configureOrderListener(orderKafkaListener: OrderKafkaListener, orderListener: OrderListener) {
orderKafkaListener.addOrderListener(orderListener)
}

@Autowired
fun configureTradeListener(
tradeKafkaListener: TradeKafkaListener,
accountantTradeListener: AccountantTradeListener
) {
tradeKafkaListener.addTradeListener(accountantTradeListener)
}

@Autowired
fun configureEventListener(
eventKafkaListener: EventKafkaListener,
accountantEventListener: AccountantEventListener
) {
eventKafkaListener.addEventListener(accountantEventListener)
}

@Autowired
fun configureTempEventListener(
tempEventKafkaListener: TempEventKafkaListener,
accountantTempEventListener: AccountantTempEventListener
) {
tempEventKafkaListener.addEventListener(accountantTempEventListener)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ class InitializeService(
it.leftSide,
it.rightSide,
leftSideFraction,
rightSideFraction,
0.0
rightSideFraction
).awaitSingleOrNull()
it.feeConfigs.forEach { f ->
runCatching {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,51 +1,53 @@
package co.nilin.opex.accountant.app.controller

import co.nilin.opex.accountant.core.model.PairConfig
import co.nilin.opex.accountant.core.model.PairFeeConfig
import co.nilin.opex.accountant.core.spi.FinancialActionLoader
import co.nilin.opex.accountant.core.spi.PairConfigLoader
import co.nilin.opex.accountant.core.spi.WalletProxy
import co.nilin.opex.matching.engine.core.eventh.events.SubmitOrderEvent
import co.nilin.opex.matching.engine.core.model.OrderDirection
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RestController
import java.math.BigDecimal

@RestController
class AccountantController(
val walletProxy: WalletProxy,
val financialActionLoader: FinancialActionLoader,
val pairConfigLoader: PairConfigLoader
) {
data class BooleanResponse(val result: Boolean)

@GetMapping("{uuid}/create_order/{amount}_{currency}/allowed")
suspend fun canCreateOrder(
@PathVariable("uuid") uuid: String,
@PathVariable("currency") currency: String,
@PathVariable("amount") amount: BigDecimal
): BooleanResponse {
return BooleanResponse(
financialActionLoader.countUnprocessed(uuid, currency, SubmitOrderEvent::class.simpleName!!) <= 0
&& walletProxy.canFulfil(currency, "main", uuid, amount)
)
}

@GetMapping(
value = ["/config/{pair}/fee/{direction}-{userLevel}", "/config/{pair}/fee/{direction}"]
)
suspend fun fetchPairFeeConfig(
@PathVariable("pair") pair: String,
@PathVariable("direction") direction: OrderDirection,
@PathVariable("userLevel") level: String?
): PairFeeConfig {
return pairConfigLoader.load(pair, direction, level ?: "")
}

@GetMapping("/config/all")
suspend fun fetchPairConfigs(): List<PairConfig> {
return pairConfigLoader.loadPairConfigs()
}

package co.nilin.opex.accountant.app.controller

import co.nilin.opex.accountant.core.model.PairConfig
import co.nilin.opex.accountant.core.model.PairFeeConfig
import co.nilin.opex.accountant.core.spi.FinancialActionLoader
import co.nilin.opex.accountant.core.spi.PairConfigLoader
import co.nilin.opex.accountant.core.spi.WalletProxy
import co.nilin.opex.accountant.ports.walletproxy.data.BooleanResponse
import co.nilin.opex.matching.engine.core.eventh.events.SubmitOrderEvent
import co.nilin.opex.matching.engine.core.model.OrderDirection
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.RestController
import java.math.BigDecimal

@RestController
class AccountantController(
val walletProxy: WalletProxy,
val financialActionLoader: FinancialActionLoader,
val pairConfigLoader: PairConfigLoader
) {

private val logger = LoggerFactory.getLogger(AccountantController::class.java)

@GetMapping("{uuid}/create_order/{amount}_{currency}/allowed")
suspend fun canCreateOrder(
@PathVariable("uuid") uuid: String,
@PathVariable("currency") currency: String,
@PathVariable("amount") amount: BigDecimal
): BooleanResponse {
val canFulfil = runCatching { walletProxy.canFulfil(currency, "main", uuid, amount) }
.onFailure { logger.error(it.message) }
.getOrElse { false }
val unprocessed = financialActionLoader.countUnprocessed(uuid, currency, SubmitOrderEvent::class.simpleName!!)
return BooleanResponse(unprocessed <= 0 && canFulfil)
}

@GetMapping(value = ["/config/{pair}/fee/{direction}-{userLevel}", "/config/{pair}/fee/{direction}"])
suspend fun fetchPairFeeConfig(
@PathVariable("pair") pair: String,
@PathVariable("direction") direction: OrderDirection,
@PathVariable("userLevel") level: String?
): PairFeeConfig {
return pairConfigLoader.load(pair, direction, level ?: "")
}

@GetMapping("/config/all")
suspend fun fetchPairConfigs(): List<PairConfig> {
return pairConfigLoader.loadPairConfigs()
}

}
Loading