mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 22:00:31 +00:00
feat: remove path alias.
feat: remove Webpack and depend on nodemon. feat: refactoring expenses. feat: optimize system users with caching. feat: architecture tenant optimize.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import Agenda from 'agenda';
|
||||
import config from '@/../config/config';
|
||||
import config from 'config';
|
||||
|
||||
export default ({ mongoConnection }) => {
|
||||
return new Agenda({
|
||||
|
||||
10
server/src/loaders/database.ts
Normal file
10
server/src/loaders/database.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
import Knex from 'knex';
|
||||
import { knexSnakeCaseMappers } from 'objection';
|
||||
import { systemKnexConfig } from 'config/knexConfig';
|
||||
|
||||
export default () => {
|
||||
return Knex({
|
||||
...systemKnexConfig,
|
||||
...knexSnakeCaseMappers({ upperCase: true }),
|
||||
});
|
||||
};
|
||||
@@ -1,14 +1,7 @@
|
||||
import knexManager from 'knex-db-manager';
|
||||
import knexfile from '@/../config/systemKnexfile';
|
||||
import config from '@/../config/config';
|
||||
|
||||
const knexConfig = knexfile[process.env.NODE_ENV];
|
||||
import { systemKnexConfig, systemDbManager } from 'config/knexConfig';
|
||||
|
||||
export default () => knexManager.databaseManagerFactory({
|
||||
knex: knexConfig,
|
||||
dbManager: {
|
||||
collate: [],
|
||||
superUser: config.manager.superUser,
|
||||
superPassword: config.manager.superPassword,
|
||||
},
|
||||
knex: systemKnexConfig,
|
||||
dbManager: systemDbManager,
|
||||
});
|
||||
@@ -1,37 +1,46 @@
|
||||
import { Container } from 'typedi';
|
||||
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 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';
|
||||
|
||||
export default ({ mongoConnection, knex }) => {
|
||||
try {
|
||||
const agendaInstance = agendaFactory({ mongoConnection });
|
||||
const smsClientInstance = SmsClientLoader();
|
||||
const dbManager = dbManagerFactory();
|
||||
const dbManager = dbManagerFactory(knex);
|
||||
const cacheInstance = new Cache();
|
||||
|
||||
Container.set('logger', LoggerInstance)
|
||||
LoggerInstance.info('Logger instance has been injected into container');
|
||||
LoggerInstance.info('[DI] Logger instance has been injected into container');
|
||||
|
||||
Container.set('knex', knex);
|
||||
LoggerInstance.info('Knex instance has been injected into container');
|
||||
LoggerInstance.info('[DI] Knex instance has been injected into container');
|
||||
|
||||
Container.set('SMSClient', smsClientInstance);
|
||||
LoggerInstance.info('SMS client has been injected into container');
|
||||
LoggerInstance.info('[DI] SMS client has been injected into container');
|
||||
|
||||
Container.set('mail', mailInstance);
|
||||
LoggerInstance.info('Mail instance has been injected into container');
|
||||
LoggerInstance.info('[DI] Mail instance has been injected into container');
|
||||
|
||||
Container.set('dbManager', dbManager);
|
||||
LoggerInstance.info('Database manager has been injected into container.');
|
||||
LoggerInstance.info('[DI] Database manager has been injected into container.');
|
||||
|
||||
Container.set('agenda', agendaInstance);
|
||||
LoggerInstance.info('Agenda has been injected into container');
|
||||
LoggerInstance.info('[DI] Agenda has been injected into container');
|
||||
|
||||
Container.set('i18n', i18n);
|
||||
LoggerInstance.info('i18n has been injected into container');
|
||||
LoggerInstance.info('[DI] i18n has been injected into container');
|
||||
|
||||
Container.set('cache', cacheInstance);
|
||||
LoggerInstance.info('[DI] cache has been injected into container');
|
||||
|
||||
Container.set('repositories', repositoriesLoader());
|
||||
LoggerInstance.info('[DI] repositories has been injected into container');
|
||||
|
||||
return { agenda: agendaInstance };
|
||||
} catch (e) {
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
// Here we import all events.
|
||||
import '@/subscribers/authentication';
|
||||
import '@/subscribers/organization';
|
||||
import 'subscribers/authentication';
|
||||
import 'subscribers/organization';
|
||||
|
||||
@@ -4,10 +4,10 @@ import boom from 'express-boom';
|
||||
import errorHandler from 'errorhandler';
|
||||
import fileUpload from 'express-fileupload';
|
||||
import i18n from 'i18n';
|
||||
import routes from '@/http';
|
||||
import LoggerMiddleware from '@/http/middleware/LoggerMiddleware';
|
||||
import AgendashController from '@/http/controllers/Agendash';
|
||||
import config from '@/../config/config';
|
||||
import routes from 'api';
|
||||
import LoggerMiddleware from 'api/middleware/LoggerMiddleware';
|
||||
import AgendashController from 'api/controllers/Agendash';
|
||||
import config from 'config';
|
||||
|
||||
export default ({ app }) => {
|
||||
// Express configuration.
|
||||
|
||||
@@ -4,6 +4,6 @@ import path from 'path';
|
||||
export default () => i18n.configure({
|
||||
locales: ['en', 'ar'],
|
||||
register: global,
|
||||
directory: path.join(global.rootPath, 'src/locales'),
|
||||
directory: path.join(global.__root, 'src/locales'),
|
||||
updateFiles: false
|
||||
})
|
||||
@@ -1,18 +1,18 @@
|
||||
import Logger from '@/loaders/Logger';
|
||||
import mongooseLoader from '@/loaders/mongoose';
|
||||
import jobsLoader from '@/loaders/jobs';
|
||||
import expressLoader from '@/loaders/express';
|
||||
import databaseLoader from '@/database/knex';
|
||||
import dependencyInjectorLoader from '@/loaders/dependencyInjector';
|
||||
import objectionLoader from '@/database/objection';
|
||||
import i18nConfig from '@/loaders/i18n';
|
||||
import Logger from 'loaders/logger';
|
||||
import mongooseLoader from 'loaders/mongoose';
|
||||
import jobsLoader from 'loaders/jobs';
|
||||
import expressLoader from 'loaders/express';
|
||||
import databaseLoader from 'loaders/database';
|
||||
import dependencyInjectorLoader from 'loaders/dependencyInjector';
|
||||
import objectionLoader from 'database/objection';
|
||||
import i18nConfig from 'loaders/i18n';
|
||||
|
||||
// We have to import at least all the events once so they can be triggered
|
||||
import '@/loaders/events';
|
||||
import 'loaders/events';
|
||||
|
||||
export default async ({ expressApp }) => {
|
||||
const mongoConnection = await mongooseLoader();
|
||||
Logger.info('MongoDB loaded and connected!');
|
||||
Logger.info('[init] MongoDB loaded and connected!');
|
||||
|
||||
// Initialize the system database once app started.
|
||||
const knex = databaseLoader();
|
||||
@@ -26,11 +26,11 @@ export default async ({ expressApp }) => {
|
||||
knex,
|
||||
});
|
||||
await jobsLoader({ agenda });
|
||||
Logger.info('Jobs loaded');
|
||||
Logger.info('[init] Jobs loaded');
|
||||
|
||||
expressLoader({ app: expressApp });
|
||||
Logger.info('Express loaded');
|
||||
Logger.info('[init] Express loaded');
|
||||
|
||||
i18nConfig();
|
||||
Logger.info('I18n node configured.');
|
||||
Logger.info('[init] I18n node configured.');
|
||||
};
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
import Agenda from 'agenda';
|
||||
import WelcomeEmailJob from '@/jobs/WelcomeEmail';
|
||||
import WelcomeSMSJob from '@/jobs/WelcomeSMS';
|
||||
import ResetPasswordMailJob from '@/jobs/ResetPasswordMail';
|
||||
import ComputeItemCost from '@/jobs/ComputeItemCost';
|
||||
import RewriteInvoicesJournalEntries from '@/jobs/writeInvoicesJEntries';
|
||||
import SendLicenseViaPhoneJob from '@/jobs/SendLicensePhone';
|
||||
import SendLicenseViaEmailJob from '@/jobs/SendLicenseEmail';
|
||||
import SendSMSNotificationSubscribeEnd from '@/jobs/SMSNotificationSubscribeEnd';
|
||||
import SendSMSNotificationTrialEnd from '@/jobs/SMSNotificationTrialEnd';
|
||||
import SendMailNotificationSubscribeEnd from '@/jobs/MailNotificationSubscribeEnd';
|
||||
import SendMailNotificationTrialEnd from '@/jobs/MailNotificationTrialEnd';
|
||||
import UserInviteMailJob from '@/jobs/UserInviteMail';
|
||||
import WelcomeEmailJob from 'jobs/WelcomeEmail';
|
||||
import WelcomeSMSJob from 'jobs/WelcomeSMS';
|
||||
import ResetPasswordMailJob from 'jobs/ResetPasswordMail';
|
||||
import ComputeItemCost from 'jobs/ComputeItemCost';
|
||||
import RewriteInvoicesJournalEntries from 'jobs/writeInvoicesJEntries';
|
||||
import SendLicenseViaPhoneJob from 'jobs/SendLicensePhone';
|
||||
import SendLicenseViaEmailJob from 'jobs/SendLicenseEmail';
|
||||
import SendSMSNotificationSubscribeEnd from 'jobs/SMSNotificationSubscribeEnd';
|
||||
import SendSMSNotificationTrialEnd from 'jobs/SMSNotificationTrialEnd';
|
||||
import SendMailNotificationSubscribeEnd from 'jobs/MailNotificationSubscribeEnd';
|
||||
import SendMailNotificationTrialEnd from 'jobs/MailNotificationTrialEnd';
|
||||
import UserInviteMailJob from 'jobs/UserInviteMail';
|
||||
|
||||
export default ({ agenda }: { agenda: Agenda }) => {
|
||||
new WelcomeEmailJob(agenda);
|
||||
@@ -31,7 +31,7 @@ export default ({ agenda }: { agenda: Agenda }) => {
|
||||
agenda.define(
|
||||
'rewrite-invoices-journal-entries',
|
||||
{ priority: 'normal', concurrency: 1, },
|
||||
new RewriteInvoicesJournalEntries(agenda).handler,
|
||||
new RewriteInvoicesJournalEntries().handler,
|
||||
);
|
||||
agenda.define(
|
||||
'send-license-via-phone',
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import nodemailer from 'nodemailer';
|
||||
import config from '@/../config/config';
|
||||
import config from 'config';
|
||||
|
||||
// create reusable transporter object using the default SMTP transport
|
||||
const transporter = nodemailer.createTransport({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import mongoose from 'mongoose';
|
||||
import { Db } from 'mongodb';
|
||||
import config from '@/../config/config';
|
||||
import config from 'config';
|
||||
|
||||
export default async (): Promise<Db> => {
|
||||
const connection = await mongoose.connect(
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import SMSClient from '@/services/SMSClient';
|
||||
import EasySMSGateway from '@/services/SMSClient/EasySMSClient';
|
||||
import SMSClient from 'services/SMSClient';
|
||||
import EasySMSGateway from 'services/SMSClient/EasySMSClient';
|
||||
|
||||
export default () => {
|
||||
const easySmsGateway = new EasySMSGateway();
|
||||
|
||||
14
server/src/loaders/systemRepositories.ts
Normal file
14
server/src/loaders/systemRepositories.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import Container from 'typedi';
|
||||
import {
|
||||
SystemUserRepository,
|
||||
SubscriptionRepository,
|
||||
TenantRepository,
|
||||
} from 'system/repositories';
|
||||
|
||||
export default () => {
|
||||
return {
|
||||
systemUserRepository: Container.get(SystemUserRepository),
|
||||
subscriptionRepository: Container.get(SubscriptionRepository),
|
||||
tenantRepository: Container.get(TenantRepository),
|
||||
};
|
||||
}
|
||||
8
server/src/loaders/tenantCache.ts
Normal file
8
server/src/loaders/tenantCache.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { Container } from 'typedi';
|
||||
import Cache from 'services/Cache';
|
||||
|
||||
export default (tenantId: number) => {
|
||||
const cacheInstance = new Cache();
|
||||
|
||||
return cacheInstance;
|
||||
};
|
||||
@@ -1,41 +1,41 @@
|
||||
import { mapValues } from 'lodash';
|
||||
|
||||
import Account from '@/models/Account';
|
||||
import AccountTransaction from '@/models/AccountTransaction';
|
||||
import AccountType from '@/models/AccountType';
|
||||
import Item from '@/models/Item';
|
||||
import ItemEntry from '@/models/ItemEntry';
|
||||
import Bill from '@/models/Bill';
|
||||
import BillPayment from '@/models/BillPayment';
|
||||
import BillPaymentEntry from '@/models/BillPaymentEntry';
|
||||
import Currency from '@/models/Currency';
|
||||
import Customer from '@/models/Customer';
|
||||
import Contact from '@/models/Contact';
|
||||
import Vendor from '@/models/Vendor';
|
||||
import ExchangeRate from '@/models/ExchangeRate';
|
||||
import Expense from '@/models/Expense';
|
||||
import ExpenseCategory from '@/models/ExpenseCategory';
|
||||
import View from '@/models/View';
|
||||
import ViewRole from '@/models/ViewRole';
|
||||
import ViewColumn from '@/models/ViewColumn';
|
||||
import Setting from '@/models/Setting';
|
||||
import SaleInvoice from '@/models/SaleInvoice';
|
||||
import SaleInvoiceEntry from '@/models/SaleInvoiceEntry';
|
||||
import SaleReceipt from '@/models/SaleReceipt';
|
||||
import SaleReceiptEntry from '@/models/SaleReceiptEntry';
|
||||
import SaleEstimate from '@/models/SaleEstimate';
|
||||
import SaleEstimateEntry from '@/models/SaleEstimateEntry';
|
||||
import PaymentReceive from '@/models/PaymentReceive';
|
||||
import PaymentReceiveEntry from '@/models/PaymentReceiveEntry';
|
||||
import Option from '@/models/Option';
|
||||
import Resource from '@/models/Resource';
|
||||
import InventoryCostLotTracker from '@/models/InventoryCostLotTracker';
|
||||
import InventoryTransaction from '@/models/InventoryTransaction';
|
||||
import ResourceField from '@/models/ResourceField';
|
||||
import ResourceFieldMetadata from '@/models/ResourceFieldMetadata';
|
||||
import ManualJournal from '@/models/ManualJournal';
|
||||
import Media from '@/models/Media';
|
||||
import MediaLink from '@/models/MediaLink';
|
||||
import Account from 'models/Account';
|
||||
import AccountTransaction from 'models/AccountTransaction';
|
||||
import AccountType from 'models/AccountType';
|
||||
import Item from 'models/Item';
|
||||
import ItemEntry from 'models/ItemEntry';
|
||||
import Bill from 'models/Bill';
|
||||
import BillPayment from 'models/BillPayment';
|
||||
import BillPaymentEntry from 'models/BillPaymentEntry';
|
||||
import Currency from 'models/Currency';
|
||||
import Customer from 'models/Customer';
|
||||
import Contact from 'models/Contact';
|
||||
import Vendor from 'models/Vendor';
|
||||
import ExchangeRate from 'models/ExchangeRate';
|
||||
import Expense from 'models/Expense';
|
||||
import ExpenseCategory from 'models/ExpenseCategory';
|
||||
import View from 'models/View';
|
||||
import ViewRole from 'models/ViewRole';
|
||||
import ViewColumn from 'models/ViewColumn';
|
||||
import Setting from 'models/Setting';
|
||||
import SaleInvoice from 'models/SaleInvoice';
|
||||
import SaleInvoiceEntry from 'models/SaleInvoiceEntry';
|
||||
import SaleReceipt from 'models/SaleReceipt';
|
||||
import SaleReceiptEntry from 'models/SaleReceiptEntry';
|
||||
import SaleEstimate from 'models/SaleEstimate';
|
||||
import SaleEstimateEntry from 'models/SaleEstimateEntry';
|
||||
import PaymentReceive from 'models/PaymentReceive';
|
||||
import PaymentReceiveEntry from 'models/PaymentReceiveEntry';
|
||||
import Option from 'models/Option';
|
||||
import Resource from 'models/Resource';
|
||||
import InventoryCostLotTracker from 'models/InventoryCostLotTracker';
|
||||
import InventoryTransaction from 'models/InventoryTransaction';
|
||||
import ResourceField from 'models/ResourceField';
|
||||
import ResourceFieldMetadata from 'models/ResourceFieldMetadata';
|
||||
import ManualJournal from 'models/ManualJournal';
|
||||
import Media from 'models/Media';
|
||||
import MediaLink from 'models/MediaLink';
|
||||
|
||||
export default (knex) => {
|
||||
const models = {
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import AccountRepository from '@/repositories/AccountRepository';
|
||||
import AccountTypeRepository from '@/repositories/AccountTypeRepository';
|
||||
import VendorRepository from '@/repositories/VendorRepository';
|
||||
import CustomerRepository from '@/repositories/CustomerRepository';
|
||||
|
||||
import AccountRepository from 'repositories/AccountRepository';
|
||||
import AccountTypeRepository from 'repositories/AccountTypeRepository';
|
||||
import VendorRepository from 'repositories/VendorRepository';
|
||||
import CustomerRepository from 'repositories/CustomerRepository';
|
||||
import ExpenseRepository from 'repositories/ExpenseRepository';
|
||||
|
||||
export default (tenantId: number) => {
|
||||
return {
|
||||
@@ -10,5 +10,6 @@ export default (tenantId: number) => {
|
||||
accountTypeRepository: new AccountTypeRepository(tenantId),
|
||||
customerRepository: new CustomerRepository(tenantId),
|
||||
vendorRepository: new VendorRepository(tenantId),
|
||||
expenseRepository: new ExpenseRepository(tenantId),
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user