// @ts-nocheck import { Injectable } from '@nestjs/common'; import { isEmpty } from 'lodash'; interface MutateBaseCurrencyLockMeta { modelName: string; pluralName?: string; } @Injectable() export class OrganizationBaseCurrencyLocking { /** * Retrieves the tenant models that have prevented mutation base currency. */ private getModelsPreventsMutate = (tenantId: number) => { const Models = this.tenancy.models(tenantId); const filteredEntries = Object.entries(Models).filter( ([key, Model]) => !!Model.preventMutateBaseCurrency, ); return Object.fromEntries(filteredEntries); }; /** * Detarmines the mutation base currency model is locked. * @param {Model} Model * @returns {Promise} */ private isModelMutateLocked = async ( Model, ): Promise => { const validateQuery = Model.query(); if (typeof Model?.modifiers?.preventMutateBaseCurrency !== 'undefined') { validateQuery.modify('preventMutateBaseCurrency'); } else { validateQuery.select(['id']).first(); } const validateResult = await validateQuery; const isValid = !isEmpty(validateResult); return isValid ? { modelName: Model.name, pluralName: Model.pluralName, } : false; }; /** * Retrieves the base currency mutation locks of the tenant models. * @param {number} tenantId * @returns {Promise} */ public async baseCurrencyMutateLocks( tenantId: number, ): Promise { const PreventedModels = this.getModelsPreventsMutate(tenantId); const opers = Object.entries(PreventedModels).map(([ModelName, Model]) => this.isModelMutateLocked(Model), ); const results = await Promise.all(opers); return results.filter( (result) => result !== false, ) as MutateBaseCurrencyLockMeta[]; } /** * Detarmines the base currency mutation locked. * @param {number} tenantId * @returns {Promise} */ public isBaseCurrencyMutateLocked = async (tenantId: number) => { const locks = await this.baseCurrencyMutateLocks(tenantId); return !isEmpty(locks); }; }