| Current Path : /proc/thread-self/root/proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/ |
| Current File : //proc/thread-self/root/proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/app.js |
// Partner Manager Server
// Dependencies ===========================================================
require('dotenv').config();
const helmet = require('helmet');
const express = require('express');
const mongoose = require('mongoose');
const { graphqlHTTP } = require('express-graphql');
const { NoSchemaIntrospectionCustomRule } = require('graphql');
const amqp = require('./services/amqp');
const cron = require('./services/cron');
// REST API
const rest = require('./rest/routes');
// Graphql Schema
const { graphqlSchema } = require('./graphql/schema');
// Services ===============================================================
const { checkOrders } = require('./services/oms');
const { initCategoriesDb } = require('./services/category');
const { manageDefaultAccessesAsync, querySuperAdminOrMyPartnerAdminRequired } = require('./services/auth');
const indacoModulesRegistration = require('./models/indaco-modules/index');
// Initialization ==========================================================
// Creating Express server
const app = express();
// Connect to database
const mongooseOptions = {
autoIndex: false, // Don't build indexes
maxPoolSize: 10, // Maintain up to 10 socket connections
serverSelectionTimeoutMS: 5000, // Keep trying to send operations for 5 seconds
socketTimeoutMS: 45000, // Close sockets after 45 seconds of inactivity
family: 4, // Use IPv4, skip trying IPv6,
useUnifiedTopology: true, // To use the new Server Discover and Monitoring engine
useNewUrlParser: true, // Use the new URL parser;
};
mongoose.connect(process.env.DATABASE_URL, mongooseOptions);
// mongoose.set('useCreateIndex', true); No more needed in Mongoose >v6. True by default and set deprecated TBR
mongoose.connection.on('open', async () => {
console.log('[MONGODB] Connected to database');
// Intialize CRON job
// if the app is managed by PM2, it can be used an environment variable provided by PM2 itself called NODE_APP_INSTANCE
// NODE_APP_INSTANCE environment variable can be used to determine difference between process, if you want to run a cronjob only on one process
if (process.env.NODE_APP_INSTANCE === '0') {
cron.cronUpdateProducts();
cron.cronCheckOrderNumbers();
// cron.cronUpdateProductsOnce();
}
// cron.cronCheckOrderNumbersOnce();
// Creating RabbitMQ consumer
amqp.rabbitMQ();
});
// APP ==================================================================
// Middleware initializations
app.use(helmet());
app.use(express.json({ limit: '50mb' }));
app.use(express.json());
app.use('/rest', rest);
// GrahpQL driven routes
app.use('/', graphqlHTTP((req) => ({
schema: graphqlSchema,
validationRules: [NoSchemaIntrospectionCustomRule],
})));
// Server start
const serverPort = process.env.PORT || 3000;
app.listen(serverPort, () => {
console.log(`[PMS] Partner Manager listening on port http://localhost:${serverPort}`);
initCategoriesDb().finally(() => {
console.log('[PMS] Categories initiated');
});
// create or update the default user
manageDefaultAccessesAsync().finally(() => {
// REGISTER THE BACKEND MODULES
indacoModulesRegistration.registerIndacoModuleAsync(indacoModulesRegistration.indacoModulesRegistries.PMS);
indacoModulesRegistration.registerIndacoModuleAsync(indacoModulesRegistration.indacoModulesRegistries.SFG);
});
});