HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/1233/root/home/arjun/projects/good-life-be/app.js
import compression from 'compression';
import cookieParser from 'cookie-parser';
import cors from 'cors';
import express from 'express';
import moment from 'moment-timezone';
import 'express-async-errors';
import { Op, Sequelize } from 'sequelize';
import fileUpload from 'express-fileupload';
import helmet from 'helmet';
import cron from 'node-cron';
import swaggerUi from 'swagger-ui-express';
import './config/config.js';
import './config/index.js';
import swaggerSpec from './config/swagger-config.js';
import { logger } from './config/winston-config.js';
import logRequest from './helper/logRequest.js';
import { deletePdfs } from './helper/pdfGeneration.js';
import errorHandler from './middleware/errorHandler.js';
import requestLogger from './middleware/requestLogger.js';
import sanitizeMiddleware from './middleware/sanitize.js';
import swaggerAuth from './middleware/swaggerAuth.js';
import './models/index.js';
import apiRouter from './routes/index.js';
import { runCronJob } from './helper/questionsCron.js';
import User from './models/User.js';
import FormData from './models/formDataModel.js';
import { postQuestions } from './api/Questions/service.js';
import usersEventsFailureCron from './helper/eventUpdation.js';
import deleteOldTempFormData from './helper/deleteTempData.js';
import Event from './models/Event.js';

// import urlSigner from './middleware/usrlSigner.js';
// import { deletePdf, sendReport } from './api/website/service.js';
// import { getMetricsData } from './modules/Statistics/index.js';

const app = express();

app.use(helmet());
app.use(compression());
// app.use(
//   cors({
//     origin: [
//       /^(http|https):\/\/(localhost)(:\d+)?$/, // Localhost URLs
//       /^https:\/\/[a-z0-9-]+\.inc\d+\.devtunnels\.ms(\/.*)?$/, // Dev Tunnels URLs
//       process.env.WEB_DOMAIN, // Your web domain
//       process.env.WEB_DOMAIN_ADMIN, // Your admin web domain
//     ],
//     credentials: true,
//   })
// );

// app.use(
//   cors({
//     origin: [
//       /^(http|https):\/\/(localhost)(:\d+)?$/, // Localhost URLs
//       /^https:\/\/[a-z0-9-]+\.inc\d+\.devtunnels\.ms(\/.*)?$/, // Dev Tunnels URLs
//       process.env.WEB_DOMAIN, // Your web domain
//       process.env.WEB_DOMAIN_ADMIN, // Your admin web domain
//     ],
//     methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
//     allowedHeaders: ['Content-Type', 'Authorization'],
//     credentials: true,
//   })
// );

app.use(
  cors({
    origin: '*', // Accept all origins
    methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD'], // Accept all common HTTP methods
    allowedHeaders: '*', // Allow all headers
    credentials: true, // Allow cookies, if needed
  })
);

app.use(express.json());
app.use(express.urlencoded({ limit: '300mb', extended: true }));
app.use(cookieParser());
app.use(fileUpload());

if (process.env.NODE_ENV !== 'production') {
  logRequest(app);
}

app.use('/', express.static('public'));

app.use(sanitizeMiddleware);
app.use(requestLogger);

app.use(
  '/api-docs',
  swaggerAuth,
  swaggerUi.serve,
  swaggerUi.setup(swaggerSpec)
);
app.use('/api', apiRouter);

app.use(errorHandler);

app.get('/', (req, res) => {
  res.send('API WORKING FINE!!');
});

const PORT = process.env.PORT || 3000;

process.on('uncaughtException', (error) => {
  logger.error(`Uncaught Exception: ${error.message}\n${error.stack}`);
});

process.on('unhandledRejection', (reason, promise) => {
  logger.error(`Unhandled Rejection: ${reason}\n${promise}`);
});

const server = app.listen(PORT, async () => {
  logger.info(`Server started successfully on port: ${PORT}`);
  logger.info(`App: http://localhost:${PORT}`);
  logger.info(`Swagger: http://localhost:${PORT}/api-docs`);
});

server.on('error', (error) => {
  if (error.code === 'EADDRINUSE') {
    logger.error(`Port ${PORT} is already in use. Trying another port...`);
    process.exit(1);
  } else if (error.code === 'EACCES') {
    logger.error(`Permission denied. Cannot access port ${PORT}.`);
    process.exit(1);
  } else {
    logger.error('Server error:', error);
    process.exit(1);
  }
});

// ------------->>> Cron section <<<----------------
cron.schedule('0 0 * * *', async () => {
  await deletePdfs()
    .then(() => console.log('Cron ran successfully'))
    .catch(() => console.log('Something went wrong.'));
});

cron.schedule('*/4 * * * * *', async () => {
  try {
    const users = await User.findAll({
      where: {
        is_deleted: false,
        status: 'active',
        eventStatus: 'pending',
      },
      raw: true,
    });

    for (const user of users) {
      const userId = user.id;

      // Fetch form data for this user
      const formData = await FormData.findOne({
        where: {
          user_id: userId,
          status: { [Op.notIn]: ['processing', 'completed'] },
        },
        raw: true,
      });

      if (formData) {
        const result = await runCronJob(formData, userId);
        console.log(`Cron ran successfully for user: ${userId}`);
        console.log(`User ${userId} processing result: ${result}`);
      }
    }
  } catch (error) {
    console.error('Something went wrong in the cron job:', error);
  }
});

cron.schedule('*/30 * * * *', async () => {
  const formData = await FormData.findOne({
    where: {
      [Op.or]: [
        { Data: null }, // Check if Data is NULL
        Sequelize.where(
          Sequelize.cast(Sequelize.col('Data'), 'text'),
          Op.eq,
          '{}'
        ), // Check if Data is an empty JSON object
        Sequelize.where(
          Sequelize.cast(Sequelize.col('Data'), 'text'),
          Op.eq,
          '[]'
        ), // Check if Data is an empty JSON array
      ],
    },
    raw: true,
  });
  await postQuestions(formData.userData, formData.user_id)
    .then(() => console.log('Cron ran successfully'))
    .catch(() => console.log('Something went wrong.'));
});

cron.schedule('* * * * *', async () => {
  const startTime = moment().format('YYYY-MM-DD HH:mm:ss');
  console.log(`Task started at: ${startTime}`);
  await usersEventsFailureCron();
  const endTime = moment().format('YYYY-MM-DD HH:mm:ss');
  console.log(`Task completed at: ${endTime}`);
});

// cron.schedule('0 0 * * *', async () => {
//   const startTime = moment().format('YYYY-MM-DD HH:mm:ss');
//   console.log(`TempFormData cleanup started at: ${startTime}`);
//   await deleteOldTempFormData();
//   const endTime = moment().format('YYYY-MM-DD HH:mm:ss');
//   console.log(`TempFormData cleanup completed at: ${endTime}`);
// });