From 9272d22bc904aa1e8016f18fb7b8da9f254eaf4f Mon Sep 17 00:00:00 2001 From: Eugene Voronov Date: Thu, 3 Aug 2023 16:13:30 +0300 Subject: [PATCH] Refactored services and removed unnecessary nesting --- .../server/src/common/utils/index.ts | 30 ++++++ .../src/modules/job/job.service.spec.ts | 40 ++++---- .../server/src/modules/job/job.service.ts | 40 ++++---- .../modules/payment/currency.service.spec.ts | 91 ------------------- .../src/modules/payment/currency.service.ts | 36 -------- .../src/modules/payment/payment.controller.ts | 5 +- .../src/modules/payment/payment.module.ts | 5 +- .../modules/payment/payment.service.spec.ts | 78 ++++++++-------- .../src/modules/payment/payment.service.ts | 65 ++++--------- 9 files changed, 135 insertions(+), 255 deletions(-) create mode 100644 packages/apps/job-launcher/server/src/common/utils/index.ts delete mode 100644 packages/apps/job-launcher/server/src/modules/payment/currency.service.spec.ts delete mode 100644 packages/apps/job-launcher/server/src/modules/payment/currency.service.ts diff --git a/packages/apps/job-launcher/server/src/common/utils/index.ts b/packages/apps/job-launcher/server/src/common/utils/index.ts new file mode 100644 index 0000000000..d2609440aa --- /dev/null +++ b/packages/apps/job-launcher/server/src/common/utils/index.ts @@ -0,0 +1,30 @@ +import { firstValueFrom } from "rxjs"; +import { CoingeckoTokenId } from "../constants/payment"; +import { TokenId } from "../enums/payment"; +import { COINGECKO_API_URL } from "../constants"; +import { NotFoundException } from "@nestjs/common"; +import { ErrorCurrency } from "../constants/errors"; + +export async function getRate(from: string, to: string): Promise { + let reversed = false; + + if (Object.values(TokenId).includes(to as TokenId)) { + [from, to] = [CoingeckoTokenId[to], from]; + } else { + reversed = true; + } + + const { data } = await firstValueFrom( + this.httpService.get( + `${COINGECKO_API_URL}?ids=${from}&vs_currencies=${to}`, + ), + ) as any; + + if (!data[from] || !data[from][to]) { + throw new NotFoundException(ErrorCurrency.PairNotFound); + } + + const rate = data[from][to]; + + return reversed ? 1 / rate : rate; + } \ No newline at end of file diff --git a/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts b/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts index b88e5d98fd..ef2fd3be7e 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.service.spec.ts @@ -43,7 +43,7 @@ import { JobRepository } from './job.repository'; import { JobService } from './job.service'; import { HMToken__factory } from '@human-protocol/core/typechain-types'; -import { CurrencyService } from '../payment/currency.service'; +import { PaymentRepository } from '../payment/payment.repository'; jest.mock('@human-protocol/sdk', () => ({ ...jest.requireActual('@human-protocol/sdk'), @@ -61,11 +61,16 @@ jest.mock('@human-protocol/sdk', () => ({ })), })); +jest.mock('../../common/utils', () => ({ + getRate: jest.fn().mockImplementation(() => 0.5) +})); + describe('JobService', () => { - let jobService: JobService; - let jobRepository: JobRepository; - let paymentService: PaymentService; - let currencyService: CurrencyService; + let jobService: JobService, + jobRepository: JobRepository, + paymentRepository: PaymentRepository, + paymentService: PaymentService, + createPaymentMock: any; const signerMock = { address: MOCK_ADDRESS, @@ -109,18 +114,19 @@ describe('JobService', () => { getSigner: jest.fn().mockReturnValue(signerMock), }, }, - { provide: CurrencyService, useValue: createMock() }, { provide: JobRepository, useValue: createMock() }, + { provide: PaymentRepository, useValue: createMock() }, { provide: PaymentService, useValue: createMock() }, { provide: ConfigService, useValue: mockConfigService }, { provide: HttpService, useValue: createMock() }, ], }).compile(); - currencyService = moduleRef.get(CurrencyService); jobService = moduleRef.get(JobService); jobRepository = moduleRef.get(JobRepository); + paymentRepository = moduleRef.get(PaymentRepository); paymentService = moduleRef.get(PaymentService); + createPaymentMock = jest.spyOn(paymentRepository, 'create'); }); describe('createFortuneJob', () => { @@ -138,9 +144,7 @@ describe('JobService', () => { beforeEach(() => { getUserBalanceMock = jest.spyOn(paymentService, 'getUserBalance'); - - jest.spyOn(currencyService, 'getRate').mockResolvedValue(rate); - jest.spyOn(paymentService, 'savePayment').mockResolvedValue(true); + createPaymentMock.mockResolvedValue(true); }); afterEach(() => { @@ -171,14 +175,14 @@ describe('JobService', () => { await jobService.createFortuneJob(userId, dto); expect(paymentService.getUserBalance).toHaveBeenCalledWith(userId); - expect(paymentService.savePayment).toHaveBeenCalledWith( + expect(paymentRepository.create).toHaveBeenCalledWith({ userId, - PaymentSource.BALANCE, - Currency.USD, - TokenId.HMT, - PaymentType.WITHDRAWAL, - usdTotalAmount, - ); + source: PaymentSource.BALANCE, + type: PaymentType.WITHDRAWAL, + currency: TokenId.HMT, + amount: usdTotalAmount.toString(), + rate: 0.5 + }); expect(jobRepository.create).toHaveBeenCalledWith({ chainId: dto.chainId, userId, @@ -250,6 +254,8 @@ describe('JobService', () => { .spyOn(HMToken__factory, 'connect') .mockReturnValue(mockTokenContract); getManifestMock = jest.spyOn(jobService, 'getManifest'); + + createPaymentMock.mockResolvedValue(true); }); afterEach(() => { diff --git a/packages/apps/job-launcher/server/src/modules/job/job.service.ts b/packages/apps/job-launcher/server/src/modules/job/job.service.ts index ebc1e68d98..552a7ef87f 100644 --- a/packages/apps/job-launcher/server/src/modules/job/job.service.ts +++ b/packages/apps/job-launcher/server/src/modules/job/job.service.ts @@ -25,7 +25,6 @@ import { ChainId, EscrowClient, NETWORKS, - StakingClient, StorageClient, StorageCredentials, StorageParams, @@ -53,7 +52,8 @@ import { HMToken, HMToken__factory, } from '@human-protocol/core/typechain-types'; -import { CurrencyService } from '../payment/currency.service'; +import { PaymentRepository } from '../payment/payment.repository'; +import { getRate } from '../../common/utils'; @Injectable() export class JobService { @@ -66,8 +66,8 @@ export class JobService { @Inject(Web3Service) private readonly web3Service: Web3Service, public readonly jobRepository: JobRepository, - public readonly paymentService: PaymentService, - private readonly currencyService: CurrencyService, + private readonly paymentRepository: PaymentRepository, + private readonly paymentService: PaymentService, public readonly httpService: HttpService, public readonly configService: ConfigService, ) { @@ -111,7 +111,7 @@ export class JobService { 'ether', ); - const rate = await this.currencyService.getRate(Currency.USD, TokenId.HMT); + const rate = await getRate(Currency.USD, TokenId.HMT); const jobLauncherFee = BigNumber.from( this.configService.get(ConfigNames.JOB_LAUNCHER_FEE)!, @@ -159,14 +159,14 @@ export class JobService { throw new NotFoundException(ErrorJob.NotCreated); } - await this.paymentService.savePayment( + await this.paymentRepository.create({ userId, - PaymentSource.BALANCE, - Currency.USD, - TokenId.HMT, - PaymentType.WITHDRAWAL, - usdTotalAmount, - ); + source: PaymentSource.BALANCE, + type: PaymentType.WITHDRAWAL, + amount: usdTotalAmount.toString(), + currency: TokenId.HMT, + rate + }) jobEntity.status = JobStatus.PAID; await jobEntity.save(); @@ -192,7 +192,7 @@ export class JobService { 'ether', ); - const rate = await this.currencyService.getRate(Currency.USD, TokenId.HMT); + const rate = await getRate(Currency.USD, TokenId.HMT); const jobLauncherFee = BigNumber.from( this.configService.get(ConfigNames.JOB_LAUNCHER_FEE)!, @@ -242,14 +242,14 @@ export class JobService { throw new NotFoundException(ErrorJob.NotCreated); } - await this.paymentService.savePayment( + await this.paymentRepository.create({ userId, - PaymentSource.BALANCE, - Currency.USD, - TokenId.HMT, - PaymentType.WITHDRAWAL, - usdTotalAmount, - ); + source: PaymentSource.BALANCE, + type: PaymentType.WITHDRAWAL, + amount: usdTotalAmount.toString(), + currency: TokenId.HMT, + rate + }) jobEntity.status = JobStatus.PAID; await jobEntity.save(); diff --git a/packages/apps/job-launcher/server/src/modules/payment/currency.service.spec.ts b/packages/apps/job-launcher/server/src/modules/payment/currency.service.spec.ts deleted file mode 100644 index e04701d1e8..0000000000 --- a/packages/apps/job-launcher/server/src/modules/payment/currency.service.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CurrencyService } from './currency.service'; -import { HttpService } from '@nestjs/axios'; -import { createMock } from '@golevelup/ts-jest'; -import { Currency, TokenId } from '../../common/enums/payment'; -import { COINGECKO_API_URL } from '../../common/constants'; -import { ErrorCurrency } from '../../common/constants/errors'; -import { of } from 'rxjs'; -import { CoingeckoTokenId } from '../../common/constants/payment'; - -describe('CurrencyService', () => { - let currencyService: CurrencyService; - let httpService: HttpService; - - beforeAll(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ - CurrencyService, - { - provide: HttpService, - useValue: createMock(), - }, - ], - }).compile(); - - currencyService = module.get(CurrencyService); - httpService = module.get(HttpService); - }); - - describe('getRate', () => { - it('should get the rate for a given usd to other fiat currency and reverse it', async () => { - const currency = Currency.USD; - const otherCurrency = Currency.EUR; - const rate = 0.9; - const reversedRate = 1.1111111111111112; - - const response = { - data: { - [currency]: { - [otherCurrency]: rate, - }, - }, - }; - - jest.spyOn(httpService, 'get').mockReturnValueOnce(of(response as any)); - const result = await currencyService.getRate(currency, otherCurrency); - - expect(httpService.get).toHaveBeenCalledWith( - `${COINGECKO_API_URL}?ids=${currency}&vs_currencies=${otherCurrency}`, - ); - expect(result).toBe(reversedRate); - }); - - it('should get the rate for a given token ID and currency', async () => { - const tokenId = TokenId.HMT; - const currency = Currency.USD; - const rate = 1.5; - - const response = { - data: { - [CoingeckoTokenId[tokenId]]: { - [currency]: rate, - }, - }, - }; - - jest.spyOn(httpService, 'get').mockReturnValueOnce(of(response as any)); - const result = await currencyService.getRate(currency, tokenId); - - expect(httpService.get).toHaveBeenCalledWith( - `${COINGECKO_API_URL}?ids=${CoingeckoTokenId[tokenId]}&vs_currencies=${currency}`, - ); - expect(result).toBe(rate); - }); - - it('should throw NotFoundException if the rate is not found', async () => { - const tokenId = TokenId.HMT; - const currency = Currency.USD; - - const response = { - data: {}, - }; - - jest.spyOn(httpService, 'get').mockReturnValueOnce(of(response as any)); - - await expect(currencyService.getRate(currency, tokenId)).rejects.toThrow( - ErrorCurrency.PairNotFound, - ); - }); - }); -}); diff --git a/packages/apps/job-launcher/server/src/modules/payment/currency.service.ts b/packages/apps/job-launcher/server/src/modules/payment/currency.service.ts deleted file mode 100644 index 54889c1db3..0000000000 --- a/packages/apps/job-launcher/server/src/modules/payment/currency.service.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { HttpService } from '@nestjs/axios'; -import { Injectable, NotFoundException } from '@nestjs/common'; -import { firstValueFrom } from 'rxjs'; -import { COINGECKO_API_URL } from '../../common/constants'; -import { ErrorCurrency } from '../../common/constants/errors'; -import { TokenId } from '../../common/enums/payment'; -import { CoingeckoTokenId } from '../../common/constants/payment'; - -@Injectable() -export class CurrencyService { - constructor(private readonly httpService: HttpService) {} - - public async getRate(from: string, to: string): Promise { - let reversed = false; - - if (Object.values(TokenId).includes(to as TokenId)) { - [from, to] = [CoingeckoTokenId[to], from]; - } else { - reversed = true; - } - - const { data } = await firstValueFrom( - this.httpService.get( - `${COINGECKO_API_URL}?ids=${from}&vs_currencies=${to}`, - ), - ); - - if (!data[from] || !data[from][to]) { - throw new NotFoundException(ErrorCurrency.PairNotFound); - } - - const rate = data[from][to]; - - return reversed ? 1 / rate : rate; - } -} diff --git a/packages/apps/job-launcher/server/src/modules/payment/payment.controller.ts b/packages/apps/job-launcher/server/src/modules/payment/payment.controller.ts index 9aee123aed..7b5d49ee54 100644 --- a/packages/apps/job-launcher/server/src/modules/payment/payment.controller.ts +++ b/packages/apps/job-launcher/server/src/modules/payment/payment.controller.ts @@ -10,7 +10,6 @@ import { import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { JwtAuthGuard } from 'src/common/guards'; -import { CurrencyService } from './currency.service'; import { GetRateDto, PaymentCryptoCreateDto, @@ -18,6 +17,7 @@ import { PaymentFiatCreateDto, } from './payment.dto'; import { PaymentService } from './payment.service'; +import { getRate } from '../../common/utils'; @ApiBearerAuth() @UseGuards(JwtAuthGuard) @@ -26,7 +26,6 @@ import { PaymentService } from './payment.service'; export class PaymentController { constructor( private readonly paymentService: PaymentService, - private readonly currencyService: CurrencyService, ) {} @Post('/fiat') @@ -59,7 +58,7 @@ export class PaymentController { @Get('/rates') public async getRate(@Query() data: GetRateDto): Promise { try { - return this.currencyService.getRate(data.currency, data.token); + return getRate(data.currency, data.token); } catch (e) { throw new Error(e); } diff --git a/packages/apps/job-launcher/server/src/modules/payment/payment.module.ts b/packages/apps/job-launcher/server/src/modules/payment/payment.module.ts index 0047ce925d..15eb85aaca 100644 --- a/packages/apps/job-launcher/server/src/modules/payment/payment.module.ts +++ b/packages/apps/job-launcher/server/src/modules/payment/payment.module.ts @@ -1,7 +1,6 @@ import { Module } from '@nestjs/common'; import { PaymentService } from './payment.service'; -import { CurrencyService } from './currency.service'; import { MinioModule } from 'nestjs-minio-client'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { PaymentEntity } from './payment.entity'; @@ -32,7 +31,7 @@ import { Web3Module } from '../web3/web3.module'; }), ], controllers: [PaymentController], - providers: [PaymentService, PaymentRepository, CurrencyService], - exports: [PaymentService, CurrencyService], + providers: [PaymentService, PaymentRepository], + exports: [PaymentService, PaymentRepository], }) export class PaymentModule {} diff --git a/packages/apps/job-launcher/server/src/modules/payment/payment.service.spec.ts b/packages/apps/job-launcher/server/src/modules/payment/payment.service.spec.ts index c2748c3530..d53ba89b34 100644 --- a/packages/apps/job-launcher/server/src/modules/payment/payment.service.spec.ts +++ b/packages/apps/job-launcher/server/src/modules/payment/payment.service.spec.ts @@ -6,9 +6,8 @@ import { PaymentRepository } from './payment.repository'; import { ConfigService } from '@nestjs/config'; import { HttpService } from '@nestjs/axios'; import { BigNumber } from 'ethers'; -import { createMock, DeepMocked } from '@golevelup/ts-jest'; +import { createMock } from '@golevelup/ts-jest'; import { ErrorPayment } from '../../common/constants/errors'; -import { CurrencyService } from './currency.service'; import { TransactionReceipt, Log } from '@ethersproject/abstract-provider'; import { Currency, @@ -31,11 +30,14 @@ import { ChainId } from '@human-protocol/sdk'; jest.mock('@human-protocol/sdk'); +jest.mock('../../common/utils', () => ({ + getRate: jest.fn().mockImplementation(() => 0.5) +})); + describe('PaymentService', () => { let stripe: Stripe; let paymentService: PaymentService; let paymentRepository: PaymentRepository; - let currencyService: CurrencyService; const signerMock = { address: MOCK_ADDRESS, @@ -75,16 +77,13 @@ describe('PaymentService', () => { getSigner: jest.fn().mockReturnValue(signerMock), }, }, - { provide: CurrencyService, useValue: createMock() }, { provide: ConfigService, useValue: mockConfigService }, { provide: HttpService, useValue: createMock() }, ], - exports: [CurrencyService], }).compile(); paymentService = moduleRef.get(PaymentService); paymentRepository = moduleRef.get(PaymentRepository); - currencyService = moduleRef.get(CurrencyService); const stripeCustomersCreateMock = jest.fn(); const stripePaymentIntentsCreateMock = jest.fn(); @@ -200,6 +199,13 @@ describe('PaymentService', () => { }); describe('confirmFiatPayment', () => { + let createPaymentMock: any; + + beforeEach(() => { + createPaymentMock = jest.spyOn(paymentRepository, 'create'); + createPaymentMock.mockResolvedValue(true); + }); + it('should confirm a fiat payment successfully', async () => { const userId = 1; const dto = { @@ -218,21 +224,18 @@ describe('PaymentService', () => { .mockResolvedValue( paymentData as Stripe.Response, ); - jest.spyOn(paymentService, 'savePayment').mockResolvedValue(true); - - jest.spyOn(currencyService, 'getRate').mockResolvedValue(rate); const result = await paymentService.confirmFiatPayment(userId, dto); expect(paymentService.getPayment).toHaveBeenCalledWith(dto.paymentId); - expect(paymentService.savePayment).toHaveBeenCalledWith( + expect(paymentRepository.create).toHaveBeenCalledWith({ userId, - PaymentSource.FIAT, - Currency.USD, - Currency.EUR, - PaymentType.DEPOSIT, - BigNumber.from(paymentData.amount), - ); + source: PaymentSource.FIAT, + currency: Currency.EUR, + type: PaymentType.DEPOSIT, + amount: paymentData.amount!.toString(), + rate: 0.5 + }); expect(result).toBe(true); }); @@ -273,12 +276,11 @@ describe('PaymentService', () => { }); describe('confirmFiatPayment', () => { - let getPaymentMock: any, savePaymentMock: any, getRateMock: any; + let getPaymentMock: any, createPaymentMock: any; beforeEach(() => { getPaymentMock = jest.spyOn(paymentService, 'getPayment'); - savePaymentMock = jest.spyOn(paymentService, 'savePayment'); - getRateMock = jest.spyOn(currencyService, 'getRate'); + createPaymentMock = jest.spyOn(paymentRepository, 'create'); }); afterEach(() => { @@ -299,20 +301,19 @@ describe('PaymentService', () => { }; getPaymentMock.mockResolvedValue(paymentData); - savePaymentMock.mockResolvedValue(true); - getRateMock.mockResolvedValue(rate); + createPaymentMock.mockResolvedValue(true); const result = await paymentService.confirmFiatPayment(userId, dto); expect(paymentService.getPayment).toHaveBeenCalledWith(dto.paymentId); - expect(paymentService.savePayment).toHaveBeenCalledWith( + expect(paymentRepository.create).toHaveBeenCalledWith({ userId, - PaymentSource.FIAT, - Currency.USD, - Currency.EUR, - PaymentType.DEPOSIT, - BigNumber.from(paymentData.amount), - ); + source: PaymentSource.FIAT, + currency: Currency.EUR, + type: PaymentType.DEPOSIT, + amount: paymentData.amount.toString(), + rate: 0.5 + }); expect(result).toBe(true); }); @@ -349,7 +350,7 @@ describe('PaymentService', () => { }); describe('createCryptoPayment', () => { - let jsonRpcProviderMock: any, findOneMock: any, savePaymentMock: any; + let jsonRpcProviderMock: any, findOneMock: any, createPaymentMock: any; const mockTokenContract: any = { symbol: jest.fn(), @@ -369,7 +370,7 @@ describe('PaymentService', () => { .mockReturnValue(mockTokenContract); jest.spyOn(mockTokenContract, 'symbol'); findOneMock = jest.spyOn(paymentRepository, 'findOne'); - savePaymentMock = jest.spyOn(paymentService, 'savePayment'); + createPaymentMock = jest.spyOn(paymentRepository, 'create'); }); afterEach(() => { @@ -409,22 +410,21 @@ describe('PaymentService', () => { mockTokenContract.symbol.mockResolvedValue(token); findOneMock.mockResolvedValue(null); - savePaymentMock.mockResolvedValue(true); + createPaymentMock.mockResolvedValue(true); const result = await paymentService.createCryptoPayment(userId, dto); expect(paymentRepository.findOne).toHaveBeenCalledWith({ transactionHash: dto.transactionHash, }); - expect(paymentService.savePayment).toHaveBeenCalledWith( + expect(paymentRepository.create).toHaveBeenCalledWith({ userId, - PaymentSource.CRYPTO, - Currency.USD, - TokenId.HMT, - PaymentType.DEPOSIT, - BigNumber.from('100'), - MOCK_TRANSACTION_HASH, - ); + source: PaymentSource.CRYPTO, + type: PaymentType.DEPOSIT, + currency: TokenId.HMT, + amount: '100', + rate: 0.5 + }); expect(result).toBe(true); }); diff --git a/packages/apps/job-launcher/server/src/modules/payment/payment.service.ts b/packages/apps/job-launcher/server/src/modules/payment/payment.service.ts index 7d99b8a238..26c9ffc0ce 100644 --- a/packages/apps/job-launcher/server/src/modules/payment/payment.service.ts +++ b/packages/apps/job-launcher/server/src/modules/payment/payment.service.ts @@ -10,7 +10,6 @@ import Stripe from 'stripe'; import { BigNumber, FixedNumber, ethers, providers } from 'ethers'; import { ErrorPayment } from '../../common/constants/errors'; import { PaymentRepository } from './payment.repository'; -import { CurrencyService } from './currency.service'; import { PaymentCryptoCreateDto, PaymentFiatConfirmDto, @@ -32,6 +31,7 @@ import { } from '@human-protocol/core/typechain-types'; import { Web3Service } from '../web3/web3.service'; import { CoingeckoTokenId } from '../../common/constants/payment'; +import { getRate } from '../../common/utils'; @Injectable() export class PaymentService { @@ -41,7 +41,6 @@ export class PaymentService { constructor( private readonly web3Service: Web3Service, private readonly paymentRepository: PaymentRepository, - private readonly currencyService: CurrencyService, private configService: ConfigService, ) { this.stripe = new Stripe( @@ -122,14 +121,16 @@ export class PaymentService { throw new BadRequestException(ErrorPayment.NotSuccess); } - await this.savePayment( + const rate = await getRate(Currency.USD, paymentData.currency.toLowerCase()); + + await this.paymentRepository.create({ userId, - PaymentSource.FIAT, - Currency.USD, - paymentData.currency.toLowerCase(), - PaymentType.DEPOSIT, - BigNumber.from(paymentData.amount), - ); + source: PaymentSource.FIAT, + type: PaymentType.DEPOSIT, + amount: BigNumber.from(paymentData.amount).toString(), + currency: paymentData.currency.toLowerCase(), + rate + }) return true; } @@ -204,15 +205,16 @@ export class PaymentService { throw new BadRequestException(ErrorPayment.TransactionHashAlreadyExists); } - await this.savePayment( + const rate = await getRate(Currency.USD, TokenId.HMT); + + await this.paymentRepository.create({ userId, - PaymentSource.CRYPTO, - Currency.USD, - TokenId.HMT, - PaymentType.DEPOSIT, - amount, - transaction.transactionHash, - ); + source: PaymentSource.CRYPTO, + type: PaymentType.DEPOSIT, + amount: amount.toString(), + currency: TokenId.HMT, + rate + }) return true; } @@ -223,35 +225,6 @@ export class PaymentService { return this.stripe.paymentIntents.retrieve(paymentId); } - public async savePayment( - userId: number, - source: PaymentSource, - currencyFrom: string, - currencyTo: string, - type: PaymentType, - amount: BigNumber, - transactionHash?: string, - ): Promise { - const rate = await this.currencyService.getRate(currencyFrom, currencyTo); - - const paymentEntity = await this.paymentRepository.create({ - userId, - amount: amount.toString(), - currency: currencyTo, - source, - rate, - type, - transactionHash, - }); - - if (!paymentEntity) { - this.logger.log(ErrorPayment.NotFound, PaymentService.name); - throw new NotFoundException(ErrorPayment.NotFound); - } - - return true; - } - public async getUserBalance(userId: number): Promise { const paymentEntities = await this.paymentRepository.find({ userId });