11import 'package:bb_mobile/core/exchange/domain/entity/order.dart' ;
22import 'package:bb_mobile/core/exchange/domain/repositories/exchange_order_repository.dart' ;
3+ import 'package:bb_mobile/core/exchange/domain/usecases/save_user_preferences_usecase.dart' ;
34import 'package:bb_mobile/core/settings/data/settings_repository.dart' ;
5+ import 'package:bb_mobile/core/settings/domain/settings_entity.dart' ;
6+ import 'package:bb_mobile/core/utils/logger.dart' ;
7+ import 'package:bb_mobile/core/utils/result.dart' ;
48import 'package:bb_mobile/core/wallet/data/repositories/wallet_address_repository.dart' ;
59import 'package:bb_mobile/core/wallet/data/repositories/wallet_repository.dart' ;
610import 'package:bb_mobile/features/dca/domain/dca.dart' ;
11+ import 'package:bb_mobile/features/dca/domain/dca_failure.dart' ;
12+ import 'package:meta/meta.dart' ;
713
814class SetDcaUsecase {
915 final ExchangeOrderRepository _mainnetDcaRepository;
@@ -13,65 +19,97 @@ class SetDcaUsecase {
1319 final WalletRepository _wallet;
1420 final SettingsRepository _settingsRepository;
1521 final WalletAddressRepository _walletAddressRepository;
22+ final SaveUserPreferencesUsecase _saveUserPreferencesUsecase;
1623
1724 SetDcaUsecase ({
1825 required ExchangeOrderRepository mainnetExchangeOrderRepository,
1926 required ExchangeOrderRepository testnetExchangeOrderRepository,
2027 required this ._wallet,
2128 required this ._settingsRepository,
2229 required this ._walletAddressRepository,
30+ required this ._saveUserPreferencesUsecase,
2331 }) : _mainnetDcaRepository = mainnetExchangeOrderRepository,
2432 _testnetDcaRepository = testnetExchangeOrderRepository;
2533
26- Future <Dca > execute ({
34+ @useResult
35+ Future <Result <Dca , DcaFailure >> execute ({
2736 required double amount,
2837 required FiatCurrency currency,
2938 required DcaBuyFrequency frequency,
3039 required DcaNetwork network,
3140 String ? lightningAddress,
3241 }) async {
33- final settings = await _settingsRepository.fetch ();
42+ final SettingsEntity settings;
43+ try {
44+ settings = await _settingsRepository.fetch ();
45+ } catch (e, st) {
46+ log.severe (message: 'Failed to load settings' , error: e, trace: st);
47+ return Err (DcaUnexpectedFailure (e.toString ()));
48+ }
3449 final environment = settings.environment;
35- String address;
50+
51+ final String address;
3652 if (network == DcaNetwork .lightning) {
53+ // Defensive: the wallet-selection screen validates this before we run.
3754 if (lightningAddress == null || lightningAddress.isEmpty) {
38- throw Exception (
39- 'Lightning address is required for Lightning network DCA' ,
40- );
55+ return const Err (DcaLightningAddressRequiredFailure ());
4156 }
4257 address = lightningAddress;
4358 } else {
44- final wallets = await _wallet.getWallets (
45- environment: environment,
46- onlyDefaults: true ,
47- onlyBitcoin: network == DcaNetwork .bitcoin,
48- onlyLiquid: network == DcaNetwork .liquid,
49- );
59+ try {
60+ final wallets = await _wallet.getWallets (
61+ environment: environment,
62+ onlyDefaults: true ,
63+ onlyBitcoin: network == DcaNetwork .bitcoin,
64+ onlyLiquid: network == DcaNetwork .liquid,
65+ );
66+
67+ if (wallets.isEmpty) {
68+ log.warning ('No default wallet found for DCA network $network ' );
69+ return const Err (DcaReceiveAddressFailure ());
70+ }
5071
51- if (wallets.isEmpty) {
52- throw Exception ('No default wallet found' );
72+ final walletAddress = await _walletAddressRepository
73+ .generateNewReceiveAddress (walletId: wallets.first.id);
74+ address = walletAddress.address;
75+ } catch (e, st) {
76+ log.severe (
77+ message: 'Failed to resolve a DCA receive address' ,
78+ error: e.runtimeType,
79+ trace: st,
80+ );
81+ return Err (DcaReceiveAddressFailure (e.toString ()));
5382 }
83+ }
84+
85+ final Dca dca;
86+ try {
87+ final repository = environment.isMainnet
88+ ? _mainnetDcaRepository
89+ : _testnetDcaRepository;
90+ dca = await repository.createDca (
91+ amount: amount,
92+ currency: currency,
93+ frequency: frequency,
94+ network: network,
95+ address: address,
96+ );
97+ } catch (e, st) {
98+ log.warning ('Exchange rejected DCA creation' , error: e, trace: st);
99+ return Err (DcaOrderCreationFailure (e.toString ()));
100+ }
54101
55- final defaultWallet = wallets.first;
56- final walletAddress = await _walletAddressRepository
57- .generateNewReceiveAddress (walletId: defaultWallet.id);
58- address = walletAddress.address;
102+ try {
103+ await _saveUserPreferencesUsecase.execute (dcaEnabled: true );
104+ } catch (e, st) {
105+ log.severe (
106+ message: 'DCA created but enabling the preference failed' ,
107+ error: e,
108+ trace: st,
109+ );
110+ return Err (DcaUnexpectedFailure (e.toString ()));
59111 }
60112
61- return environment.isMainnet
62- ? _mainnetDcaRepository.createDca (
63- amount: amount,
64- currency: currency,
65- frequency: frequency,
66- network: network,
67- address: address,
68- )
69- : _testnetDcaRepository.createDca (
70- amount: amount,
71- currency: currency,
72- frequency: frequency,
73- network: network,
74- address: address,
75- );
113+ return Ok (dca);
76114 }
77115}
0 commit comments