Skip to content

Commit

Permalink
fix: Database connection lost error
Browse files Browse the repository at this point in the history
  • Loading branch information
abouolia committed Aug 15, 2024
1 parent bbbd96f commit fde9ccc
Show file tree
Hide file tree
Showing 12 changed files with 95 additions and 56 deletions.
3 changes: 1 addition & 2 deletions packages/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,8 @@
"is-my-json-valid": "^2.20.5",
"js-money": "^0.6.3",
"jsonwebtoken": "^8.5.1",
"knex": "^0.95.15",
"knex": "^3.1.0",
"knex-cleaner": "^1.3.0",
"knex-db-manager": "^0.6.1",
"libphonenumber-js": "^1.9.6",
"lodash": "^4.17.15",
"lru-cache": "^6.0.0",
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/config/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion packages/server/src/interfaces/Tenancy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,5 +51,4 @@ export interface ISystemService {
cache();
repositories();
knex();
dbManager();
}
2 changes: 1 addition & 1 deletion packages/server/src/jobs/ComputeItemCost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/jobs/OrganizationSetup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export default class OrganizationSetupJob {
constructor(agenda) {
agenda.define(
'organization-setup',
{ priority: 'high', concurrency: 1 },
{ priority: 'high', concurrency: 20 },
this.handler
);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/server/src/jobs/WriteInvoicesJEntries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
7 changes: 0 additions & 7 deletions packages/server/src/loaders/dbManager.ts

This file was deleted.

3 changes: 0 additions & 3 deletions packages/server/src/loaders/dependencyInjector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -16,15 +15,13 @@ 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);
Container.set('knex', knex);
Container.set('SMSClient', smsClientInstance);
Container.set('mail', mailInstance);

Container.set('dbManager', dbManager);
LoggerInstance.info(
'[DI] Database manager has been injected into container.'
);
Expand Down
4 changes: 0 additions & 4 deletions packages/server/src/services/Tenancy/SystemService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,4 @@ export default class HasSystemService implements SystemService {
cache() {
return this.container('cache');
}

dbManager() {
return this.container('dbManager');
}
}
20 changes: 10 additions & 10 deletions packages/server/src/services/Tenancy/TenantDBManager.ts
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -23,7 +21,6 @@ export default class TenantDBManager implements ITenantDBManager {
constructor() {
const systemService = Container.get(SystemService);

this.dbManager = systemService.dbManager();
this.sysKnex = systemService.knex();
}

Expand All @@ -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}`
);
}

/**
Expand All @@ -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`
);
}

/**
Expand All @@ -72,7 +73,6 @@ export default class TenantDBManager implements ITenantDBManager {
if (!isExists) {
return;
}

await this.dropDatabase(tenant);
}

Expand All @@ -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}`);
}

/**
Expand Down Expand Up @@ -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 }),
});
Expand Down
4 changes: 4 additions & 0 deletions packages/server/src/utils/sanitizers.ts
Original file line number Diff line number Diff line change
@@ -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, '');
}
101 changes: 76 additions & 25 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit fde9ccc

Please sign in to comment.