From f0826da329568e48056c8a412617ccb6f3af7ba6 Mon Sep 17 00:00:00 2001 From: Dmitry Sviridenko Date: Tue, 27 Jun 2023 19:43:56 +0300 Subject: [PATCH 1/2] feat: Add `custom` field to exchange rates response --- src/models/ExchangeRates.model.ts | 9 +++++++-- src/models/UserExchangeRates.model.ts | 14 ++++++++++---- .../get-exchange-rate.service.ts | 9 ++++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/models/ExchangeRates.model.ts b/src/models/ExchangeRates.model.ts index dea05323..74b80471 100644 --- a/src/models/ExchangeRates.model.ts +++ b/src/models/ExchangeRates.model.ts @@ -8,6 +8,11 @@ import { Op } from 'sequelize'; import { Transaction } from 'sequelize/types'; import Currencies from './Currencies.model'; +interface ModelOptions { + transaction?: Transaction, + raw?: boolean, +} + @Table({ timestamps: true, createdAt: 'date', @@ -45,7 +50,7 @@ export async function getRatesForCurrenciesPairs( baseCode: string; quoteCode: string; }[], - { transaction }: { transaction?: Transaction } = {}, + modelOptions: ModelOptions, ) { return ExchangeRates.findAll({ where: { @@ -56,6 +61,6 @@ export async function getRatesForCurrenciesPairs( } })) }, - transaction, + ...modelOptions, }) } diff --git a/src/models/UserExchangeRates.model.ts b/src/models/UserExchangeRates.model.ts index 627139b2..273000d7 100644 --- a/src/models/UserExchangeRates.model.ts +++ b/src/models/UserExchangeRates.model.ts @@ -10,6 +10,11 @@ import Currencies, { getCurrencies } from './Currencies.model'; import Users from './Users.model'; import { ValidationError } from '@js/errors'; +interface ModelOptions { + transaction?: Transaction, + raw?: boolean, +} + @Table({ timestamps: true }) export default class UserExchangeRates extends Model { @Column({ @@ -48,11 +53,11 @@ export interface ExchangeRatePair { } export async function getRates( { userId, pair }: { userId: number; pair: ExchangeRatePair }, - { transaction }: { transaction?: Transaction }, + modelOptions: ModelOptions, ); export async function getRates( { userId, pairs }: { userId: number; pairs: ExchangeRatePair[] }, - { transaction }: { transaction?: Transaction }, + modelOptions: ModelOptions, ); export async function getRates( { @@ -64,7 +69,7 @@ export async function getRates( pair?: ExchangeRatePair, pairs?: ExchangeRatePair[], }, - { transaction }: { transaction?: Transaction } = {}, + modelOptions: ModelOptions, ) { const where: Record = { userId, @@ -95,7 +100,8 @@ export async function getRates( return UserExchangeRates.findAll({ where, - transaction, + attributes: { exclude: ['userId'] }, + ...modelOptions, }) } diff --git a/src/services/user-exchange-rate/get-exchange-rate.service.ts b/src/services/user-exchange-rate/get-exchange-rate.service.ts index 4c854e46..93ed1d8f 100644 --- a/src/services/user-exchange-rate/get-exchange-rate.service.ts +++ b/src/services/user-exchange-rate/get-exchange-rate.service.ts @@ -43,13 +43,16 @@ export async function getExchangeRate( const [userExchangeRate] = await UserExchangeRates.getRates({ userId, pair, - }, { transaction }); + }, { transaction, raw: true }); - if (userExchangeRate) return userExchangeRate + if (userExchangeRate) { + // Add `custom` so client can understand which rate is custom + return { ...userExchangeRate, custom: true } + } const [exchangeRate] = await ExchangeRates.getRatesForCurrenciesPairs( [pair], - { transaction }, + { transaction, raw: true }, ); return exchangeRate; From ff52ba78287965faeea38e177ffaf3b2a798b6f1 Mon Sep 17 00:00:00 2001 From: Dmitry Sviridenko Date: Tue, 27 Jun 2023 20:01:41 +0300 Subject: [PATCH 2/2] feat: Add a bit of docs --- .../user-exchange-rate/get-user-exchange-rates.service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/services/user-exchange-rate/get-user-exchange-rates.service.ts b/src/services/user-exchange-rate/get-user-exchange-rates.service.ts index 98eaab8a..ddd56c97 100644 --- a/src/services/user-exchange-rate/get-user-exchange-rates.service.ts +++ b/src/services/user-exchange-rate/get-user-exchange-rates.service.ts @@ -5,6 +5,13 @@ import * as UsersCurrencies from '@models/UsersCurrencies.model'; import { getExchangeRate } from './get-exchange-rate.service'; +/** + * By default we just return system exchange rates from ExchangeRates table. + * If user wants to edit exchange rate, he can add one to UserExchangeRates, so + * then we will return and use his custom rate. If user wants to use system rate + * back, we need to remove his custom record from UserExchangeRates table + */ + export async function getUserExchangeRates( { userId }: { userId: number }, { transaction }: { transaction?: Transaction } = {},