UNPKG

@accounter/server

Version:

185 lines • 6.76 kB
import { __decorate, __metadata } from "tslib"; import DataLoader from 'dataloader'; import { Injectable, Scope } from 'graphql-modules'; import { DBProvider } from '../../app-providers/db.provider.js'; import { sql } from '@pgtyped/runtime'; import { getCacheInstance } from '../../../shared/helpers/index.js'; const getExpensesByChargeIds = sql ` SELECT * FROM accounter_schema.misc_expenses WHERE charge_id IN $$chargeIds;`; const getExpensesByIds = sql ` SELECT * FROM accounter_schema.misc_expenses WHERE id IN $$ids;`; const getExpensesByFinancialEntityIds = sql ` SELECT * FROM accounter_schema.misc_expenses WHERE creditor_id IN $$financialEntityIds OR debtor_id IN $$financialEntityIds;`; const updateExpense = sql ` UPDATE accounter_schema.misc_expenses SET charge_id = COALESCE( $chargeId, charge_id ), creditor_id = COALESCE( $creditorId, creditor_id ), debtor_id = COALESCE( $debtorId, debtor_id ), amount = COALESCE( $amount, amount ), currency = COALESCE( $currency, currency ), description = COALESCE( $description, description ), invoice_date = COALESCE( $invoiceDate, invoice_date ), value_date = COALESCE( $valueDate, value_date ) WHERE id = $miscExpenseId RETURNING *;`; const insertExpense = sql ` INSERT INTO accounter_schema.misc_expenses (charge_id, creditor_id, debtor_id, amount, currency, description, invoice_date, value_date) VALUES ($chargeId, $creditorId, $debtorId, $amount, $currency, $description, $invoiceDate, $valueDate) RETURNING *;`; const deleteExpense = sql ` DELETE FROM accounter_schema.misc_expenses WHERE id = $id RETURNING id;`; let MiscExpensesProvider = class MiscExpensesProvider { dbProvider; cache = getCacheInstance({ stdTTL: 60 * 5, }); constructor(dbProvider) { this.dbProvider = dbProvider; } async batchExpensesByChargeIds(chargeIds) { const expenses = await getExpensesByChargeIds.run({ chargeIds }, this.dbProvider); const expensesByChargeId = new Map(); expenses.map(expense => { if (expensesByChargeId.has(expense.charge_id)) { expensesByChargeId.get(expense.charge_id)?.push(expense); } else { expensesByChargeId.set(expense.charge_id, [expense]); } }); return chargeIds.map(id => expensesByChargeId.get(id) ?? []); } getExpensesByChargeIdLoader = new DataLoader((chargeIds) => this.batchExpensesByChargeIds(chargeIds), { cacheKeyFn: key => `misc-expenses-charge-${key}`, cacheMap: this.cache, }); async batchExpensesByFinancialEntityIds(financialEntityIds) { const expenses = await getExpensesByFinancialEntityIds.run({ financialEntityIds }, this.dbProvider); const expensesByFinancialEntityId = new Map(); expenses.map(expense => { if (expensesByFinancialEntityId.has(expense.creditor_id)) { expensesByFinancialEntityId.get(expense.creditor_id)?.push(expense); } else { expensesByFinancialEntityId.set(expense.creditor_id, [expense]); } if (expensesByFinancialEntityId.has(expense.debtor_id)) { expensesByFinancialEntityId.get(expense.debtor_id)?.push(expense); } else { expensesByFinancialEntityId.set(expense.debtor_id, [expense]); } }); return financialEntityIds.map(id => expensesByFinancialEntityId.get(id) ?? []); } getExpensesByFinancialEntityIdLoader = new DataLoader((financialEntityIds) => this.batchExpensesByFinancialEntityIds(financialEntityIds), { cacheKeyFn: key => `misc-expenses-financial-entity-${key}`, cacheMap: this.cache, }); async batchExpensesByIds(ids) { const expenses = await getExpensesByIds.run({ ids }, this.dbProvider); return ids.map(id => expenses.find(expense => expense.id === id)); } getExpensesByIdLoader = new DataLoader((ids) => this.batchExpensesByIds(ids), { cacheKeyFn: key => `misc-expenses-${key}`, cacheMap: this.cache, }); async updateExpense(params) { if (params.miscExpenseId) await this.invalidateById(params.miscExpenseId); return updateExpense.run(params, this.dbProvider); } async insertExpense(params) { if (params.chargeId) await this.invalidateByChargeId(params.chargeId); return insertExpense.run(params, this.dbProvider); } async deleteMiscExpense(params) { if (params.id) await this.invalidateById(params.id); return deleteExpense.run(params, this.dbProvider); } async invalidateByChargeId(chargeId) { try { const expenses = await this.getExpensesByChargeIdLoader.load(chargeId); await Promise.all(expenses.map(({ id }) => this.invalidateById(id))); this.cache.delete(`misc-expenses-charge-${chargeId}`); } catch (error) { console.error(error); throw new Error(`Error invalidating misc expense by charge id: ${chargeId}`); } } async invalidateByFinancialEntityId(financialEntityId) { try { const expenses = await this.getExpensesByFinancialEntityIdLoader.load(financialEntityId); await Promise.all(expenses.map(({ id }) => this.invalidateById(id))); this.cache.delete(`misc-expenses-financial-entity-${financialEntityId}`); } catch (error) { console.error(error); throw new Error(`Error invalidating misc expense by financial entity id: ${financialEntityId}`); } } async invalidateById(id) { try { const expense = await this.getExpensesByIdLoader.load(id); if (expense) { this.cache.delete(`misc-expenses-charge-${expense.charge_id}`); this.cache.delete(`misc-expenses-financial-entity-${expense.creditor_id}`); this.cache.delete(`misc-expenses-financial-entity-${expense.debtor_id}`); } this.cache.delete(`misc-expenses-${id}`); } catch (error) { console.error(error); throw new Error(`Error invalidating misc expense by id: ${id}`); } } clearCache() { this.cache.clear(); } }; MiscExpensesProvider = __decorate([ Injectable({ scope: Scope.Singleton, global: true, }), __metadata("design:paramtypes", [DBProvider]) ], MiscExpensesProvider); export { MiscExpensesProvider }; //# sourceMappingURL=misc-expenses.provider.js.map