Your IP : 216.73.217.13


Current Path : /proc/thread-self/root/proc/thread-self/root/home/deltalab/PMS/partner-manager-backend/
Upload File :
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);
  });
});