mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 20:30:33 +00:00
feat(server): ability to assign the base currency as api query when getting latest ex. rate
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
import { Service, Inject } from 'typedi';
|
||||
import { Router, Request, Response, NextFunction } from 'express';
|
||||
import { query } from 'express-validator';
|
||||
import { query, oneOf } from 'express-validator';
|
||||
import asyncMiddleware from '@/api/middleware/asyncMiddleware';
|
||||
import BaseController from './BaseController';
|
||||
import { ServiceError } from '@/exceptions';
|
||||
@@ -20,7 +20,12 @@ export default class ExchangeRatesController extends BaseController {
|
||||
|
||||
router.get(
|
||||
'/latest',
|
||||
[query('to_currency').exists().isString()],
|
||||
[
|
||||
oneOf([
|
||||
query('to_currency').exists().isString().isISO4217(),
|
||||
query('from_currency').exists().isString().isISO4217(),
|
||||
]),
|
||||
],
|
||||
this.validationResult,
|
||||
asyncMiddleware(this.latestExchangeRate.bind(this)),
|
||||
this.handleServiceError
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
export interface ExchangeRateLatestDTO {
|
||||
toCurrency: string;
|
||||
fromCurrency: string;
|
||||
}
|
||||
|
||||
export interface EchangeRateLatestPOJO {
|
||||
|
||||
@@ -2,6 +2,7 @@ import { Service } from 'typedi';
|
||||
import { ExchangeRate } from '@/lib/ExchangeRate/ExchangeRate';
|
||||
import { ExchangeRateServiceType } from '@/lib/ExchangeRate/types';
|
||||
import { EchangeRateLatestPOJO, ExchangeRateLatestDTO } from '@/interfaces';
|
||||
import { TenantMetadata } from '@/system/models';
|
||||
|
||||
@Service()
|
||||
export class ExchangeRatesService {
|
||||
@@ -15,14 +16,20 @@ export class ExchangeRatesService {
|
||||
tenantId: number,
|
||||
exchangeRateLatestDTO: ExchangeRateLatestDTO
|
||||
): Promise<EchangeRateLatestPOJO> {
|
||||
const organization = await TenantMetadata.query().findOne({ tenantId });
|
||||
|
||||
// Assign the organization base currency as a default currency
|
||||
// if no currency is provided
|
||||
const fromCurrency =
|
||||
exchangeRateLatestDTO.fromCurrency || organization.baseCurrency;
|
||||
const toCurrency =
|
||||
exchangeRateLatestDTO.toCurrency || organization.baseCurrency;
|
||||
|
||||
const exchange = new ExchangeRate(ExchangeRateServiceType.OpenExchangeRate);
|
||||
const exchangeRate = await exchange.latest(
|
||||
'USD',
|
||||
exchangeRateLatestDTO.toCurrency
|
||||
);
|
||||
const exchangeRate = await exchange.latest(fromCurrency, toCurrency);
|
||||
|
||||
return {
|
||||
baseCurrency: 'USD',
|
||||
baseCurrency: fromCurrency,
|
||||
toCurrency: exchangeRateLatestDTO.toCurrency,
|
||||
exchangeRate,
|
||||
};
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import BaseModel from 'models/Model';
|
||||
|
||||
export default class TenantMetadata extends BaseModel {
|
||||
baseCurrency: string;
|
||||
|
||||
/**
|
||||
* Table name.
|
||||
*/
|
||||
|
||||
@@ -20,13 +20,16 @@ function AutoExchangeRateProvider({ children }: AutoExchangeRateProviderProps) {
|
||||
|
||||
// Retrieves the exchange rate.
|
||||
const { data: autoExchangeRate, isLoading: isAutoExchangeRateLoading } =
|
||||
useLatestExchangeRate(autoExRateCurrency, {
|
||||
enabled: Boolean(autoExRateCurrency),
|
||||
refetchOnWindowFocus: false,
|
||||
staleTime: 0,
|
||||
cacheTime: 0,
|
||||
retry: 0,
|
||||
});
|
||||
useLatestExchangeRate(
|
||||
{ fromCurrency: autoExRateCurrency },
|
||||
{
|
||||
enabled: Boolean(autoExRateCurrency),
|
||||
refetchOnWindowFocus: false,
|
||||
staleTime: 0,
|
||||
cacheTime: 0,
|
||||
retry: 0,
|
||||
},
|
||||
);
|
||||
|
||||
const value = {
|
||||
autoExRateCurrency,
|
||||
|
||||
@@ -3,15 +3,23 @@ import { useQuery } from 'react-query';
|
||||
import QUERY_TYPES from './types';
|
||||
import useApiRequest from '../useRequest';
|
||||
|
||||
interface LatestExchangeRateQuery {
|
||||
fromCurrency?: string;
|
||||
toCurrency?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves latest exchange rate.
|
||||
* @param {number} customerId - Customer id.
|
||||
*/
|
||||
export function useLatestExchangeRate(toCurrency: string, props) {
|
||||
export function useLatestExchangeRate(
|
||||
{ toCurrency, fromCurrency }: LatestExchangeRateQuery,
|
||||
props,
|
||||
) {
|
||||
const apiRequest = useApiRequest();
|
||||
|
||||
return useQuery(
|
||||
[QUERY_TYPES.EXCHANGE_RATE, toCurrency],
|
||||
[QUERY_TYPES.EXCHANGE_RATE, toCurrency, fromCurrency],
|
||||
() =>
|
||||
apiRequest
|
||||
.http({
|
||||
@@ -19,6 +27,7 @@ export function useLatestExchangeRate(toCurrency: string, props) {
|
||||
method: 'get',
|
||||
params: {
|
||||
to_currency: toCurrency,
|
||||
from_currency: fromCurrency,
|
||||
},
|
||||
})
|
||||
.then((res) => res.data),
|
||||
|
||||
Reference in New Issue
Block a user