From bad25d02163afe3bc35a5cc91242472a6076bede Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Dec 2025 11:55:06 +0530 Subject: [PATCH] Low - Information Exposure Through an Error Message --- app/controllers/config.controller.js | 7 +- app/controllers/dashboard.controller.js | 26 +---- app/controllers/deployment.controller.js | 2 +- app/controllers/establishment.controller.js | 96 ++++++------------- .../establishment_products.controller.js | 16 +++- .../establishment_user.controller.js | 25 ++--- .../establishment_users_auth.controller.js | 7 +- .../notificationTemplate.controller.js | 16 +++- app/controllers/products.controller.js | 38 +++----- ...uarterlyWindowsConfiguration.controller.js | 18 +++- app/controllers/submission.controller.js | 82 ++++++---------- app/controllers/unitMasterController.js | 34 ++++--- app/controllers/user.controller.js | 17 ++-- .../variationReasonMaster.controller.js | 14 ++- .../zeroTargetReasonMaster.controller.js | 16 +++- 15 files changed, 180 insertions(+), 234 deletions(-) diff --git a/app/controllers/config.controller.js b/app/controllers/config.controller.js index 8bc8dad..b96eede 100644 --- a/app/controllers/config.controller.js +++ b/app/controllers/config.controller.js @@ -1,5 +1,6 @@ const db = require("../models"); const SubmissionDeadline = db.SubmissionDeadline; +const logger = require("../services/logger"); @@ -45,8 +46,8 @@ exports.updateDeadlineData = async (req, res) => { res.status(201).json({ status: "success", message: "Deadline created successfully", data: newRecord }); } - } catch (err) { - console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + } catch (err) { + logger.error(err.message); + res.status(500).json({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/dashboard.controller.js b/app/controllers/dashboard.controller.js index 04fdf26..02f8e3b 100644 --- a/app/controllers/dashboard.controller.js +++ b/app/controllers/dashboard.controller.js @@ -1,6 +1,7 @@ const { Sequelize, Op } = require("sequelize"); const { Establishment, Submission, Emirate, EstablishmentUser, SubmissionProduct, SubmissionDeadline, QuarterlyWindowsConfiguration } = require("../models"); +const logger = require("../services/logger"); @@ -179,30 +180,14 @@ exports.getEstablishmentDashboard = async (req, res) => { }); } catch (err) { - console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on establishment dashboard data', { error: err.message }); + res.status(500).json({ status: "failed", message: "Internal server error" }); } }; exports.adminDashboard = async (req, res) => { try { let { quarter, year } = req.query; - - // if quarter/year not passed → take latest open config - // if (!quarter || !year) { - // const lastConfig = await QuarterlyWindowsConfiguration.findOne({ - // order: [ - // ['year', 'DESC'], - // ['quarter', 'DESC'] - // ] - // }); - - // if (lastConfig) { - // quarter = lastConfig.quarter; - // year = lastConfig.year; - // } - // } - let whereCond = {}; if (quarter === 'All') quarter = null; if (year === 'All') year = null; @@ -296,13 +281,12 @@ exports.adminDashboard = async (req, res) => { }); } catch (err) { - console.error(err); - return res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error admin dashboard', { error: err.message }); + return res.status(500).json({ status: "failed", message: "Internal server error" }); } }; - // exports.adminDashboard = async (req, res) => { // try { // const { quarter, year } = req.query; // e.g., Q1, 2025 diff --git a/app/controllers/deployment.controller.js b/app/controllers/deployment.controller.js index a4a1393..57c7088 100644 --- a/app/controllers/deployment.controller.js +++ b/app/controllers/deployment.controller.js @@ -121,6 +121,6 @@ exports.deployment = async (req, res) => { } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; \ No newline at end of file diff --git a/app/controllers/establishment.controller.js b/app/controllers/establishment.controller.js index 0212718..a5506ef 100644 --- a/app/controllers/establishment.controller.js +++ b/app/controllers/establishment.controller.js @@ -28,10 +28,10 @@ const sanitizeStringValue = (value) => exports.testEmail = async (req, res) => { placeHolderData = { - contact_name : 'Gowtham', + contact_name : '', portal_url : process.env.FE_BASE_URL, - username: 'test_user', - password: 'Test@123!', + username: '', + password: '', support_email : process.env.SUPPORT_EMAIL, support_phone : process.env.SUPPORT_PHONE, @@ -266,7 +266,8 @@ exports.createEstablishment = async (req, res) => { message: `${field} already exists` }); } - return res.status(500).send({status: "failed",message: err.message,}); + logger.error('Error creating establishment', { error: err.message }); + return res.status(500).send({status: "failed",message: "Internal server error" }); } }; @@ -427,15 +428,13 @@ exports.getAllEstablishments = async (req, res) => { }); } catch (err) { - console.error(err); - - // Set security headers even for error responses + logger.error('Error on get all establishment', { error: err.message }); res.setHeader('X-Frame-Options', 'DENY'); res.setHeader('X-Content-Type-Options', 'nosniff'); return res.status(500).json({ status: "failed", - message: err.message || "Internal server error", + message: "Internal server error", }); } }; @@ -517,7 +516,8 @@ exports.getEstablishmentById = async (req, res) => { return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on get establishment by Id', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -541,13 +541,7 @@ exports.updateEstablishment = async (req, res) => { const { id } = req.params; const { establishment_products, establishment_user, ...estData } = req.body; const user = await EstablishmentUser.findOne({where:{establishment_id:id}}); - // console.log("Establishment User email: ",user.email) - // if (user?.email === 'bhavinkumar.chandulal@fcsc.gov.ae') { - // return res.status(403).json({ - // status: "error", - // message: "You cannot modify Super Admin data." - // }); - // } + const resolveActionDoneBy = (item) => { if (item?.action_done_by) return item.action_done_by; @@ -611,27 +605,6 @@ exports.updateEstablishment = async (req, res) => { } } - // update establishment products - // if (Array.isArray(establishment_products)) { - // let incomingIds = establishment_products.map(e => e.product_id); - - // const oldProducts = await EstablishmentProduct.findAll({ where:{ establishment_id:id } }); - // const oldIds = oldProducts.map(e => e.product_id); - - // // remove products not in new list - // const removeIds = oldIds.filter(v => !incomingIds.includes(v)); - // if (removeIds.length) { - // await EstablishmentProduct.destroy({ where:{ establishment_id:id, product_id:removeIds } }); - // } - - // // add only new ones - // const newIds = incomingIds.filter(v => !oldIds.includes(v)); - - // for (let pid of newIds) { - // await EstablishmentProduct.create({ establishment_id:id, product_id:pid, created_by: req.user.id}); - // } - // } - if (Array.isArray(establishment_products)) { const incoming = establishment_products; @@ -707,36 +680,18 @@ exports.updateEstablishment = async (req, res) => { } } - return res.json({ status:"success", message:"Updated successfully" , data:"" }); + return res.json({ status:"success", message:"Updated successfully" }); } catch(err) { if (err.name === "SequelizeUniqueConstraintError") { const field = err.errors[0].path; return res.status(400).json({ status:"failed", message:`${field} already exists` }); } - return res.status(500).json({ status:"failed", message: err.message }); + logger.error('Error updating establishment', { error: err.message }); + return res.status(500).json({ status:"failed", message: "Internal server error" }); } }; -// exports.updateEstablishment = async (req, res) => { -// try { - -// const [updated] = await Establishment.update(req.body, { -// where: { id: req.params.id }, -// }); - -// if (!updated){ return res.status(404).send({'status':"failed",'message':"Record Not found",'data': "" }); } - -// return res.status(200).send({'status':"success",'message':"Updated successfully",'data': "" }); - -// } catch (err) { -// return res.status(500).send({'status':"failed",'message':err.message }); -// } -// }; - - - - // Delete establishment exports.deleteEstablishment = async (req, res) => { try { @@ -748,7 +703,8 @@ exports.deleteEstablishment = async (req, res) => { return res.status(200).send({'status':"success",'message':"Deleted successfully",'data': "" }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error deleting establishment', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -762,7 +718,8 @@ exports.getAllEmirates = async (req, res) => { return res.status(200).send({status: "success", message: "Emirates fetched successfully", data: emirates,}); } catch (err) { - return res.status(500).send({status: "failed",message: err.message || "Internal server error", }); + logger.error('Error on get all emirates', { error: err.message }); + return res.status(500).send({status: "failed",message: "Internal server error", }); } }; @@ -811,7 +768,8 @@ exports.getAllCityTowns = async (req, res) => { return res.status(200).send({status: "success", message: "City/Town fetched successfully", data: sanitizedCities, }); } catch (err) { - return res.status(500).send({ status: "failed", message: err.message || "Internal server error", }); + logger.error('Error getting all city towns', { error: err.message }); + return res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -826,7 +784,8 @@ exports.getAllRequests = async (req, res) => { data: requests, }); } catch (err) { - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on getall request', { error: err.message }); + res.status(500).json({ status: "failed", message: "Internal server error" }); } }; @@ -904,7 +863,8 @@ exports.createRequest = async (req, res) => { }); } catch (err) { console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on create request', { error: err.message }); + res.status(500).json({ status: "failed", message: "Internal server error"}); } }; @@ -988,7 +948,7 @@ exports.forgotPasswordRequestOTP = async (req, res) => { } catch (err) { logger.error(`Error in forgotPasswordRequestOTP: ${err.message}`); - return res.status(500).json({ status: "failed", message: err.message }); + return res.status(500).json({ status: "failed", message: "Internal server error" }); } }; @@ -1063,7 +1023,7 @@ exports.forgotPasswordVerifyOTP = async (req, res) => { } catch (err) { logger.error(`Error in forgotPasswordVerifyOTP: ${err.message}`); - return res.status(500).json({ status: "failed", message: err.message }); + return res.status(500).json({ status: "failed", message: "Internal server error" }); } }; @@ -1634,8 +1594,7 @@ exports.establishmentBulkUpload = async (req, res) => { } return res.status(500).send({ status: "failed", - message: "Unexpected error occurred during bulk upload", - error: err.message + message: "Unexpected error occurred during bulk upload" }); } }; @@ -1655,7 +1614,8 @@ exports.downloadCompanyProfileSample = async (req, res) => { return res.download(safeFilePath, "company_profile_upload_sample.csv"); } catch (error) { - return res.status(500).send({ status: "failed", message: error.message }); + logger.error('Error on downloading company profile sample file', { error: error.message }); + return res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/establishment_products.controller.js b/app/controllers/establishment_products.controller.js index c50510d..0a8a509 100644 --- a/app/controllers/establishment_products.controller.js +++ b/app/controllers/establishment_products.controller.js @@ -3,6 +3,7 @@ const db = require("../models"); const EstablishmentProduct = db.EstablishmentProduct; const Product = db.Product; const UnitMaster = db.UnitMaster; +const logger = require("../services/logger"); exports.createEstablishmentProduct = async (req, res) => { @@ -73,7 +74,8 @@ exports.createEstablishmentProduct = async (req, res) => { res.status(201).send({'status':"success",'message':"Establishment Product Created successfully."}); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on creating establishment product', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -115,7 +117,8 @@ exports.getAllEstablishmentProducts = async (req, res) => { res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error get all establishment products', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -129,7 +132,8 @@ exports.getEstablishmentProductById = async (req, res) => { res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error get establishment product', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -153,7 +157,8 @@ exports.updateEstablishmentProduct = async (req, res) => { res.status(200).send({'status':"success",'message':"Record updated successfully",'data': "" }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on updating establishment product', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -167,6 +172,7 @@ exports.deleteEstablishmentProduct = async (req, res) => { res.status(200).send({'status':"success",'message':"Record deleted successfully",'data': "" }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on deleting establishment product', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; diff --git a/app/controllers/establishment_user.controller.js b/app/controllers/establishment_user.controller.js index 7739d8d..7eab21c 100644 --- a/app/controllers/establishment_user.controller.js +++ b/app/controllers/establishment_user.controller.js @@ -5,6 +5,7 @@ const Establishment = db.Establishment; const crypto = require("crypto"); const { sendEmailService } = require("../services/email.service"); const { sanitizeForLog } = require("../utils/sanitize"); +const logger = require("../services/logger"); // Create User exports.createUser = async (req, res) => { @@ -106,10 +107,8 @@ exports.createUser = async (req, res) => { message: "Establishment User created successfully.", }); } catch (error) { - return res.status(500).json({ - status: "error", - message: error.message - }); + logger.error('Error on creating user', { error: error.message }); + return res.status(500).json({ status: "error", message: "Internal server error" }); } }; @@ -133,7 +132,8 @@ exports.getAllUsers = async (req, res) => { return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': users }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on get all users', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -148,7 +148,8 @@ exports.getUserById = async (req, res) => { return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': user }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on get user', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -176,7 +177,8 @@ exports.updateUser = async (req, res) => { return res.status(200).send({'status':"success",'message':"Record updated successfully",'data': "" }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on updating user', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -256,7 +258,8 @@ exports.deleteUser = async (req, res) => { return res.status(200).send({'status':"success",'message':"Record deleted successfully",'data': "" }); } catch (err) { - return res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Error on deleting user', { error: err.message }); + return res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -328,10 +331,8 @@ exports.triggerEstablishmentUsersWelcomeEmail = async (req, res) => { } catch (error) { console.error(error); - return res.status(500).json({ - status: "error", - message: error.message, - }); + logger.error('Error on sending establishment user welcome email', { error: error.message }); + return res.status(500).json({ status: "error", message: "Internal server error" }); } }; diff --git a/app/controllers/establishment_users_auth.controller.js b/app/controllers/establishment_users_auth.controller.js index 0ef06be..d902024 100644 --- a/app/controllers/establishment_users_auth.controller.js +++ b/app/controllers/establishment_users_auth.controller.js @@ -3,6 +3,7 @@ const jwt = require("jsonwebtoken"); const db = require("../models"); const sanitize = require("sanitize-html"); const EstablishmentUser = db.EstablishmentUser; +const logger = require("../services/logger"); const sanitizeStringValue = (value) => typeof value === "string" @@ -38,7 +39,8 @@ exports.login = async (req, res) => { res.status(200).send({'status':"success",'message':"Login successful",'data': token }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Login error', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -50,6 +52,7 @@ exports.logout = async (req, res) => { res.status(200).send({'status':"success",'message':"Logout successful",'data': "" }); res.status(200).json({ message: "Logout successful (client should discard token)" }); } catch (err) { - res.status(500).send({'status':"failed",'message':err.message }); + logger.error('Logout error', { error: err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; diff --git a/app/controllers/notificationTemplate.controller.js b/app/controllers/notificationTemplate.controller.js index b262943..d636746 100644 --- a/app/controllers/notificationTemplate.controller.js +++ b/app/controllers/notificationTemplate.controller.js @@ -1,6 +1,7 @@ const db = require("../models"); const NotificationTemplate = db.NotificationTemplate; const { sanitizeHtml } = require("../utils/sanitize"); +const logger = require("../services/logger"); // Create template exports.createTemplate = async (req, res) => { @@ -38,7 +39,8 @@ exports.createTemplate = async (req, res) => { }); } catch (err) { - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on creating notification template', { error: err.message }); + res.status(500).json({ status: "failed", message: "Internal server error" }); } }; @@ -78,9 +80,10 @@ exports.updateTemplate = async (req, res) => { }); } catch (err) { + logger.error('Error on updating notification template', { error: err.message }); return res.status(500).json({ status: "failed", - message: err.message + message: "Internal server error" }); } }; @@ -95,7 +98,8 @@ exports.getAllTemplates = async (req, res) => { data: templates, }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error on getall notification template', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -114,7 +118,8 @@ exports.getTemplateById = async (req, res) => { data: template, }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error on get template', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -134,6 +139,7 @@ exports.deleteTemplate = async (req, res) => { .status(200) .send({ status: "success", message: "Deleted successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error deleting template', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/products.controller.js b/app/controllers/products.controller.js index a962cc9..ef5fc7e 100644 --- a/app/controllers/products.controller.js +++ b/app/controllers/products.controller.js @@ -7,6 +7,7 @@ const Product = db.Product; const UnitMaster = db.UnitMaster; const sanitize = require("sanitize-html"); const { UPLOAD_DIR } = require('../config/upload.config'); +const logger = require("../services/logger"); const cleanString = (value) => typeof value === "string" @@ -71,7 +72,8 @@ exports.createProduct = async (req, res) => { res.status(201).send({'status':"success",'message':"created successfully." }); } catch (error) { - res.status(500).send({'status':"failed",'message':error.message }); + logger.error('Error on creating product', { error: error.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -116,7 +118,8 @@ exports.getAllProducts = async (req, res) => { }); } catch (error) { - res.status(500).send({ status: "failed", message: error.message }); + logger.error('Error on get all products', { error: error.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -130,7 +133,8 @@ exports.getProductById = async (req, res) => { res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data }); } catch (error) { - res.status(500).send({'status':"failed",'message':error.message }); + logger.error('Error on get product', { error: error.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -150,7 +154,8 @@ exports.updateProduct = async (req, res) => { res.status(200).send({'status':"success",'message':"Updated successfully",'data': "" }); } catch (error) { - res.status(500).send({'status':"failed",'message':error.message }); + logger.error('Error on update product', { error: error.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -165,7 +170,8 @@ exports.deleteProduct = async (req, res) => { res.status(200).send({'status':"success",'message':"Deleted successfully",'data': "" }); } catch (error) { - res.status(500).send({'status':"failed",'message':error.message }); + logger.error('Error on deleting product', { error: error.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -175,15 +181,11 @@ exports.downloadProductSample = async (req, res) => { const filePath = path.join(__dirname, "../downloads_csv/products_upload_sample.csv"); return res.download(filePath, "products_upload_sample.csv"); } catch (error) { - return res.status(500).send({ status: "failed", message: error.message }); + logger.error('Error on downloading HS Code sample file', { error: error.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; -/** - * Checkmarx-compliant path sanitizer - * This function removes path traversal sequences and validates against whitelist - * CxSAST recognizes this pattern as proper sanitization - */ function sanitizeFilePath(userInput, allowedDirectory) { if (!userInput || typeof userInput !== 'string') { throw new Error('Invalid file path input'); @@ -202,9 +204,6 @@ function sanitizeFilePath(userInput, allowedDirectory) { return resolvedPath; } -/** - * Checkmarx-compliant file existence validator - */ function validateFileExists(filePath) { if (!filePath) { return false; @@ -217,9 +216,6 @@ function validateFileExists(filePath) { } } -/** - * Safe file deletion with error handling - */ function deleteFileSecure(filePath) { if (!filePath) { return; @@ -247,9 +243,7 @@ exports.uploadProductsFromCSV = async (req, res) => { message: "No file uploaded" }); } - - // CHECKMARX COMPLIANT: Sanitize the file path - // This breaks the taint flow that Checkmarx tracks + try { sanitizedPath = sanitizeFilePath(req.file.path, UPLOAD_DIR); } catch (sanitizeError) { @@ -276,8 +270,6 @@ exports.uploadProductsFromCSV = async (req, res) => { message: "File not found after validation" }); } - - // Validate file extension using basename const originalName = path.basename(req.file.originalname); const fileExt = path.extname(originalName).toLowerCase(); @@ -625,7 +617,7 @@ exports.uploadProductsFromCSV = async (req, res) => { } return res.status(500).send({ status: "failed", - message: error.message + message: "Internal server error" }); } }; diff --git a/app/controllers/quarterlyWindowsConfiguration.controller.js b/app/controllers/quarterlyWindowsConfiguration.controller.js index c005145..96f4f88 100644 --- a/app/controllers/quarterlyWindowsConfiguration.controller.js +++ b/app/controllers/quarterlyWindowsConfiguration.controller.js @@ -6,6 +6,7 @@ const Establishment = db.Establishment; const EstablishmentUser = db.EstablishmentUser; const { sendEmailService } = require("../services/email.service"); const sanitize = require("sanitize-html"); +const logger = require("../services/logger"); // Create new configuration @@ -68,7 +69,8 @@ exports.createConfig = async (req, res) => { }); sendEmailsToEstablishments(placeholder); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error creating config', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -89,6 +91,8 @@ async function sendEmailsToEstablishments(placeholder) { } } catch (err) { console.error("Email background job failed:", err.message); + logger.error('Error sending email establishments', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } } @@ -113,7 +117,8 @@ exports.getAllConfigs = async (req, res) => { .status(200) .send({ status: "success", message: "Fetched successfully", quarter_count: data.length, data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error on getall config', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -130,7 +135,8 @@ exports.getConfigById = async (req, res) => { .status(200) .send({ status: "success", message: "Fetched successfully", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error get config by Id', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -151,7 +157,8 @@ exports.updateConfig = async (req, res) => { .status(200) .send({ status: "success", message: "Updated successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -170,6 +177,7 @@ exports.deleteConfig = async (req, res) => { .status(200) .send({ status: "success", message: "Deleted successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error deleting config', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/submission.controller.js b/app/controllers/submission.controller.js index 7083746..c1dc975 100644 --- a/app/controllers/submission.controller.js +++ b/app/controllers/submission.controller.js @@ -19,7 +19,7 @@ const { sendEmail } = require("../services/email.service"); const { sendEmailService } = require("../services/email.service"); const { getQuarterPeriods } = require("../services/quarterService"); const { sanitizeForLog } = require("../utils/sanitize"); - +const logger = require("../services/logger"); exports.createSubmission = async (req, res) => { try { @@ -192,10 +192,11 @@ exports.createSubmission = async (req, res) => { - res.status(201).json({ status: "success", data: result }); + res.status(201).json({ status: "success", message: "Submission created sucessfully."}); } catch (err) { - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on creating submission ', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -291,11 +292,10 @@ exports.updateSubmission = async (req, res) => { res.status(200).json({ status: "success", message: "Submission updated successfully", - data: updatedSubmission, }); } catch (err) { - console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error updating submission', { error: err.message }); + res.status(500).json({ status: "failed", message: "Internal server error" }); } }; @@ -328,47 +328,11 @@ exports.submissionHistory = async (req, res) => { res.status(200).json({ status: "success", data }); } catch (err) { - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on get submission history', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; -// exports.submissionList = async (req, res) => { -// try { - -// const data = await Submission.findAll({ -// include: [ -// { -// model: Establishment, -// as: "establishment" , -// attributes: ["factory_name","establishment_code"], -// include: [ -// { model: Emirate, as: "establishment_emirate", attributes: ["name"] } -// ] -// }, -// { -// model: EstablishmentUser, -// as: "created_user", -// attributes: ["name"], -// }, -// ], -// attributes: { -// include: [ -// [ -// Sequelize.literal(`(SELECT COUNT(*) FROM submission_products AS sp WHERE sp.submission_id = submission.id )`), -// "product_count", -// ], -// ], -// }, -// order: [["id", "DESC"]], -// }); - -// res.status(200).json({ status: "success", data }); - -// } catch (err) { -// res.status(500).json({ status: "failed", message: err.message }); -// } -// }; - exports.submissionList = async (req, res) => { try { const { @@ -516,7 +480,8 @@ exports.submissionList = async (req, res) => { }); } catch (err) { console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on submission listing', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -590,7 +555,8 @@ exports.viewSubmissionDetails = async (req, res) => { res.status(200).json({ status: "success", data: plainData, quarter_periods }); } catch (err) { - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on view submission', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -689,7 +655,8 @@ exports.getSubmissionHistory = async (req, res) => { } catch (err) { console.log(err); - return res.status(500).json({ status:"failed", message: err.message }); + logger.error('Error on submission history', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } } @@ -715,7 +682,8 @@ exports.submissionEditRequest = async (req, res) => { } catch (err) { console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on submission edit request', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -741,7 +709,8 @@ exports.enableOrDisableSubmissionEditAccess = async (req, res) => { } catch (err) { console.error(err); - res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on disable submission edit access', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -813,7 +782,8 @@ exports.approveOrRejectSubmission = async (req, res) => { }); } catch (err) { console.error(err); - res.status(500).json({ status: "failed", message: sanitizeForLog(err.message) }); + logger.error('Error on approve or reject submission', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -833,7 +803,8 @@ exports.getQuarterPeriods = async (req, res) => { return res.status(200).json({ status: "success", data: quarter_periods }); } catch (err) { - return res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on getting quater periods', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -882,7 +853,8 @@ exports.getPreviousForecastData = async (req, res) => { return res.status(200).json({ status:"success", data: submissionProduct }); } catch (err) { - return res.status(500).json({ status:"failed", message: err.message }); + logger.error('Error on getting previous forecasting data', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -964,7 +936,8 @@ exports.getBeforePreviousData = async (req, res) => { return res.status(200).json({ status: "success", data: submissionProduct }); } catch (err) { - return res.status(500).json({ status: "failed", message: err.message }); + logger.error('Error on get before previous data', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -1035,7 +1008,8 @@ exports.getProductSubmissionHistory = async (req, res) => { return res.status(200).json({ status:"success", data: submissionProductsData }); } catch (err) { - return res.status(500).json({ status:"failed", message: err.message }); + logger.error('Error on product submission history', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/unitMasterController.js b/app/controllers/unitMasterController.js index 03c51ba..34d3b3d 100644 --- a/app/controllers/unitMasterController.js +++ b/app/controllers/unitMasterController.js @@ -6,6 +6,7 @@ const fs = require("fs"); const csv = require("csv-parser"); const path = require("path"); const sanitize = require("sanitize-html"); +const logger = require("../services/logger"); const sanitizeStringValue = (value) => typeof value === "string" @@ -134,10 +135,8 @@ exports.createUnit = async (req, res) => { }); } catch (err) { - return res.status(400).json({ - status: "error", - message: err.message - }); + logger.error('Error on creating unit', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -171,7 +170,8 @@ exports.getAllUnits = async (req, res) => { res.status(200).json({ status: "success",unit_count : units.length, data: units }); } catch (err) { - res.status(500).json({ status: "error", message: err.message }); + logger.error('Error on getting all unit', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -183,7 +183,8 @@ exports.getUnitById = async (req, res) => { if (!unit) return res.status(404).json({ status: "error", message: "Unit not found" }); res.status(200).json({ status: "success", data: unit }); } catch (err) { - res.status(500).json({ status: "error", message: err.message }); + logger.error('Error on get unit by Id', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -197,9 +198,10 @@ exports.updateUnit = async (req, res) => { req.body.updated_at = req.body.updated_at || new Date(); await unit.update(req.body); - res.status(200).json({ status: "success", data: unit }); + res.status(200).json({ status: "success" }); } catch (err) { - res.status(400).json({ status: "error", message: err.message }); + logger.error('Error on updating unit', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -212,7 +214,8 @@ exports.deleteUnit = async (req, res) => { await unit.destroy(); res.status(200).json({ status: "success", message: "Unit deleted successfully" }); } catch (err) { - res.status(500).json({ status: "error", message: err.message }); + logger.error('Error on deleting unit', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -586,11 +589,8 @@ exports.uploadUnitMasterFromCSV = async (req, res) => { } catch (err) { deleteFileSecure(sanitizedPath); - return res.status(500).send({ - status: "failed", - message: "Server error", - error: err.message, - }); + logger.error('Error on import unit master csv file', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -609,9 +609,7 @@ exports.downloadUnitMasterFile = async (req, res) => { return res.download(safeFilePath, "unit_master_sample.csv"); } catch (error) { - return res.status(500).send({ - status: "failed", - message: error.message, - }); + logger.error('Error on downloading unit master csv sample file', { error: error.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/user.controller.js b/app/controllers/user.controller.js index a6e8c0c..daf61bd 100644 --- a/app/controllers/user.controller.js +++ b/app/controllers/user.controller.js @@ -21,7 +21,7 @@ exports.createUser = async (req, res) => { } catch (err) { logger.error(err.message); - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -35,7 +35,7 @@ exports.getAllUsers = async (req, res) => { } catch (err) { logger.error(err.message); - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -51,7 +51,7 @@ exports.getUserById = async (req, res) => { } catch (err) { logger.error(err.message); - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message': "Internal server error" }); } }; @@ -70,14 +70,14 @@ exports.updateUser = async (req, res) => { if (updated) { const updatedUser = await User.findByPk(req.params.id); - res.status(200).send({'status':"success",'message':"Updated successfully",'data': updatedUser }); + res.status(200).send({'status':"success",'message':"Updated successfully" }); } else { - res.status(404).send({'status':"failed",'message':"Record Not found",'data': "" }); + res.status(404).send({'status':"failed",'message':"Record Not found" }); } } catch (err) { logger.error(err.message); - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message':"Internal server error" }); } }; @@ -95,7 +95,7 @@ exports.deleteUser = async (req, res) => { } catch (err) { logger.error(err.message); - res.status(500).send({'status':"failed",'message':err.message }); + res.status(500).send({'status':"failed",'message': 'Internal server error' }); } }; @@ -136,6 +136,7 @@ exports.changeAdminUserPassword = async (req, res) => { return res.status(200).send({status: "success", message: "Password updated successfully",}); } catch (err) { - return res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + return res.status(500).send({ status: "failed", message: "Internal server error" }); } }; diff --git a/app/controllers/variationReasonMaster.controller.js b/app/controllers/variationReasonMaster.controller.js index 4bddd15..c4a4b93 100644 --- a/app/controllers/variationReasonMaster.controller.js +++ b/app/controllers/variationReasonMaster.controller.js @@ -1,6 +1,7 @@ // app/controllers/variationReasonMaster.controller.js const db = require("../models"); const VariationReasonMaster = db.VariationReasonMaster; +const logger = require("../services/logger"); // Create exports.createReason = async (req, res) => { @@ -38,6 +39,7 @@ exports.createReason = async (req, res) => { }); } catch (err) { + logger.error(err.message); return res.status(500).json({ status: "failed", message: "Internal server error" @@ -51,7 +53,8 @@ exports.getAllReasons = async (req, res) => { const data = await VariationReasonMaster.findAll(); res.status(200).send({ status: "success", message: "Fetched successfully", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error"}); } }; @@ -62,7 +65,8 @@ exports.getReasonById = async (req, res) => { if (!data) return res.status(404).send({ status: "failed", message: "Reason not found" }); res.status(200).send({ status: "success", message: "Fetched successfully", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error on get reason', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -78,7 +82,8 @@ exports.updateReason = async (req, res) => { if (updated[0] === 0) return res.status(404).send({ status: "failed", message: "Reason not found" }); res.status(200).send({ status: "success", message: "Updated successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error on updating reason', { error: err.message }); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -89,6 +94,7 @@ exports.deleteReason = async (req, res) => { if (!deleted) return res.status(404).send({ status: "failed", message: "Reason not found" }); res.status(200).send({ status: "success", message: "Deleted successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error('Error deleting reason', { error: err.message }); + res.status(500).send({ status: "failed", message:"Internal server error" }); } }; diff --git a/app/controllers/zeroTargetReasonMaster.controller.js b/app/controllers/zeroTargetReasonMaster.controller.js index cdbc761..3c6a212 100644 --- a/app/controllers/zeroTargetReasonMaster.controller.js +++ b/app/controllers/zeroTargetReasonMaster.controller.js @@ -1,5 +1,6 @@ const db = require("../models"); const ZeroTargetReasonMaster = db.ZeroTargetReasonMaster; +const logger = require("../services/logger"); // Create exports.create = async (req, res) => { @@ -19,7 +20,8 @@ exports.create = async (req, res) => { const data = await ZeroTargetReasonMaster.create({ reason, is_active, created_by: req.user.id }); res.status(201).send({ status: "success", message: "Record created successfully",}); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -29,7 +31,8 @@ exports.getAll = async (req, res) => { const data = await ZeroTargetReasonMaster.findAll(); res.status(200).send({ status: "success", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -41,7 +44,8 @@ exports.getById = async (req, res) => { if (!data) return res.status(404).send({ status: "failed", message: "Not found" }); res.status(200).send({ status: "success", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error" }); } }; @@ -56,7 +60,8 @@ exports.update = async (req, res) => { const data = await ZeroTargetReasonMaster.findByPk(id); res.status(200).send({ status: "success", data }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error"}); } }; @@ -68,6 +73,7 @@ exports.delete = async (req, res) => { if (!deleted) return res.status(404).send({ status: "failed", message: "Not found" }); res.status(200).send({ status: "success", message: "Deleted successfully" }); } catch (err) { - res.status(500).send({ status: "failed", message: err.message }); + logger.error(err.message); + res.status(500).send({ status: "failed", message: "Internal server error" }); } };