server.js

/**
 * This file initializes the server, sets up middleware, and connects to the MongoDB database.
 * @module server
 */

//Initializing env variables
require('dotenv').config();

//Initializing logger
const logger = require('./config/logger.config.js');

//Initializing express
const express = require('express');
const {json, urlencoded} = require('express');
const app = express();

//CORS configuration
const cors = require('cors');

//router import
const apiRoutes = require('./routes/api.routes.js');
const docRoutes = require('./routes/doc.routes.js');

//Import mongoConnection
const mongoConnection = require('./databases/mongo.connection.js');

//Import error middlewares
const errorMiddleware = require('./middlewares/error.middleware.js');
const notFoundMiddleware = require('./middlewares/notFound.middleware.js');

//Swagger imports
const swaggerUi = require('swagger-ui-express');
const swaggerDocs = require('./config/swagger.config.js');

//Path imports
const path = require('path');


//Global middlewares
app.use(json());
app.use(urlencoded({extended: true}));

app.use(cors({
    origin: `*`,
    mehtods: ['GET']
}));

//EJS configuration
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

//Static files
app.use(express.static('public'));

//Routes
app.use('/v1', apiRoutes);
app.use('/', docRoutes);


//Swagger configuration
app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerDocs));

app.use('/jsdoc', express.static(path.join(__dirname, '../docs/jsdoc')));

//Error middlewares
app.use(errorMiddleware);
app.use('/v1', notFoundMiddleware);
app.use((req, res) => {
    res.status(404).render('pages/404', { url: req.url} );
});

//Port config
const PORT = process.env.PORT || 3001;


/**
 * Function to run the server and connect to MongoDB.
 * It shows a successful log message or catches an error if it fails to connect.
 * 
 * @async
 * @function runServer
 * @returns {Promise<void>} - A promise that resolves when the server is running.
 * @throws {Error} - Throws an error if the server fails to initialize.
 * @memberof module:server
 */
const runServer = async () => {
    try{
        //MondoDB connection
        await mongoConnection();

        //Initializing server
        app.listen(PORT, () => {
            logger.info(`Server - Running on http://localhost:${PORT}`);
        })

    }catch(error){
        logger.error('Server - Error initializing');
    }
}

runServer();