Skip to content

Commit 62f10a2

Browse files
sarah-uwclaude
andauthored
Add interface for deposit and withdrawal eligibility clients (#111)
* use interface instead of bindings * Use marker interfaces in respective packages for type safety Moved DepositEligibilityClient and WithdrawalEligibilityClient marker interfaces to their respective domain packages (innie.client and outie.client) rather than keeping them in common.client. This approach provides: - Compile-time type safety through distinct marker interfaces - Clear package ownership and domain separation - No runtime qualification or annotations needed - Base EligibilityClient interface defines the contract once Updated all implementations and test modules to use the correct imports from their respective domain packages. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent a1587ff commit 62f10a2

File tree

10 files changed

+40
-31
lines changed

10 files changed

+40
-31
lines changed

innie/src/main/kotlin/xyz/block/bittycity/innie/api/OnChainDepositDomainApi.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import org.bitcoinj.base.Address
1010
import org.joda.money.CurrencyUnit
1111
import xyz.block.bittycity.common.client.BitcoinAccountClient
1212
import xyz.block.bittycity.common.client.Eligibility
13-
import xyz.block.bittycity.common.client.EligibilityClient
1413
import xyz.block.bittycity.common.client.ExchangeRateClient
14+
import xyz.block.bittycity.innie.client.DepositEligibilityClient
1515
import xyz.block.bittycity.common.client.IneligibleCustomer
1616
import xyz.block.bittycity.common.models.BalanceId
1717
import xyz.block.bittycity.common.models.Bitcoins
@@ -44,7 +44,7 @@ class OnChainDepositDomainApi @Inject constructor(
4444
private val transactor: Transactor<DepositOperations>,
4545
private val domainController: DepositDomainController,
4646
private val bitcoinAccountClient: BitcoinAccountClient,
47-
private val eligibilityClient: EligibilityClient,
47+
private val eligibilityClient: DepositEligibilityClient,
4848
private val exchangeRateClient: ExchangeRateClient,
4949
private val walletClient: WalletClient,
5050
private val idempotencyHandler: IdempotencyHandler
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package xyz.block.bittycity.innie.client
2+
3+
import xyz.block.bittycity.common.client.EligibilityClient
4+
5+
interface DepositEligibilityClient : EligibilityClient
6+

innie/src/main/kotlin/xyz/block/bittycity/innie/fsm/DepositEffectHandler.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import io.github.oshai.kotlinlogging.KLogger
77
import io.github.oshai.kotlinlogging.KotlinLogging
88
import jakarta.inject.Inject
99
import xyz.block.bittycity.common.client.Eligibility
10-
import xyz.block.bittycity.common.client.EligibilityClient
1110
import xyz.block.bittycity.common.client.Evaluation
11+
import xyz.block.bittycity.innie.client.DepositEligibilityClient
1212
import xyz.block.bittycity.common.client.RiskClient
1313
import xyz.block.bittycity.common.client.RiskEvaluation
1414
import xyz.block.bittycity.common.client.SanctionsClient
@@ -25,7 +25,7 @@ class DepositEffectHandler @Inject constructor(
2525
private val ledgerClient: DepositLedgerClient,
2626
private val depositRiskClient: RiskClient<DepositToken>,
2727
private val reversalRiskClient: RiskClient<DepositReversalToken>,
28-
private val eligibilityClient: EligibilityClient,
28+
private val eligibilityClient: DepositEligibilityClient,
2929
private val sanctionsClient: SanctionsClient<DepositReversalToken>,
3030
):
3131
EffectHandler<DepositToken, Deposit, DepositState, DepositEffect> {

innie/src/test/kotlin/xyz/block/bittycity/innie/testing/FakeEligibilityClient.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package xyz.block.bittycity.innie.testing
22

3-
import xyz.block.bittycity.common.testing.TestFake
4-
53
import app.cash.quiver.extensions.success
64
import xyz.block.bittycity.common.client.Eligibility
75
import xyz.block.bittycity.common.client.Eligibility.Eligible
8-
import xyz.block.bittycity.common.client.EligibilityClient
6+
import xyz.block.bittycity.common.testing.TestFake
7+
import xyz.block.bittycity.innie.client.DepositEligibilityClient
98

109
class FakeEligibilityClient :
1110
TestFake(),
12-
EligibilityClient {
11+
DepositEligibilityClient {
1312

1413
var nextEligibilityResult: Result<Eligibility> by resettable { Eligible(emptyList()).success() }
1514

innie/src/test/kotlin/xyz/block/bittycity/innie/testing/TestModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import com.squareup.moshi.Moshi
99
import io.kotest.property.arbitrary.next
1010
import jakarta.inject.Singleton
1111
import xyz.block.bittycity.common.client.CurrencyDisplayPreferenceClient
12-
import xyz.block.bittycity.common.client.EligibilityClient
1312
import xyz.block.bittycity.common.client.RiskClient
13+
import xyz.block.bittycity.innie.client.DepositEligibilityClient
1414
import xyz.block.bittycity.common.client.SanctionsClient
1515
import xyz.block.bittycity.innie.client.DepositLedgerClient
1616
import xyz.block.bittycity.innie.models.DepositReversalToken
@@ -55,7 +55,7 @@ class TestModule : AbstractModule() {
5555
// Bind fake clients
5656
bindSingletonFake<CurrencyDisplayPreferenceClient, FakeCurrencyDisplayPreferenceClient>()
5757
bindSingletonFake<MetricsClient, FakeMetricsClient>()
58-
bindSingletonFake<EligibilityClient, FakeEligibilityClient>()
58+
bindSingletonFake<DepositEligibilityClient, FakeEligibilityClient>()
5959
bindSingletonFake<DepositLedgerClient, FakeLedgerClient>()
6060

6161
// Bind fake operations

outie/src/main/kotlin/xyz/block/bittycity/outie/api/OnChainWithdrawalDomainApi.kt

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,33 @@ import app.cash.quiver.extensions.success
55
import arrow.core.flatMap
66
import arrow.core.getOrElse
77
import arrow.core.raise.result
8+
import jakarta.inject.Inject
9+
import jakarta.inject.Singleton
10+
import java.util.UUID
11+
import org.bitcoinj.base.Address
12+
import org.joda.money.CurrencyUnit
813
import xyz.block.bittycity.common.client.BitcoinAccountClient
914
import xyz.block.bittycity.common.client.Eligibility
10-
import xyz.block.bittycity.common.client.EligibilityClient
1115
import xyz.block.bittycity.common.client.ExchangeRateClient
1216
import xyz.block.bittycity.common.client.IneligibleCustomer
13-
import xyz.block.bittycity.outie.controllers.AdminFailController
14-
import xyz.block.bittycity.outie.controllers.DomainController
1517
import xyz.block.bittycity.common.models.BalanceId
1618
import xyz.block.bittycity.common.models.Bitcoins
17-
import xyz.block.bittycity.outie.models.CollectingInfo
1819
import xyz.block.bittycity.common.models.CustomerId
20+
import xyz.block.bittycity.common.store.Transactor
21+
import xyz.block.bittycity.outie.client.WithdrawalEligibilityClient
22+
import xyz.block.bittycity.outie.controllers.AdminFailController
23+
import xyz.block.bittycity.outie.controllers.DomainController
24+
import xyz.block.bittycity.outie.controllers.IdempotencyHandler
25+
import xyz.block.bittycity.outie.models.CollectingInfo
1926
import xyz.block.bittycity.outie.models.RequirementId
2027
import xyz.block.bittycity.outie.models.Withdrawal
2128
import xyz.block.bittycity.outie.models.WithdrawalState
2229
import xyz.block.bittycity.outie.models.WithdrawalToken
23-
import xyz.block.bittycity.outie.controllers.IdempotencyHandler
24-
import xyz.block.bittycity.common.store.Transactor
2530
import xyz.block.bittycity.outie.store.WithdrawalOperations
2631
import xyz.block.bittycity.outie.store.WithdrawalStore
2732
import xyz.block.bittycity.outie.utils.SearchParser
2833
import xyz.block.bittycity.outie.validation.InvalidSourceBalanceToken
2934
import xyz.block.bittycity.outie.validation.ValidationService
30-
import jakarta.inject.Inject
31-
import jakarta.inject.Singleton
32-
import org.bitcoinj.base.Address
33-
import org.joda.money.CurrencyUnit
3435
import xyz.block.domainapi.DomainApi
3536
import xyz.block.domainapi.ExecuteResponse
3637
import xyz.block.domainapi.InfoOnly
@@ -44,7 +45,6 @@ import xyz.block.domainapi.SearchResult
4445
import xyz.block.domainapi.UpdateResponse
4546
import xyz.block.domainapi.WarnOnly
4647
import xyz.block.domainapi.util.Operation
47-
import java.util.UUID
4848

4949
typealias WithdrawalDomainController =
5050
DomainController<WithdrawalToken, WithdrawalState, Withdrawal, RequirementId>
@@ -56,7 +56,7 @@ class OnChainWithdrawalDomainApi @Inject constructor(
5656
private val withdrawalStore: WithdrawalStore,
5757
private val domainController: WithdrawalDomainController,
5858
private val bitcoinAccountClient: BitcoinAccountClient,
59-
private val eligibilityClient: EligibilityClient,
59+
private val eligibilityClient: WithdrawalEligibilityClient,
6060
private val exchangeRateClient: ExchangeRateClient,
6161
private val validationService: ValidationService,
6262
private val idempotencyHandler: IdempotencyHandler,
@@ -307,7 +307,7 @@ data class InitialRequest(
307307

308308
sealed class ApiError :
309309
Exception(),
310-
InfoOnly
310+
InfoOnly
311311

312312
data class WithdrawalTokenConflictError(
313313
val withdrawalToken: WithdrawalToken,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package xyz.block.bittycity.outie.client
2+
3+
import xyz.block.bittycity.common.client.EligibilityClient
4+
5+
interface WithdrawalEligibilityClient: EligibilityClient

outie/src/main/kotlin/xyz/block/bittycity/outie/controllers/EligibilityController.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package xyz.block.bittycity.outie.controllers
33
import app.cash.kfsm.StateMachine
44
import arrow.core.raise.result
55
import xyz.block.bittycity.common.client.Eligibility
6-
import xyz.block.bittycity.common.client.EligibilityClient
76
import xyz.block.bittycity.outie.client.MetricsClient
7+
import xyz.block.bittycity.outie.client.WithdrawalEligibilityClient
88
import xyz.block.bittycity.outie.models.CheckingEligibility
99
import xyz.block.bittycity.outie.models.FailureReason.CUSTOMER_IS_INELIGIBLE
1010
import xyz.block.bittycity.outie.models.HoldingSubmission
@@ -21,7 +21,7 @@ import xyz.block.domainapi.util.Operation
2121
class EligibilityController @Inject constructor(
2222
stateMachine: StateMachine<WithdrawalToken, Withdrawal, WithdrawalState>,
2323
withdrawalStore: WithdrawalStore,
24-
private val eligibilityClient: EligibilityClient,
24+
private val eligibilityClient: WithdrawalEligibilityClient,
2525
private val metricsClient: MetricsClient,
2626
) : WithdrawalController(stateMachine, metricsClient, withdrawalStore) {
2727

outie/src/test/kotlin/xyz/block/bittycity/outie/testing/FakeEligibilityClient.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package xyz.block.bittycity.outie.testing
22

3-
import xyz.block.bittycity.common.testing.TestFake
4-
53
import app.cash.quiver.extensions.success
64
import xyz.block.bittycity.common.client.Eligibility
75
import xyz.block.bittycity.common.client.Eligibility.Eligible
8-
import xyz.block.bittycity.common.client.EligibilityClient
6+
import xyz.block.bittycity.common.testing.TestFake
7+
import xyz.block.bittycity.outie.client.WithdrawalEligibilityClient
98

109
class FakeEligibilityClient :
1110
TestFake(),
12-
EligibilityClient {
11+
WithdrawalEligibilityClient {
1312

1413
var nextEligibilityResult: Result<Eligibility> by resettable { Eligible(emptyList()).success() }
1514

outie/src/test/kotlin/xyz/block/bittycity/outie/testing/TestModule.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import com.google.inject.name.Names
77
import xyz.block.bittycity.common.client.PreFlightClient
88
import xyz.block.bittycity.common.client.BitcoinAccountClient
99
import xyz.block.bittycity.common.client.CurrencyDisplayPreferenceClient
10-
import xyz.block.bittycity.common.client.EligibilityClient
1110
import xyz.block.bittycity.outie.client.EventClient
11+
import xyz.block.bittycity.outie.client.WithdrawalEligibilityClient
1212
import xyz.block.bittycity.common.client.ExchangeRateClient
1313
import xyz.block.bittycity.outie.client.FeeQuoteClient
1414
import xyz.block.bittycity.outie.client.LedgerClient
@@ -60,7 +60,7 @@ class TestModule : AbstractModule() {
6060
.to(FakeSanctionsClient::class.java)
6161
.`in`(Scopes.SINGLETON)
6262
bindSingletonFake<TravelRuleClient, FakeTravelRuleClient>()
63-
bindSingletonFake<EligibilityClient, FakeEligibilityClient>()
63+
bindSingletonFake<WithdrawalEligibilityClient, FakeEligibilityClient>()
6464
bind(FakePreFlightClient::class.java).`in`(Scopes.SINGLETON)
6565
bind(object : com.google.inject.TypeLiteral<PreFlightClient<xyz.block.bittycity.outie.models.Withdrawal>>() {})
6666
.to(FakePreFlightClient::class.java)

0 commit comments

Comments
 (0)