From 6bd30abddbfbf7669a8fe8e6634fc36b154c4a28 Mon Sep 17 00:00:00 2001 From: "a.bouhuolia" Date: Fri, 14 Apr 2023 03:45:09 +0200 Subject: [PATCH] fix(server): prevent delete base currency --- .../services/Currencies/CurrenciesService.ts | 54 ++++++++----------- .../Currencies/CurrencyTransformer.ts | 19 +++++++ 2 files changed, 41 insertions(+), 32 deletions(-) create mode 100644 packages/server/src/services/Currencies/CurrencyTransformer.ts diff --git a/packages/server/src/services/Currencies/CurrenciesService.ts b/packages/server/src/services/Currencies/CurrenciesService.ts index 342a02e9f..97cdae4e8 100644 --- a/packages/server/src/services/Currencies/CurrenciesService.ts +++ b/packages/server/src/services/Currencies/CurrenciesService.ts @@ -1,18 +1,15 @@ import { Inject, Service } from 'typedi'; -import { uniq } from 'lodash'; - import { ICurrencyEditDTO, ICurrencyDTO, ICurrenciesService, ICurrency, } from '@/interfaces'; -import { - EventDispatcher, - EventDispatcherInterface, -} from 'decorators/eventDispatcher'; import { ServiceError } from '@/exceptions'; import TenancyService from '@/services/Tenancy/TenancyService'; +import { Tenant } from '@/system/models'; +import { TransformerInjectable } from '@/lib/Transformer/TransformerInjectable'; +import { CurrencyTransformer } from './CurrencyTransformer'; const ERRORS = { CURRENCY_NOT_FOUND: 'currency_not_found', @@ -23,14 +20,11 @@ const ERRORS = { @Service() export default class CurrenciesService implements ICurrenciesService { - @Inject('logger') - logger: any; - - @EventDispatcher() - eventDispatcher: EventDispatcherInterface; + @Inject() + private tenancy: TenancyService; @Inject() - tenancy: TenancyService; + private transformer: TransformerInjectable; /** * Retrieve currency by given currency code or throw not found error. @@ -105,7 +99,7 @@ export default class CurrenciesService implements ICurrenciesService { */ public async newCurrency(tenantId: number, currencyDTO: ICurrencyDTO) { const { Currency } = this.tenancy.models(tenantId); - + // Validate currency code uniquiness. await this.validateCurrencyCodeUniquiness( tenantId, @@ -141,13 +135,15 @@ export default class CurrenciesService implements ICurrenciesService { * @param {number} tenantId * @param {string} currencyCode */ - validateCannotDeleteBaseCurrency(tenantId: number, currencyCode: string) { - const settings = this.tenancy.settings(tenantId); - const baseCurrency = settings.get({ - group: 'organization', - key: 'base_currency', - }); - if (baseCurrency === currencyCode) { + private async validateCannotDeleteBaseCurrency( + tenantId: number, + currencyCode: string + ) { + const tenant = await Tenant.query() + .findById(tenantId) + .withGraphFetched('metadata'); + + if (tenant.metadata.baseCurrency === currencyCode) { throw new ServiceError(ERRORS.CANNOT_DELETE_BASE_CURRENCY); } } @@ -156,7 +152,7 @@ export default class CurrenciesService implements ICurrenciesService { * Delete the given currency code. * @param {number} tenantId * @param {string} currencyCode - * @return {Promise<} + * @return {Promise} */ public async deleteCurrency( tenantId: number, @@ -180,19 +176,13 @@ export default class CurrenciesService implements ICurrenciesService { public async listCurrencies(tenantId: number): Promise { const { Currency } = this.tenancy.models(tenantId); - const settings = this.tenancy.settings(tenantId); - const baseCurrency = settings.get({ - group: 'organization', - key: 'base_currency', - }); - const currencies = await Currency.query().onBuild((query) => { query.orderBy('createdAt', 'ASC'); }); - const formattedCurrencies = currencies.map((currency) => ({ - isBaseCurrency: baseCurrency === currency.currencyCode, - ...currency, - })); - return formattedCurrencies; + return this.transformer.transform( + tenantId, + currencies, + new CurrencyTransformer() + ); } } diff --git a/packages/server/src/services/Currencies/CurrencyTransformer.ts b/packages/server/src/services/Currencies/CurrencyTransformer.ts new file mode 100644 index 000000000..c29704cac --- /dev/null +++ b/packages/server/src/services/Currencies/CurrencyTransformer.ts @@ -0,0 +1,19 @@ +import { Transformer } from '@/lib/Transformer/Transformer'; + +export class CurrencyTransformer extends Transformer { + /** + * Include these attributes to sale invoice object. + * @returns {Array} + */ + public includeAttributes = (): string[] => { + return ['isBaseCurrency']; + }; + + /** + * Detarmines whether the currency is base currency. + * @returns {boolean} + */ + public isBaseCurrency(currency): boolean { + return this.context.organization.baseCurrency === currency.currencyCode; + } +}