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:
Ahmed Bouhuolia
2020-09-15 00:51:39 +02:00
parent ad00f140d1
commit a22c8395f3
293 changed files with 3391 additions and 1637 deletions

View File

@@ -1,5 +1,5 @@
import Agenda from 'agenda';
import config from '@/../config/config';
import config from 'config';
export default ({ mongoConnection }) => {
return new Agenda({

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

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

View File

@@ -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) {

View File

@@ -1,3 +1,3 @@
// Here we import all events.
import '@/subscribers/authentication';
import '@/subscribers/organization';
import 'subscribers/authentication';
import 'subscribers/organization';

View File

@@ -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.

View File

@@ -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
})

View File

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

View File

@@ -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',

View File

@@ -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({

View File

@@ -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(

View File

@@ -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();

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

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

@@ -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 = {

View File

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