From fd71999fc5cb13a038f0e447c4d5a671e295865f Mon Sep 17 00:00:00 2001 From: Yannick1712 <52333989+Yannick1712@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:17:55 +0200 Subject: [PATCH 1/2] [DEV-4065] feeRequest with userData --- .../buy-crypto-preparation.service.ts | 3 ++- .../services/buy-fiat-preparation.service.ts | 3 ++- .../generic/user/models/user/user.service.ts | 3 ++- .../payment/services/fee.service.ts | 27 ++++++++----------- .../payment/services/transaction-helper.ts | 14 ++++++---- 5 files changed, 26 insertions(+), 24 deletions(-) diff --git a/src/subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts b/src/subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts index 53eeff2835..cc33f12686 100644 --- a/src/subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts +++ b/src/subdomains/core/buy-crypto/process/services/buy-crypto-preparation.service.ts @@ -212,7 +212,7 @@ export class BuyCryptoPreparationService implements OnModuleInit { cryptoInput: true, buy: true, cryptoRoute: true, - transaction: { user: { wallet: true, userData: true }, userData: true }, + transaction: { user: { wallet: true }, userData: true }, }, }); @@ -247,6 +247,7 @@ export class BuyCryptoPreparationService implements OnModuleInit { bankIn, undefined, entity.user, + entity.userData, ); const maxNetworkFee = fee.network ? fee.network : referenceChfPrice.invert().convert(Config.maxBlockchainFee); diff --git a/src/subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts b/src/subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts index 66c12f27e5..6e88803246 100644 --- a/src/subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts +++ b/src/subdomains/core/sell-crypto/process/services/buy-fiat-preparation.service.ts @@ -167,7 +167,7 @@ export class BuyFiatPreparationService implements OnModuleInit { relations: { sell: true, cryptoInput: true, - transaction: { user: { wallet: true, userData: true }, userData: true }, + transaction: { user: { wallet: true }, userData: true }, }, }); @@ -193,6 +193,7 @@ export class BuyFiatPreparationService implements OnModuleInit { undefined, IbanBankName.MAERKI, entity.user, + entity.userData, ); await this.buyFiatRepo.update( diff --git a/src/subdomains/generic/user/models/user/user.service.ts b/src/subdomains/generic/user/models/user/user.service.ts index 262e3bfb10..37a8905fa0 100644 --- a/src/subdomains/generic/user/models/user/user.service.ts +++ b/src/subdomains/generic/user/models/user/user.service.ts @@ -418,7 +418,8 @@ export class UserService { if (!user) throw new NotFoundException('User not found'); return this.feeService.getUserFee({ - user, + userData: user.userData, + wallet: user.wallet, paymentMethodIn, paymentMethodOut, from, diff --git a/src/subdomains/supporting/payment/services/fee.service.ts b/src/subdomains/supporting/payment/services/fee.service.ts index e537aed73c..0a98a54192 100644 --- a/src/subdomains/supporting/payment/services/fee.service.ts +++ b/src/subdomains/supporting/payment/services/fee.service.ts @@ -37,7 +37,8 @@ import { BlockchainFeeRepository } from '../repositories/blockchain-fee.reposito import { FeeRepository } from '../repositories/fee.repository'; export interface UserFeeRequest extends FeeRequestBase { - user: User; + userData: UserData; + wallet: Wallet; } export interface FeeRequest extends FeeRequestBase { @@ -47,7 +48,6 @@ export interface FeeRequest extends FeeRequestBase { } export interface OptionalFeeRequest extends FeeRequestBase { - user?: User; userData?: UserData; wallet?: Wallet; accountType?: AccountType; @@ -243,7 +243,7 @@ export class FeeService implements OnModuleInit { request.from, request.to, request.allowCachedBlockchainFee, - request.user.userData?.id, + request.userData?.id, ); } catch (e) { this.logger.error(`Fee exception, request: ${JSON.stringify(request)}`); @@ -444,15 +444,8 @@ export class FeeService implements OnModuleInit { } private async getValidFees(request: OptionalFeeRequest): Promise { - const accountType = - request.user?.userData?.accountType ?? - request.userData?.accountType ?? - request.accountType ?? - AccountType.PERSONAL; - const wallet = request.wallet ?? request.user?.wallet; - const userDataId = request.user?.userData?.id ?? request.userData?.id; - - const discountFeeIds = request.user?.userData?.individualFeeList ?? request.userData?.individualFeeList ?? []; + const accountType = request.userData?.accountType ?? request.accountType ?? AccountType.PERSONAL; + const discountFeeIds = request.userData?.individualFeeList ?? []; const userFees = await this.getAllFees().then((fees) => fees.filter( @@ -469,15 +462,17 @@ export class FeeService implements OnModuleInit { !f.specialCode) || discountFeeIds.includes(f.id) || request.specialCodes.includes(f.specialCode) || - (f.wallet && f.wallet.id === wallet?.id), + (f.wallet && f.wallet.id === request.wallet?.id), ), ); // remove ExpiredFee userFees - .filter((fee) => discountFeeIds.includes(fee.id) && fee.isExpired(userDataId)) - .forEach((fee) => this.userDataService.removeFee(request.user?.userData ?? request.userData, fee.id)); + .filter((fee) => discountFeeIds.includes(fee.id) && fee.isExpired(request.userData?.id)) + .forEach((fee) => this.userDataService.removeFee(request.userData, fee.id)); - return userFees.filter((fee) => fee.verifyForTx({ ...request, accountType, wallet, userDataId })); + return userFees.filter((fee) => + fee.verifyForTx({ ...request, accountType, wallet: request.wallet, userDataId: request.userData?.id }), + ); } } diff --git a/src/subdomains/supporting/payment/services/transaction-helper.ts b/src/subdomains/supporting/payment/services/transaction-helper.ts index c6403fb92e..29fb8c3556 100644 --- a/src/subdomains/supporting/payment/services/transaction-helper.ts +++ b/src/subdomains/supporting/payment/services/transaction-helper.ts @@ -199,11 +199,13 @@ export class TransactionHelper implements OnModuleInit { bankIn: CardBankName | IbanBankName | undefined, bankOut: CardBankName | IbanBankName | undefined, user: User, + userData: UserData, ): Promise { // get fee const [fee, networkStartFee] = await this.getAllFees( user, - undefined, + userData, + user.wallet, paymentMethodIn, paymentMethodOut, bankIn, @@ -274,6 +276,7 @@ export class TransactionHelper implements OnModuleInit { // get fee const [fee, networkStartFee] = await this.getAllFees( user, + user.userData, wallet, paymentMethodIn, paymentMethodOut, @@ -512,6 +515,7 @@ export class TransactionHelper implements OnModuleInit { private async getAllFees( user: User | undefined, + userData: UserData | undefined, wallet: Wallet | undefined, paymentMethodIn: PaymentMethod, paymentMethodOut: PaymentMethod, @@ -526,7 +530,7 @@ export class TransactionHelper implements OnModuleInit { ): Promise<[InternalFeeDto, number]> { const [fee, networkStartFee] = await Promise.all([ this.getTxFee( - user, + userData, wallet, paymentMethodIn, paymentMethodOut, @@ -584,7 +588,7 @@ export class TransactionHelper implements OnModuleInit { } private async getTxFee( - user: User | undefined, + userData: UserData | undefined, wallet: Wallet | undefined, paymentMethodIn: PaymentMethod, paymentMethodOut: PaymentMethod, @@ -597,7 +601,7 @@ export class TransactionHelper implements OnModuleInit { allowCachedBlockchainFee: boolean, ): Promise { const feeRequest: UserFeeRequest = { - user, + userData, wallet, paymentMethodIn, paymentMethodOut, @@ -610,7 +614,7 @@ export class TransactionHelper implements OnModuleInit { allowCachedBlockchainFee, }; - return user ? this.feeService.getUserFee(feeRequest) : this.feeService.getDefaultFee(feeRequest); + return userData ? this.feeService.getUserFee(feeRequest) : this.feeService.getDefaultFee(feeRequest); } private async getTargetEstimation( From 8c911c48fc865f42d62ee1138b3cc3a49b316f5d Mon Sep 17 00:00:00 2001 From: Yannick1712 <52333989+Yannick1712@users.noreply.github.com> Date: Thu, 12 Jun 2025 14:23:37 +0200 Subject: [PATCH 2/2] [DEV-4065] Refactoring --- .../core/history/controllers/transaction.controller.ts | 2 +- .../supporting/payment/services/transaction-helper.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/subdomains/core/history/controllers/transaction.controller.ts b/src/subdomains/core/history/controllers/transaction.controller.ts index 68d995b717..1473ee9b6a 100644 --- a/src/subdomains/core/history/controllers/transaction.controller.ts +++ b/src/subdomains/core/history/controllers/transaction.controller.ts @@ -303,7 +303,7 @@ export class TransactionController { cryptoInput: true, checkoutTx: true, bankTxReturn: true, - userData: true, + userData: { wallet: true }, buyCrypto: { cryptoInput: true, bankTx: true, checkoutTx: true }, buyFiat: { cryptoInput: true }, refReward: true, diff --git a/src/subdomains/supporting/payment/services/transaction-helper.ts b/src/subdomains/supporting/payment/services/transaction-helper.ts index 29fb8c3556..b5863b4553 100644 --- a/src/subdomains/supporting/payment/services/transaction-helper.ts +++ b/src/subdomains/supporting/payment/services/transaction-helper.ts @@ -412,6 +412,7 @@ export class TransactionHelper implements OnModuleInit { specialCodes: [], allowCachedBlockchainFee: false, userData, + wallet: userData.wallet, }); const dfxFeeAmount = inputAmount * chargebackFee.rate + price.convert(chargebackFee.fixed);