add server to monorepo.

This commit is contained in:
a.bouhuolia
2023-02-03 11:57:50 +02:00
parent 28e309981b
commit 80b97b5fdc
1303 changed files with 137049 additions and 0 deletions

View 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,
});
};

View 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 }),
});
};

View 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,
});

View 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;
}
};

View 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,
];
};

View 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';

View 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();
});
};

View File

@@ -0,0 +1,8 @@
import { I18n } from 'i18n';
export default () => new I18n({
locales: ['en', 'ar'],
register: global,
directory: global.__locales_dir,
updateFiles: false,
});

View 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.');
};

View 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();
};

View 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,
],
});

View 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;

View 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;
};

View 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);
};

View 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;
};

View 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),
};
}

View File

@@ -0,0 +1,8 @@
import { Container } from 'typedi';
import Cache from '@/services/Cache';
export default (tenantId: number) => {
const cacheInstance = new Cache();
return cacheInstance;
};

View 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));
};

View 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
),
};
};