Skip to content

Commit 9cf8c35

Browse files
committed
Add user fee service
1 parent 70b4d57 commit 9cf8c35

15 files changed

Lines changed: 103 additions & 37 deletions

File tree

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package co.nilin.opex.accountant.app.controller
2+
3+
import co.nilin.opex.accountant.core.api.FeeCalculator
4+
import co.nilin.opex.accountant.core.model.FeeConfig
5+
import co.nilin.opex.accountant.core.model.UserFee
6+
import co.nilin.opex.accountant.core.spi.FeeConfigService
7+
import org.springframework.web.bind.annotation.GetMapping
8+
import org.springframework.web.bind.annotation.PathVariable
9+
import org.springframework.web.bind.annotation.RequestMapping
10+
import org.springframework.web.bind.annotation.RestController
11+
12+
@RestController
13+
@RequestMapping("/fee")
14+
class FeeController(
15+
private val feeConfigService: FeeConfigService,
16+
private val feeCalculator: FeeCalculator,
17+
) {
18+
@GetMapping("/config")
19+
suspend fun getFeeConfigs(): List<FeeConfig> {
20+
return feeConfigService.loadFeeConfigs()
21+
}
22+
23+
@GetMapping("/{uuid}")
24+
suspend fun getUserFee(@PathVariable uuid: String): UserFee {
25+
return feeCalculator.getUserFee(uuid)
26+
}
27+
}

accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/api/FeeCalculator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package co.nilin.opex.accountant.core.api
22

3-
import co.nilin.opex.accountant.core.model.FeeConfig
43
import co.nilin.opex.accountant.core.model.FeeFinancialActions
54
import co.nilin.opex.accountant.core.model.FinancialAction
65
import co.nilin.opex.accountant.core.model.Order
6+
import co.nilin.opex.accountant.core.model.UserFee
77
import co.nilin.opex.matching.engine.core.eventh.events.TradeEvent
88

99
interface FeeCalculator {
1010

11-
suspend fun getUserFee(uuid: String): FeeConfig
11+
suspend fun getUserFee(uuid: String): UserFee
1212

1313
suspend fun createFeeActions(
1414
trade: TradeEvent,
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package co.nilin.opex.accountant.core.model
2+
3+
import java.math.BigDecimal
4+
5+
data class UserFee(
6+
val name: String,
7+
val displayOrder: Int,
8+
val makerFee: BigDecimal,
9+
val takerFee: BigDecimal,
10+
)

accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/service/FeeCalculatorImpl.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class FeeCalculatorImpl(
2020
private val walletProxy: WalletProxy,
2121
private val feeConfigService: FeeConfigService,
2222
private val userVolumePersister: UserVolumePersister,
23-
private val cacheManager: CacheManager<String, FeeConfig>,
23+
private val cacheManager: CacheManager<String, UserFee>,
2424
@Value("\${app.address}") private val platformAddress: String,
2525
private val jsonMapper: JsonMapper
2626
) : FeeCalculator {
@@ -30,11 +30,11 @@ class FeeCalculatorImpl(
3030
private fun remainingMillisUntil1AM(zone: ZoneId = ZoneId.of("GMT+03:30")): Long {
3131
val now = ZonedDateTime.now(zone)
3232
val target = now.toLocalDate().plusDays(1).atTime(1, 0).atZone(zone)
33-
val remainingMillis = Duration.between(now, target).toMillis()
34-
return if ( remainingMillis > 0) remainingMillis else Duration.ofHours(1).toMillis()
33+
val remainingMillis = Duration.between(now, target).toMillis()
34+
return if (remainingMillis > 0) remainingMillis else Duration.ofHours(1).toMillis()
3535
}
3636

37-
override suspend fun getUserFee(uuid: String): FeeConfig {
37+
override suspend fun getUserFee(uuid: String): UserFee {
3838
val cached = cacheManager.get(uuid)
3939
if (cached != null) {
4040
return cached
@@ -47,8 +47,8 @@ class FeeCalculatorImpl(
4747
totalAssets?.totalUSDT ?: BigDecimal.ZERO,
4848
userVolumeData?.valueUSDT ?: BigDecimal.ZERO
4949
)
50-
val remainingMillis = remainingMillisUntil1AM()
51-
cacheManager.put(uuid, feeConfig, remainingMillis, TimeUnit.MILLISECONDS)
50+
val remainingMillis = remainingMillisUntil1AM()
51+
cacheManager.put(uuid, feeConfig, remainingMillis, TimeUnit.MILLISECONDS)
5252
return feeConfig
5353
}
5454

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package co.nilin.opex.accountant.core.spi
22

33
import co.nilin.opex.accountant.core.model.FeeConfig
4+
import co.nilin.opex.accountant.core.model.UserFee
45
import java.math.BigDecimal
56

67
interface FeeConfigService {
@@ -9,6 +10,6 @@ interface FeeConfigService {
910
suspend fun saveFee(config: FeeConfig)
1011
suspend fun updateFee(config: FeeConfig)
1112
suspend fun loadFeeConfig(name: String): FeeConfig
12-
suspend fun loadMatchingFeeConfig(assetVolume: BigDecimal, tradeVolume: BigDecimal): FeeConfig
13+
suspend fun loadMatchingFeeConfig(assetVolume: BigDecimal, tradeVolume: BigDecimal): UserFee
1314

1415
}

accountant/accountant-core/src/test/kotlin/co/nilin/opex/accountant/core/service/FeeCalculatorImplTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package co.nilin.opex.accountant.core.service
22

3-
import co.nilin.opex.accountant.core.model.FeeConfig
43
import co.nilin.opex.accountant.core.model.FinancialAction
54
import co.nilin.opex.accountant.core.model.FinancialActionCategory
5+
import co.nilin.opex.accountant.core.model.UserFee
66
import co.nilin.opex.accountant.core.model.WalletType
77
import co.nilin.opex.accountant.core.spi.FeeConfigService
88
import co.nilin.opex.accountant.core.spi.UserVolumePersister
@@ -18,7 +18,7 @@ internal class FeeCalculatorImplTest {
1818
private val walletProxy = mockk<WalletProxy>()
1919
private val feeConfigService = mockk<FeeConfigService>()
2020
private val userVolumePersister = mockk<UserVolumePersister>()
21-
private val cacheManager = mockk<CacheManager<String, FeeConfig>>()
21+
private val cacheManager = mockk<CacheManager<String, UserFee>>()
2222

2323
private val receiverAddress = "0x0"
2424
private val feeCalculator = FeeCalculatorImpl(

accountant/accountant-core/src/test/kotlin/co/nilin/opex/accountant/core/service/OrderManagerImplTest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ internal class OrderManagerImplTest {
8080

8181
coEvery {
8282
feeCalculator.getUserFee(submitOrderEvent.uuid)
83-
} returns FeeConfig(
84-
"Test", 1, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.valueOf(0.08), BigDecimal.valueOf(0.1), Condition.OR
83+
} returns UserFee(
84+
"Test", 1, BigDecimal.valueOf(0.08), BigDecimal.valueOf(0.1)
8585
)
8686
//when
8787
val financialActions = orderManager.handleRequestOrder(submitOrderEvent)
@@ -136,8 +136,8 @@ internal class OrderManagerImplTest {
136136

137137
coEvery {
138138
feeCalculator.getUserFee(submitOrderEvent.uuid)
139-
} returns FeeConfig(
140-
"Test", 1, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.valueOf(0.08), BigDecimal.valueOf(0.1), Condition.OR
139+
} returns UserFee(
140+
"Test", 1, BigDecimal.valueOf(0.08), BigDecimal.valueOf(0.1)
141141
)
142142

143143
//when

accountant/accountant-core/src/test/kotlin/co/nilin/opex/accountant/core/service/TradeManagerImplTest.kt

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import io.mockk.runs
1717
import kotlinx.coroutines.runBlocking
1818
import org.assertj.core.api.Assertions.assertThat
1919
import org.junit.jupiter.api.Test
20-
import org.mockito.kotlin.any
2120
import java.math.BigDecimal
2221

2322
internal class TradeManagerImplTest {
@@ -35,7 +34,7 @@ internal class TradeManagerImplTest {
3534
private val feeCalculator = mockk<FeeCalculator>()
3635
private val walletProxy = mockk<WalletProxy>()
3736
private val feeConfigService = mockk<FeeConfigService>()
38-
private val cacheManager = mockk<CacheManager<String, FeeConfig>>()
37+
private val cacheManager = mockk<CacheManager<String, UserFee>>()
3938

4039
private val jsonMapper = JsonMapperTestImpl()
4140

@@ -80,7 +79,7 @@ internal class TradeManagerImplTest {
8079
coEvery { financialActionPersister.updateStatus(any<FinancialAction>(), any()) } returns Unit
8180
coEvery { financialActionPersister.updateStatus(any<String>(), any()) } returns Unit
8281
coEvery { currencyRatePersister.updateRate(any(), any(), any()) } just runs
83-
coEvery { userVolumePersister.update(any(), any(), any(),any(),any(),any()) } just runs
82+
coEvery { userVolumePersister.update(any(), any(), any(), any(), any(), any()) } just runs
8483
}
8584

8685
@Test
@@ -329,9 +328,8 @@ internal class TradeManagerImplTest {
329328
) {
330329
coEvery {
331330
feeCalculator.getUserFee(submitOrderEvent.uuid)
332-
} returns FeeConfig(
333-
"Test", 1, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, BigDecimal.ONE, makerFee, takerFee,
334-
Condition.OR
331+
} returns UserFee(
332+
"Test", 1, makerFee, takerFee
335333
)
336334

337335
coEvery {

accountant/accountant-ports/accountant-persister-postgres/src/main/kotlin/co/nilin/opex/accountant/ports/postgres/dao/FeeConfigRepository.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package co.nilin.opex.accountant.ports.postgres.dao
22

33
import co.nilin.opex.accountant.core.model.FeeConfig
4+
import co.nilin.opex.accountant.core.model.UserFee
45
import co.nilin.opex.accountant.ports.postgres.model.FeeConfigModel
56
import org.springframework.data.r2dbc.repository.Query
67
import org.springframework.data.repository.reactive.ReactiveCrudRepository
@@ -19,7 +20,7 @@ interface FeeConfigRepository : ReactiveCrudRepository<FeeConfigModel, Long> {
1920

2021
@Query(
2122
"""
22-
SELECT *
23+
SELECT name,display_order,maker_fee,taker_fee
2324
FROM fee_config
2425
WHERE
2526
(
@@ -39,6 +40,6 @@ interface FeeConfigRepository : ReactiveCrudRepository<FeeConfigModel, Long> {
3940
LIMIT 1
4041
"""
4142
)
42-
fun findMatchingConfig(assetVolume: BigDecimal, tradeVolume: BigDecimal): Mono<FeeConfig>
43+
fun findMatchingConfig(assetVolume: BigDecimal, tradeVolume: BigDecimal): Mono<UserFee>
4344

4445
}

accountant/accountant-ports/accountant-persister-postgres/src/main/kotlin/co/nilin/opex/accountant/ports/postgres/impl/FeeConfigServiceImpl.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package co.nilin.opex.accountant.ports.postgres.impl
22

33
import co.nilin.opex.accountant.core.model.FeeConfig
4+
import co.nilin.opex.accountant.core.model.UserFee
45
import co.nilin.opex.accountant.core.spi.FeeConfigService
56
import co.nilin.opex.accountant.ports.postgres.dao.FeeConfigRepository
67
import co.nilin.opex.accountant.ports.postgres.model.FeeConfigModel
@@ -45,7 +46,7 @@ class FeeConfigServiceImpl(
4546
override suspend fun loadMatchingFeeConfig(
4647
assetVolume: BigDecimal,
4748
tradeVolume: BigDecimal
48-
): FeeConfig {
49+
): UserFee {
4950
return feeConfigRepository.findMatchingConfig(assetVolume, tradeVolume).awaitFirst()
5051
}
5152

0 commit comments

Comments
 (0)