mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 12:20:31 +00:00
fix: Database connection lost error
This commit is contained in:
@@ -32,7 +32,7 @@ module.exports = {
|
||||
*/
|
||||
tenant: {
|
||||
db_client: process.env.TENANT_DB_CLIENT || process.env.DB_CLIENT || 'mysql',
|
||||
db_name_prefix: process.env.TENANT_DB_NAME_PERFIX,
|
||||
db_name_prefix: process.env.TENANT_DB_NAME_PERFIX || 'bigcapital_tenant_',
|
||||
db_host: process.env.TENANT_DB_HOST || process.env.DB_HOST,
|
||||
db_user: process.env.TENANT_DB_USER || process.env.DB_USER,
|
||||
db_password: process.env.TENANT_DB_PASSWORD || process.env.DB_PASSWORD,
|
||||
|
||||
@@ -51,5 +51,4 @@ export interface ISystemService {
|
||||
cache();
|
||||
repositories();
|
||||
knex();
|
||||
dbManager();
|
||||
}
|
||||
@@ -21,7 +21,7 @@ export default class ComputeItemCostJob {
|
||||
|
||||
agenda.define(
|
||||
'compute-item-cost',
|
||||
{ priority: 'high', concurrency: 1 },
|
||||
{ priority: 'high', concurrency: 20 },
|
||||
this.handler.bind(this)
|
||||
);
|
||||
this.agenda.on('start:compute-item-cost', this.onJobStart.bind(this));
|
||||
|
||||
@@ -8,7 +8,7 @@ export default class OrganizationSetupJob {
|
||||
constructor(agenda) {
|
||||
agenda.define(
|
||||
'organization-setup',
|
||||
{ priority: 'high', concurrency: 1 },
|
||||
{ priority: 'high', concurrency: 20 },
|
||||
this.handler
|
||||
);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ export default class WriteInvoicesJournalEntries {
|
||||
|
||||
agenda.define(
|
||||
eventName,
|
||||
{ priority: 'normal', concurrency: 1 },
|
||||
{ priority: 'normal', concurrency: 20 },
|
||||
this.handler.bind(this)
|
||||
);
|
||||
agenda.on(`complete:${eventName}`, this.onJobCompleted.bind(this));
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
import knexManager from 'knex-db-manager';
|
||||
import { systemKnexConfig, systemDbManager } from 'config/knexConfig';
|
||||
|
||||
export default () => knexManager.databaseManagerFactory({
|
||||
knex: systemKnexConfig,
|
||||
dbManager: systemDbManager,
|
||||
});
|
||||
@@ -3,7 +3,6 @@ import LoggerInstance from '@/loaders/logger';
|
||||
import agendaFactory from '@/loaders/agenda';
|
||||
import SmsClientLoader from '@/loaders/smsClient';
|
||||
import mailInstance from '@/loaders/mail';
|
||||
import dbManagerFactory from '@/loaders/dbManager';
|
||||
import i18n from '@/loaders/i18n';
|
||||
import repositoriesLoader from '@/loaders/systemRepositories';
|
||||
import Cache from '@/services/Cache';
|
||||
@@ -16,7 +15,6 @@ export default ({ mongoConnection, knex }) => {
|
||||
try {
|
||||
const agendaInstance = agendaFactory({ mongoConnection });
|
||||
const smsClientInstance = SmsClientLoader(config.easySMSGateway.api_key);
|
||||
const dbManager = dbManagerFactory(knex);
|
||||
const cacheInstance = new Cache();
|
||||
|
||||
Container.set('logger', LoggerInstance);
|
||||
@@ -24,7 +22,6 @@ export default ({ mongoConnection, knex }) => {
|
||||
Container.set('SMSClient', smsClientInstance);
|
||||
Container.set('mail', mailInstance);
|
||||
|
||||
Container.set('dbManager', dbManager);
|
||||
LoggerInstance.info(
|
||||
'[DI] Database manager has been injected into container.'
|
||||
);
|
||||
|
||||
@@ -18,8 +18,4 @@ export default class HasSystemService implements SystemService {
|
||||
cache() {
|
||||
return this.container('cache');
|
||||
}
|
||||
|
||||
dbManager() {
|
||||
return this.container('dbManager');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
import { Container } from 'typedi';
|
||||
import Knex from 'knex';
|
||||
import { Knex, knex } from 'knex';
|
||||
import { knexSnakeCaseMappers } from 'objection';
|
||||
import { tenantKnexConfig, tenantSeedConfig } from '@/config/knexConfig';
|
||||
import config from '@/config';
|
||||
import { ITenant, ITenantDBManager } from '@/interfaces';
|
||||
import SystemService from '@/services/Tenancy/SystemService';
|
||||
import { TenantDBAlreadyExists } from '@/exceptions';
|
||||
import { sanitizeDatabaseName } from '@/utils/sanitizers';
|
||||
|
||||
export default class TenantDBManager implements ITenantDBManager {
|
||||
static knexCache: { [key: string]: Knex } = {};
|
||||
|
||||
// System database manager.
|
||||
dbManager: any;
|
||||
|
||||
// System knex instance.
|
||||
sysKnex: Knex;
|
||||
|
||||
@@ -23,7 +21,6 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
constructor() {
|
||||
const systemService = Container.get(SystemService);
|
||||
|
||||
this.dbManager = systemService.dbManager();
|
||||
this.sysKnex = systemService.knex();
|
||||
}
|
||||
|
||||
@@ -32,7 +29,9 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
* @return {string}
|
||||
*/
|
||||
private getDatabaseName(tenant: ITenant) {
|
||||
return `${config.tenant.db_name_prefix}${tenant.organizationId}`;
|
||||
return sanitizeDatabaseName(
|
||||
`${config.tenant.db_name_prefix}${tenant.organizationId}`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -59,7 +58,9 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
await this.throwErrorIfTenantDBExists(tenant);
|
||||
|
||||
const databaseName = this.getDatabaseName(tenant);
|
||||
await this.dbManager.createDb(databaseName);
|
||||
await this.sysKnex.raw(
|
||||
`CREATE DATABASE ${databaseName} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci`
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -72,7 +73,6 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
if (!isExists) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.dropDatabase(tenant);
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
public async dropDatabase(tenant: ITenant) {
|
||||
const databaseName = this.getDatabaseName(tenant);
|
||||
|
||||
await this.dbManager.dropDb(databaseName);
|
||||
await this.sysKnex.raw(`DROP DATABASE IF EXISTS ${databaseName}`);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -118,7 +118,7 @@ export default class TenantDBManager implements ITenantDBManager {
|
||||
let knexInstance = TenantDBManager.knexCache[key];
|
||||
|
||||
if (!knexInstance) {
|
||||
knexInstance = Knex({
|
||||
knexInstance = knex({
|
||||
...tenantKnexConfig(tenant),
|
||||
...knexSnakeCaseMappers({ upperCase: true }),
|
||||
});
|
||||
|
||||
4
packages/server/src/utils/sanitizers.ts
Normal file
4
packages/server/src/utils/sanitizers.ts
Normal file
@@ -0,0 +1,4 @@
|
||||
export function sanitizeDatabaseName(dbName: string) {
|
||||
// Replace any character that is not alphanumeric or an underscore with an underscore
|
||||
return dbName.replace(/[^a-zA-Z0-9_]/g, '');
|
||||
}
|
||||
Reference in New Issue
Block a user