mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-16 04:40:32 +00:00
add server to monorepo.
This commit is contained in:
11
packages/server/src/loaders/agenda.ts
Normal file
11
packages/server/src/loaders/agenda.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import Agenda from 'agenda';
|
||||
import config from '@/config';
|
||||
|
||||
export default ({ mongoConnection }) => {
|
||||
return new Agenda({
|
||||
mongo: mongoConnection,
|
||||
db: { collection: config.agenda.dbCollection },
|
||||
processEvery: config.agenda.pooltime,
|
||||
maxConcurrency: config.agenda.concurrency,
|
||||
});
|
||||
};
|
||||
10
packages/server/src/loaders/database.ts
Normal file
10
packages/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 }),
|
||||
});
|
||||
};
|
||||
7
packages/server/src/loaders/dbManager.ts
Normal file
7
packages/server/src/loaders/dbManager.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import knexManager from 'knex-db-manager';
|
||||
import { systemKnexConfig, systemDbManager } from 'config/knexConfig';
|
||||
|
||||
export default () => knexManager.databaseManagerFactory({
|
||||
knex: systemKnexConfig,
|
||||
dbManager: systemDbManager,
|
||||
});
|
||||
59
packages/server/src/loaders/dependencyInjector.ts
Normal file
59
packages/server/src/loaders/dependencyInjector.ts
Normal file
@@ -0,0 +1,59 @@
|
||||
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 repositoriesLoader from '@/loaders/systemRepositories';
|
||||
import Cache from '@/services/Cache';
|
||||
import config from '@/config'
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
import rateLimiterLoaders from './rateLimiterLoader';
|
||||
import eventEmitter, { susbcribers } from './eventEmitter';
|
||||
|
||||
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.'
|
||||
);
|
||||
|
||||
Container.set('agenda', agendaInstance);
|
||||
LoggerInstance.info('[DI] Agenda has been injected into container');
|
||||
|
||||
Container.set('i18n', i18n());
|
||||
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');
|
||||
|
||||
rateLimiterLoaders();
|
||||
LoggerInstance.info('[DI] rate limiter has been injected into container.');
|
||||
|
||||
Container.set(EventPublisher, eventEmitter());
|
||||
|
||||
const emitter = Container.get(EventPublisher);
|
||||
|
||||
emitter.loadSubscribers(susbcribers());
|
||||
|
||||
|
||||
return { agenda: agendaInstance };
|
||||
} catch (e) {
|
||||
LoggerInstance.error('Error on dependency injector loader: %o', e);
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
192
packages/server/src/loaders/eventEmitter.ts
Normal file
192
packages/server/src/loaders/eventEmitter.ts
Normal file
@@ -0,0 +1,192 @@
|
||||
import { EventPublisher } from '@/lib/EventPublisher/EventPublisher';
|
||||
|
||||
import ItemSubscriber from '@/subscribers/Items/ItemSubscriber';
|
||||
import InventoryAdjustmentsSubscriber from '@/subscribers/Inventory/InventoryAdjustment';
|
||||
import BillWriteInventoryTransactionsSubscriber from '@/subscribers/Bills/WriteInventoryTransactions';
|
||||
import PaymentSyncBillBalance from '@/subscribers/PaymentMades/PaymentSyncBillBalance';
|
||||
import SaleReceiptInventoryTransactionsSubscriber from '@/subscribers/SaleReceipt/WriteInventoryTransactions';
|
||||
import SaleInvoiceWriteInventoryTransactions from '@/subscribers/SaleInvoices/WriteInventoryTransactions';
|
||||
import SaleInvoiceWriteGLEntriesSubscriber from '@/subscribers/SaleInvoices/WriteJournalEntries';
|
||||
import PaymentReceiveSyncInvoices from '@/subscribers/PaymentReceive/PaymentReceiveSyncInvoices';
|
||||
import CashflowTransactionSubscriber from '@/services/Cashflow/CashflowTransactionSubscriber';
|
||||
import PaymentReceivesWriteGLEntriesSubscriber from '@/subscribers/PaymentReceive/WriteGLEntries';
|
||||
import InventorySubscriber from '@/subscribers/Inventory/Inventory';
|
||||
import SaleReceiptWriteGLEntriesSubscriber from '@/subscribers/SaleReceipt/WriteJournalEntries';
|
||||
import { CustomerWriteGLOpeningBalanceSubscriber } from '@/services/Contacts/Customers/Subscribers/CustomerGLEntriesSubscriber';
|
||||
import { VendorsWriteGLOpeningSubscriber } from '@/services/Contacts/Vendors/Subscribers/VendorGLEntriesSubscriber';
|
||||
import SaleEstimateAutoSerialSubscriber from '@/subscribers/SaleEstimate/AutoIncrementSerial';
|
||||
import SaleEstimateSmsNotificationSubscriber from '@/subscribers/SaleEstimate/SmsNotifications';
|
||||
import { ExpensesWriteGLSubscriber } from '@/services/Expenses/ExpenseGLEntriesSubscriber';
|
||||
import SaleReceiptAutoSerialSubscriber from '@/subscribers/SaleReceipt/AutoIncrementSerial';
|
||||
import SaleInvoiceAutoIncrementSubscriber from '@/subscribers/SaleInvoices/AutoIncrementSerial';
|
||||
import SaleInvoiceConvertFromEstimateSubscriber from '@/subscribers/SaleInvoices/ConvertFromEstimate';
|
||||
import PaymentReceiveAutoSerialSubscriber from '@/subscribers/PaymentReceive/AutoSerialIncrement';
|
||||
import SyncSystemSendInvite from '@/services/InviteUsers/SyncSystemSendInvite';
|
||||
import InviteSendMainNotification from '@/services/InviteUsers/InviteSendMailNotification';
|
||||
import SyncTenantAcceptInvite from '@/services/InviteUsers/SyncTenantAcceptInvite';
|
||||
import SyncTenantUserMutate from '@/services/Users/SyncTenantUserSaved';
|
||||
import OrgSyncTenantAdminUserSubscriber from '@/subscribers/Organization/SyncTenantAdminUser';
|
||||
import OrgBuildSmsNotificationSubscriber from '@/subscribers/Organization/BuildSmsNotification';
|
||||
import PurgeUserAbilityCache from '@/services/Users/PurgeUserAbilityCache';
|
||||
import ResetLoginThrottleSubscriber from '@/subscribers/Authentication/ResetLoginThrottle';
|
||||
import AuthenticationSubscriber from '@/subscribers/Authentication/SendResetPasswordMail';
|
||||
import AuthSendWelcomeMailSubscriber from '@/subscribers/Authentication/SendWelcomeMail';
|
||||
import PurgeAuthorizedUserOnceRoleMutate from '@/services/Roles/PurgeAuthorizedUser';
|
||||
import SendSmsNotificationToCustomer from '@/subscribers/SaleInvoices/SendSmsNotificationToCustomer';
|
||||
import SendSmsNotificationSaleReceipt from '@/subscribers/SaleReceipt/SendSmsNotificationToCustomer';
|
||||
import SendSmsNotificationPaymentReceive from '@/subscribers/PaymentReceive/SendSmsNotificationToCustomer';
|
||||
import SaleInvoiceWriteoffSubscriber from '@/services/Sales/SaleInvoiceWriteoffSubscriber';
|
||||
import LandedCostSyncCostTransactionsSubscriber from '@/services/Purchases/LandedCost/LandedCostSyncCostTransactionsSubscriber';
|
||||
import LandedCostInventoryTransactionsSubscriber from '@/services/Purchases/LandedCost/LandedCostInventoryTransactionsSubscriber';
|
||||
import CreditNoteGLEntriesSubscriber from '@/services/CreditNotes/CreditNoteGLEntriesSubscriber';
|
||||
import VendorCreditGlEntriesSubscriber from '@/services/Purchases/VendorCredits/VendorCreditGLEntriesSubscriber';
|
||||
import CreditNoteInventoryTransactionsSubscriber from '@/services/CreditNotes/CreditNoteInventoryTransactionsSubscriber';
|
||||
import VendorCreditInventoryTransactionsSubscriber from '@/services/Purchases/VendorCredits/VendorCreditInventoryTransactionsSusbcriber';
|
||||
import CreditNoteAutoSerialSubscriber from '@/services/CreditNotes/CreditNoteAutoSerialSubscriber';
|
||||
import VendorCreditAutoSerialSubscriber from '@/services/Purchases/VendorCredits/VendorCreditAutoSerialSubscriber';
|
||||
import LandedCostGLEntriesSubscriber from '@/services/Purchases/LandedCost/LandedCostGLEntriesSubscriber';
|
||||
import RefundCreditNoteGLEntriesSubscriber from '@/services/CreditNotes/RefundCreditNoteGLEntriesSubscriber';
|
||||
import RefundVendorCreditGLEntriesSubscriber from '@/services/Purchases/VendorCredits/RefundVendorCredits/RefundVendorCreditGLEntriesSubscriber';
|
||||
import RefundSyncCreditNoteBalanceSubscriber from '@/services/CreditNotes/RefundSyncCreditNoteBalanceSubscriber';
|
||||
import RefundSyncVendorCreditBalanceSubscriber from '@/services/Purchases/VendorCredits/RefundVendorCredits/RefundSyncVendorCreditBalanceSubscriber';
|
||||
import CreditNoteApplySyncCreditSubscriber from '@/services/CreditNotes/CreditNoteApplySyncCreditSubscriber';
|
||||
import CreditNoteApplySyncInvoicesCreditedAmountSubscriber from '@/services/CreditNotes/CreditNoteApplySyncInvoicesSubscriber';
|
||||
import ApplyVendorCreditSyncInvoicedSubscriber from '@/services/Purchases/VendorCredits/ApplyVendorCreditToBills/ApplyVendorCreditSyncInvoicedSubscriber';
|
||||
import ApplyVendorCreditSyncBillsSubscriber from '@/services/Purchases/VendorCredits/ApplyVendorCreditToBills/ApplyVendorCreditSyncBillsSubscriber';
|
||||
import DeleteCustomerLinkedCreditSubscriber from '@/services/CreditNotes/DeleteCustomerLinkedCreditSubscriber';
|
||||
import DeleteVendorAssociatedVendorCredit from '@/services/Purchases/VendorCredits/DeleteVendorAssociatedVendorCredit';
|
||||
import SalesTransactionLockingGuardSubscriber from '@/services/TransactionsLocking/SalesTransactionLockingGuardSubscriber';
|
||||
import PurchasesTransactionLockingGuardSubscriber from '@/services/TransactionsLocking/PurchasesTransactionLockingGuardSubscriber';
|
||||
import FinancialTransactionLockingGuardSubscriber from '@/services/TransactionsLocking/FinancialsTransactionLockingGuardSubscriber';
|
||||
import CashflowWithAccountSubscriber from '@/services/Cashflow/CashflowWithAccountSubscriber';
|
||||
import { WarehousesItemsQuantitySyncSubscriber } from '@/services/Warehouses/Integrations/WarehousesItemsQuantitySynSubscriber';
|
||||
import { WarehouseTransferInventoryTransactionsSubscriber } from '@/services/Warehouses/WarehousesTransfers/WarehouseTransferInventoryTransactionsSubscriber';
|
||||
import { AccountsTransactionsWarehousesSubscribe } from '@/services/Accounting/AccountsTransactionsWarehousesSubscribe';
|
||||
import { ActivateWarehousesSubscriber } from '@/services/Warehouses/ActivateWarehousesSubscriber';
|
||||
import { ManualJournalWriteGLSubscriber } from '@/services/ManualJournals/ManualJournalGLEntriesSubscriber';
|
||||
import { BillGLEntriesSubscriber } from '@/services/Purchases/Bills/BillGLEntriesSubscriber';
|
||||
import { PaymentWriteGLEntriesSubscriber } from '@/services/Purchases/BillPayments/BillPaymentGLEntriesSubscriber';
|
||||
|
||||
import BranchesIntegrationsSubscribers from '@/services/Branches/EventsProvider';
|
||||
import WarehousesIntegrationsSubscribers from '@/services/Warehouses/EventsProvider';
|
||||
import { WarehouseTransferAutoIncrementSubscriber } from '@/services/Warehouses/WarehousesTransfers/WarehouseTransferAutoIncrementSubscriber';
|
||||
import { InvoicePaymentGLRewriteSubscriber } from '@/services/Sales/Invoices/subscribers/InvoicePaymentGLRewriteSubscriber';
|
||||
import { BillPaymentsGLEntriesRewriteSubscriber } from '@/services/Purchases/Bills/BillPaymentsGLEntriesRewriteSubscriber';
|
||||
import { InvoiceCostGLEntriesSubscriber } from '@/services/Sales/Invoices/subscribers/InvoiceCostGLEntriesSubscriber';
|
||||
import { InventoryCostGLBeforeWriteSubscriber } from '@/services/Inventory/subscribers/InventoryCostGLBeforeWriteSubscriber';
|
||||
import { SaleReceiptCostGLEntriesSubscriber } from '@/services/Sales/Receipts/subscribers/SaleReceiptCostGLEntriesSubscriber';
|
||||
import { SeedInitialCurrenciesOnSetupSubsriber } from '@/services/Currencies/subscribers/SeedInitialCurrenciesOnSetupSubscriber';
|
||||
import { MutateBaseCurrencyAccountsSubscriber } from '@/services/Accounts/susbcribers/MutateBaseCurrencyAccounts';
|
||||
import { ProjectBillableTasksSubscriber } from '@/services/Projects/Projects/ProjectBillableTasksSubscriber';
|
||||
import { ProjectBillableExpensesSubscriber } from '@/services/Projects/Projects/ProjectBillableExpenseSubscriber';
|
||||
import { ProjectBillableBillSubscriber } from '@/services/Projects/Projects/ProjectBillableBillSubscriber';
|
||||
import { SyncActualTimeTaskSubscriber } from '@/services/Projects/Times/SyncActualTimeTaskSubscriber';
|
||||
|
||||
export default () => {
|
||||
return new EventPublisher();
|
||||
};
|
||||
|
||||
export const susbcribers = () => {
|
||||
return [
|
||||
ItemSubscriber,
|
||||
InventoryAdjustmentsSubscriber,
|
||||
BillWriteInventoryTransactionsSubscriber,
|
||||
PaymentSyncBillBalance,
|
||||
SaleReceiptInventoryTransactionsSubscriber,
|
||||
SaleReceiptWriteGLEntriesSubscriber,
|
||||
SaleInvoiceWriteInventoryTransactions,
|
||||
SaleInvoiceWriteGLEntriesSubscriber,
|
||||
PaymentReceiveSyncInvoices,
|
||||
PaymentReceivesWriteGLEntriesSubscriber,
|
||||
CashflowTransactionSubscriber,
|
||||
InventorySubscriber,
|
||||
CustomerWriteGLOpeningBalanceSubscriber,
|
||||
VendorsWriteGLOpeningSubscriber,
|
||||
SaleEstimateAutoSerialSubscriber,
|
||||
SaleEstimateSmsNotificationSubscriber,
|
||||
ExpensesWriteGLSubscriber,
|
||||
SaleReceiptAutoSerialSubscriber,
|
||||
SaleInvoiceAutoIncrementSubscriber,
|
||||
SaleInvoiceConvertFromEstimateSubscriber,
|
||||
PaymentReceiveAutoSerialSubscriber,
|
||||
SyncSystemSendInvite,
|
||||
SyncTenantAcceptInvite,
|
||||
InviteSendMainNotification,
|
||||
SyncTenantUserMutate,
|
||||
OrgSyncTenantAdminUserSubscriber,
|
||||
OrgBuildSmsNotificationSubscriber,
|
||||
PurgeUserAbilityCache,
|
||||
ResetLoginThrottleSubscriber,
|
||||
AuthenticationSubscriber,
|
||||
AuthSendWelcomeMailSubscriber,
|
||||
PurgeAuthorizedUserOnceRoleMutate,
|
||||
SendSmsNotificationToCustomer,
|
||||
SendSmsNotificationSaleReceipt,
|
||||
SendSmsNotificationPaymentReceive,
|
||||
SaleInvoiceWriteoffSubscriber,
|
||||
LandedCostSyncCostTransactionsSubscriber,
|
||||
LandedCostInventoryTransactionsSubscriber,
|
||||
CreditNoteGLEntriesSubscriber,
|
||||
VendorCreditGlEntriesSubscriber,
|
||||
CreditNoteInventoryTransactionsSubscriber,
|
||||
VendorCreditInventoryTransactionsSubscriber,
|
||||
CreditNoteAutoSerialSubscriber,
|
||||
VendorCreditAutoSerialSubscriber,
|
||||
LandedCostGLEntriesSubscriber,
|
||||
RefundCreditNoteGLEntriesSubscriber,
|
||||
RefundVendorCreditGLEntriesSubscriber,
|
||||
RefundSyncCreditNoteBalanceSubscriber,
|
||||
RefundSyncVendorCreditBalanceSubscriber,
|
||||
CreditNoteApplySyncCreditSubscriber,
|
||||
CreditNoteApplySyncInvoicesCreditedAmountSubscriber,
|
||||
ApplyVendorCreditSyncInvoicedSubscriber,
|
||||
ApplyVendorCreditSyncBillsSubscriber,
|
||||
DeleteCustomerLinkedCreditSubscriber,
|
||||
DeleteVendorAssociatedVendorCredit,
|
||||
|
||||
// # Inventory
|
||||
InventoryCostGLBeforeWriteSubscriber,
|
||||
|
||||
// #Invoices
|
||||
InvoicePaymentGLRewriteSubscriber,
|
||||
InvoiceCostGLEntriesSubscriber,
|
||||
|
||||
BillPaymentsGLEntriesRewriteSubscriber,
|
||||
|
||||
// # Receipts
|
||||
SaleReceiptCostGLEntriesSubscriber,
|
||||
|
||||
// Transaction locking.
|
||||
SalesTransactionLockingGuardSubscriber,
|
||||
PurchasesTransactionLockingGuardSubscriber,
|
||||
FinancialTransactionLockingGuardSubscriber,
|
||||
CashflowWithAccountSubscriber,
|
||||
|
||||
// Warehouses
|
||||
WarehousesItemsQuantitySyncSubscriber,
|
||||
WarehouseTransferInventoryTransactionsSubscriber,
|
||||
WarehouseTransferAutoIncrementSubscriber,
|
||||
ActivateWarehousesSubscriber,
|
||||
|
||||
// Branches.
|
||||
AccountsTransactionsWarehousesSubscribe,
|
||||
...BranchesIntegrationsSubscribers(),
|
||||
...WarehousesIntegrationsSubscribers(),
|
||||
|
||||
// Manual Journals
|
||||
ManualJournalWriteGLSubscriber,
|
||||
|
||||
// Bills
|
||||
BillGLEntriesSubscriber,
|
||||
PaymentWriteGLEntriesSubscriber,
|
||||
|
||||
SeedInitialCurrenciesOnSetupSubsriber,
|
||||
MutateBaseCurrencyAccountsSubscriber,
|
||||
|
||||
// # Projects
|
||||
SyncActualTimeTaskSubscriber,
|
||||
ProjectBillableTasksSubscriber,
|
||||
ProjectBillableExpensesSubscriber,
|
||||
ProjectBillableBillSubscriber,
|
||||
];
|
||||
};
|
||||
37
packages/server/src/loaders/events.ts
Normal file
37
packages/server/src/loaders/events.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
// Here we import all events.
|
||||
// import 'subscribers/authentication';
|
||||
// import 'subscribers/organization';
|
||||
// import 'subscribers/inviteUser';
|
||||
// import 'subscribers/manualJournals';
|
||||
// import 'subscribers/expenses';
|
||||
|
||||
// import 'subscribers/Bills';
|
||||
// import 'subscribers/Bills/WriteJournalEntries';
|
||||
// import 'subscribers/Bills/WriteInventoryTransactions';
|
||||
|
||||
// // import 'subscribers/SaleInvoices';
|
||||
// // import 'subscribers/SaleInvoices/WriteInventoryTransactions';
|
||||
// // import 'subscribers/SaleInvoices/WriteJournalEntries';
|
||||
|
||||
// import 'subscribers/SaleReceipt';
|
||||
// import 'subscribers/SaleReceipt/WriteInventoryTransactions';
|
||||
// import 'subscribers/SaleReceipt/WriteJournalEntries';
|
||||
|
||||
// import 'subscribers/Inventory/Inventory';
|
||||
// import 'subscribers/Inventory/InventoryAdjustment';
|
||||
|
||||
// import 'subscribers/customers';
|
||||
// import 'subscribers/vendors';
|
||||
// import 'subscribers/paymentMades';
|
||||
// import 'subscribers/paymentReceives';
|
||||
// import 'subscribers/saleEstimates';
|
||||
// import 'subscribers/items';
|
||||
|
||||
// import 'subscribers/LandedCost';
|
||||
|
||||
// import 'services/Cashflow/CashflowTransactionSubscriber';
|
||||
|
||||
// import 'services/Sales/SaleInvoiceWriteoffSubscriber';
|
||||
// import 'subscribers/SaleInvoices/SendSmsNotificationToCustomer';
|
||||
// import 'subscribers/SaleReceipt/SendNotificationToCustomer';
|
||||
// import 'services/Sales/PaymentReceives/PaymentReceiveSmsSubscriber';
|
||||
72
packages/server/src/loaders/express.ts
Normal file
72
packages/server/src/loaders/express.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
import { json, Request, Response, NextFunction } from 'express';
|
||||
import helmet from 'helmet';
|
||||
import boom from 'express-boom';
|
||||
import errorHandler from 'errorhandler';
|
||||
import bodyParser from 'body-parser';
|
||||
import fileUpload from 'express-fileupload';
|
||||
import routes from 'api';
|
||||
import LoggerMiddleware from '@/api/middleware/LoggerMiddleware';
|
||||
import AgendashController from '@/api/controllers/Agendash';
|
||||
import ConvertEmptyStringsToNull from '@/api/middleware/ConvertEmptyStringsToNull';
|
||||
import RateLimiterMiddleware from '@/api/middleware/RateLimiterMiddleware';
|
||||
import {
|
||||
JSONResponseTransformer,
|
||||
snakecaseResponseTransformer,
|
||||
} from '@/api/middleware/JSONResponseTransformer';
|
||||
import config from '@/config';
|
||||
import path from 'path';
|
||||
import ObjectionErrorHandlerMiddleware from '@/api/middleware/ObjectionErrorHandlerMiddleware';
|
||||
|
||||
export default ({ app }) => {
|
||||
// Express configuration.
|
||||
app.set('port', 3000);
|
||||
|
||||
// Template engine configuration.
|
||||
app.set('views', path.join(__dirname, '../resources/views'));
|
||||
app.set('view engine', 'pug');
|
||||
|
||||
// Helmet helps you secure your Express apps by setting various HTTP headers.
|
||||
app.use(helmet());
|
||||
|
||||
// Allow to full error stack traces and internal details
|
||||
app.use(errorHandler());
|
||||
|
||||
// Boom response objects.
|
||||
app.use(boom());
|
||||
|
||||
app.use(bodyParser.json());
|
||||
|
||||
// Parses both json and urlencoded.
|
||||
app.use(json());
|
||||
|
||||
// Middleware for intercepting and transforming json responses.
|
||||
app.use(JSONResponseTransformer(snakecaseResponseTransformer));
|
||||
|
||||
// Handle multi-media requests.
|
||||
app.use(
|
||||
fileUpload({
|
||||
createParentPath: true,
|
||||
})
|
||||
);
|
||||
|
||||
// Logger middleware.
|
||||
app.use(LoggerMiddleware);
|
||||
|
||||
// Converts empty strings to null of request body.
|
||||
app.use(ConvertEmptyStringsToNull);
|
||||
|
||||
// Prefix all application routes.
|
||||
app.use(config.api.prefix, RateLimiterMiddleware);
|
||||
app.use(config.api.prefix, routes());
|
||||
|
||||
// Agendash application load.
|
||||
app.use('/agendash', AgendashController.router());
|
||||
|
||||
// Handles objectionjs errors.
|
||||
app.use(ObjectionErrorHandlerMiddleware);
|
||||
|
||||
// catch 404 and forward to error handler
|
||||
app.use((req: Request, res: Response, next: NextFunction) => {
|
||||
return res.boom.notFound();
|
||||
});
|
||||
};
|
||||
8
packages/server/src/loaders/i18n.ts
Normal file
8
packages/server/src/loaders/i18n.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { I18n } from 'i18n';
|
||||
|
||||
export default () => new I18n({
|
||||
locales: ['en', 'ar'],
|
||||
register: global,
|
||||
directory: global.__locales_dir,
|
||||
updateFiles: false,
|
||||
});
|
||||
34
packages/server/src/loaders/index.ts
Normal file
34
packages/server/src/loaders/index.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
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';
|
||||
|
||||
export default async ({ expressApp }) => {
|
||||
const mongoConnection = await mongooseLoader();
|
||||
Logger.info('[init] MongoDB loaded and connected!');
|
||||
|
||||
// Initialize the system database once app started.
|
||||
const knex = databaseLoader();
|
||||
|
||||
// Initialize the objection.js from knex instance.
|
||||
objectionLoader({ knex });
|
||||
|
||||
// It returns the agenda instance because it's needed in the subsequent loaders
|
||||
const { agenda } = await dependencyInjectorLoader({ mongoConnection, knex });
|
||||
|
||||
await jobsLoader({ agenda });
|
||||
Logger.info('[init] Jobs loaded');
|
||||
|
||||
expressLoader({ app: expressApp });
|
||||
Logger.info('[init] Express loaded');
|
||||
|
||||
i18nConfig();
|
||||
Logger.info('[init] I18n node configured.');
|
||||
};
|
||||
52
packages/server/src/loaders/jobs.ts
Normal file
52
packages/server/src/loaders/jobs.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
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 OrganizationSetupJob from 'jobs/OrganizationSetup';
|
||||
import OrganizationUpgrade from 'jobs/OrganizationUpgrade';
|
||||
import SmsNotification from 'jobs/SmsNotification';
|
||||
|
||||
export default ({ agenda }: { agenda: Agenda }) => {
|
||||
new WelcomeEmailJob(agenda);
|
||||
new ResetPasswordMailJob(agenda);
|
||||
new WelcomeSMSJob(agenda);
|
||||
new UserInviteMailJob(agenda);
|
||||
new SendLicenseViaEmailJob(agenda);
|
||||
new SendLicenseViaPhoneJob(agenda);
|
||||
new ComputeItemCost(agenda);
|
||||
new RewriteInvoicesJournalEntries(agenda);
|
||||
new OrganizationSetupJob(agenda);
|
||||
new OrganizationUpgrade(agenda);
|
||||
new SmsNotification(agenda);
|
||||
|
||||
agenda.define(
|
||||
'send-sms-notification-subscribe-end',
|
||||
{ priority: 'nromal', concurrency: 1, },
|
||||
new SendSMSNotificationSubscribeEnd().handler,
|
||||
);
|
||||
agenda.define(
|
||||
'send-sms-notification-trial-end',
|
||||
{ priority: 'normal', concurrency: 1, },
|
||||
new SendSMSNotificationTrialEnd().handler,
|
||||
);
|
||||
agenda.define(
|
||||
'send-mail-notification-subscribe-end',
|
||||
{ priority: 'high', concurrency: 1, },
|
||||
new SendMailNotificationSubscribeEnd().handler
|
||||
);
|
||||
agenda.define(
|
||||
'send-mail-notification-trial-end',
|
||||
{ priority: 'high', concurrency: 1, },
|
||||
new SendMailNotificationTrialEnd().handler
|
||||
);
|
||||
agenda.start();
|
||||
};
|
||||
13
packages/server/src/loaders/logger.ts
Normal file
13
packages/server/src/loaders/logger.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import winston from 'winston';
|
||||
|
||||
const transports = {
|
||||
console: new winston.transports.Console({ level: 'warn' }),
|
||||
file: new winston.transports.File({ filename: 'stdout.log' }),
|
||||
};
|
||||
|
||||
export default winston.createLogger({
|
||||
transports: [
|
||||
transports.console,
|
||||
transports.file,
|
||||
],
|
||||
});
|
||||
15
packages/server/src/loaders/mail.ts
Normal file
15
packages/server/src/loaders/mail.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import nodemailer from 'nodemailer';
|
||||
import config from '@/config';
|
||||
|
||||
// create reusable transporter object using the default SMTP transport
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: config.mail.host,
|
||||
port: config.mail.port,
|
||||
secure: config.mail.secure, // true for 465, false for other ports
|
||||
auth: {
|
||||
user: config.mail.username,
|
||||
pass: config.mail.password,
|
||||
},
|
||||
});
|
||||
|
||||
export default transporter;
|
||||
11
packages/server/src/loaders/mongoose.ts
Normal file
11
packages/server/src/loaders/mongoose.ts
Normal file
@@ -0,0 +1,11 @@
|
||||
import mongoose from 'mongoose';
|
||||
import { Db } from 'mongodb';
|
||||
import config from '@/config';
|
||||
|
||||
export default async (): Promise<Db> => {
|
||||
const connection = await mongoose.connect(
|
||||
config.mongoDb.databaseURL,
|
||||
{ useNewUrlParser: true, useCreateIndex: true },
|
||||
);
|
||||
return connection.connection.db;
|
||||
};
|
||||
24
packages/server/src/loaders/rateLimiterLoader.ts
Normal file
24
packages/server/src/loaders/rateLimiterLoader.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
import RateLimiter from '@/services/Authentication/RateLimiter';
|
||||
import { Container } from 'typedi';
|
||||
import { RateLimiterMemory } from 'rate-limiter-flexible';
|
||||
import config from '@/config';
|
||||
|
||||
export default () => {
|
||||
const rateLimiterRequestsMemory = new RateLimiterMemory({
|
||||
points: config.throttler.requests.points,
|
||||
duration: config.throttler.requests.duration,
|
||||
blockDuration: config.throttler.requests.blockDuration,
|
||||
});
|
||||
const rateLimiterMemoryLogin = new RateLimiterMemory({
|
||||
points: config.throttler.login.points,
|
||||
duration: config.throttler.login.duration,
|
||||
blockDuration: config.throttler.login.blockDuration,
|
||||
});
|
||||
|
||||
const rateLimiterRequest = new RateLimiter(rateLimiterRequestsMemory);
|
||||
const rateLimiterLogin = new RateLimiter(rateLimiterMemoryLogin)
|
||||
|
||||
// Inject the rate limiter of the global requests and login into the container.
|
||||
Container.set('rateLimiter.request', rateLimiterRequest);
|
||||
Container.set('rateLimiter.login', rateLimiterLogin);
|
||||
};
|
||||
9
packages/server/src/loaders/smsClient.ts
Normal file
9
packages/server/src/loaders/smsClient.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
import SMSClient from '@/services/SMSClient';
|
||||
import EasySMSGateway from '@/services/SMSClient/EasySmsClient';
|
||||
|
||||
export default (token: string) => {
|
||||
const easySmsGateway = new EasySMSGateway(token);
|
||||
const smsClient = new SMSClient(easySmsGateway);
|
||||
|
||||
return smsClient;
|
||||
};
|
||||
17
packages/server/src/loaders/systemRepositories.ts
Normal file
17
packages/server/src/loaders/systemRepositories.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import Container from 'typedi';
|
||||
import {
|
||||
SystemUserRepository,
|
||||
SubscriptionRepository,
|
||||
TenantRepository,
|
||||
} from '@/system/repositories';
|
||||
|
||||
export default () => {
|
||||
const knex = Container.get('knex');
|
||||
const cache = Container.get('cache');
|
||||
|
||||
return {
|
||||
systemUserRepository: new SystemUserRepository(knex, cache),
|
||||
subscriptionRepository: new SubscriptionRepository(knex, cache),
|
||||
tenantRepository: new TenantRepository(knex, cache),
|
||||
};
|
||||
}
|
||||
8
packages/server/src/loaders/tenantCache.ts
Normal file
8
packages/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;
|
||||
};
|
||||
124
packages/server/src/loaders/tenantModels.ts
Normal file
124
packages/server/src/loaders/tenantModels.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
import { mapValues } from 'lodash';
|
||||
|
||||
import Account from 'models/Account';
|
||||
import AccountTransaction from 'models/AccountTransaction';
|
||||
import Item from 'models/Item';
|
||||
import ItemEntry from 'models/ItemEntry';
|
||||
import ItemCategory from 'models/ItemCategory';
|
||||
import Bill from 'models/Bill';
|
||||
import BillPayment from 'models/BillPayment';
|
||||
import BillPaymentEntry from 'models/BillPaymentEntry';
|
||||
import Currency from 'models/Currency';
|
||||
import Contact from 'models/Contact';
|
||||
import Vendor from 'models/Vendor';
|
||||
import Customer from 'models/Customer';
|
||||
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 InventoryCostLotTracker from 'models/InventoryCostLotTracker';
|
||||
import InventoryTransaction from 'models/InventoryTransaction';
|
||||
import ManualJournal from 'models/ManualJournal';
|
||||
import ManualJournalEntry from 'models/ManualJournalEntry';
|
||||
import Media from 'models/Media';
|
||||
import MediaLink from 'models/MediaLink';
|
||||
import InventoryAdjustment from 'models/InventoryAdjustment';
|
||||
import InventoryAdjustmentEntry from 'models/InventoryAdjustmentEntry';
|
||||
import BillLandedCost from 'models/BillLandedCost';
|
||||
import BillLandedCostEntry from 'models/BillLandedCostEntry';
|
||||
import CashflowAccount from 'models/CashflowAccount';
|
||||
import CashflowTransaction from 'models/CashflowTransaction';
|
||||
import CashflowTransactionLine from 'models/CashflowTransactionLine';
|
||||
import Role from 'models/Role';
|
||||
import RolePermission from 'models/RolePermission';
|
||||
import User from 'models/User';
|
||||
import CreditNote from 'models/CreditNote';
|
||||
import VendorCredit from 'models/VendorCredit';
|
||||
import RefundCreditNote from 'models/RefundCreditNote';
|
||||
import RefundVendorCredit from 'models/RefundVendorCredit';
|
||||
import CreditNoteAppliedInvoice from 'models/CreditNoteAppliedInvoice';
|
||||
import VendorCreditAppliedBill from 'models/VendorCreditAppliedBill';
|
||||
import Branch from 'models/Branch';
|
||||
import Warehouse from 'models/Warehouse';
|
||||
import WarehouseTransfer from 'models/WarehouseTransfer';
|
||||
import WarehouseTransferEntry from 'models/WarehouseTransferEntry';
|
||||
import ItemWarehouseQuantity from 'models/ItemWarehouseQuantity';
|
||||
import Project from 'models/Project';
|
||||
import Time from 'models/Time';
|
||||
import Task from 'models/Task';
|
||||
|
||||
export default (knex) => {
|
||||
const models = {
|
||||
Option,
|
||||
Account,
|
||||
AccountTransaction,
|
||||
Item,
|
||||
ItemCategory,
|
||||
ItemEntry,
|
||||
ManualJournal,
|
||||
ManualJournalEntry,
|
||||
Bill,
|
||||
BillPayment,
|
||||
BillPaymentEntry,
|
||||
Currency,
|
||||
ExchangeRate,
|
||||
Expense,
|
||||
ExpenseCategory,
|
||||
View,
|
||||
ViewRole,
|
||||
ViewColumn,
|
||||
Setting,
|
||||
SaleInvoice,
|
||||
SaleInvoiceEntry,
|
||||
SaleReceipt,
|
||||
SaleReceiptEntry,
|
||||
SaleEstimate,
|
||||
SaleEstimateEntry,
|
||||
PaymentReceive,
|
||||
PaymentReceiveEntry,
|
||||
InventoryTransaction,
|
||||
InventoryCostLotTracker,
|
||||
Media,
|
||||
MediaLink,
|
||||
Vendor,
|
||||
Customer,
|
||||
Contact,
|
||||
InventoryAdjustment,
|
||||
InventoryAdjustmentEntry,
|
||||
BillLandedCost,
|
||||
BillLandedCostEntry,
|
||||
CashflowTransaction,
|
||||
CashflowTransactionLine,
|
||||
CashflowAccount,
|
||||
Role,
|
||||
RolePermission,
|
||||
User,
|
||||
VendorCredit,
|
||||
CreditNote,
|
||||
RefundCreditNote,
|
||||
RefundVendorCredit,
|
||||
CreditNoteAppliedInvoice,
|
||||
VendorCreditAppliedBill,
|
||||
Branch,
|
||||
Warehouse,
|
||||
WarehouseTransfer,
|
||||
WarehouseTransferEntry,
|
||||
ItemWarehouseQuantity,
|
||||
Project,
|
||||
Time,
|
||||
Task,
|
||||
};
|
||||
return mapValues(models, (model) => model.bindKnex(knex));
|
||||
};
|
||||
41
packages/server/src/loaders/tenantRepositories.ts
Normal file
41
packages/server/src/loaders/tenantRepositories.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import AccountRepository from '@/repositories/AccountRepository';
|
||||
import VendorRepository from '@/repositories/VendorRepository';
|
||||
import CustomerRepository from '@/repositories/CustomerRepository';
|
||||
import ExpenseRepository from '@/repositories/ExpenseRepository';
|
||||
import ViewRepository from '@/repositories/ViewRepository';
|
||||
import ViewRoleRepository from '@/repositories/ViewRoleRepository';
|
||||
import ContactRepository from '@/repositories/ContactRepository';
|
||||
import AccountTransactionsRepository from '@/repositories/AccountTransactionRepository';
|
||||
import SettingRepository from '@/repositories/SettingRepository';
|
||||
import ExpenseEntryRepository from '@/repositories/ExpenseEntryRepository';
|
||||
import BillRepository from '@/repositories/BillRepository';
|
||||
import SaleInvoiceRepository from '@/repositories/SaleInvoiceRepository';
|
||||
import ItemRepository from '@/repositories/ItemRepository';
|
||||
import InventoryTransactionRepository from '@/repositories/InventoryTransactionRepository';
|
||||
|
||||
export default (knex, cache, i18n) => {
|
||||
return {
|
||||
accountRepository: new AccountRepository(knex, cache, i18n),
|
||||
transactionsRepository: new AccountTransactionsRepository(
|
||||
knex,
|
||||
cache,
|
||||
i18n
|
||||
),
|
||||
customerRepository: new CustomerRepository(knex, cache, i18n),
|
||||
vendorRepository: new VendorRepository(knex, cache, i18n),
|
||||
contactRepository: new ContactRepository(knex, cache, i18n),
|
||||
expenseRepository: new ExpenseRepository(knex, cache, i18n),
|
||||
expenseEntryRepository: new ExpenseEntryRepository(knex, cache, i18n),
|
||||
viewRepository: new ViewRepository(knex, cache, i18n),
|
||||
viewRoleRepository: new ViewRoleRepository(knex, cache, i18n),
|
||||
settingRepository: new SettingRepository(knex, cache, i18n),
|
||||
billRepository: new BillRepository(knex, cache, i18n),
|
||||
saleInvoiceRepository: new SaleInvoiceRepository(knex, cache, i18n),
|
||||
itemRepository: new ItemRepository(knex, cache, i18n),
|
||||
inventoryTransactionRepository: new InventoryTransactionRepository(
|
||||
knex,
|
||||
cache,
|
||||
i18n
|
||||
),
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user