From 52225828d053cb4c3be03e1072a724bade713629 Mon Sep 17 00:00:00 2001 From: "nabanita.jana" Date: Mon, 25 Aug 2025 11:45:23 +0530 Subject: [PATCH 01/10] OTP binding --- .gitignore | 1 + src/app.js | 1 + src/controllers/neft.controller.js | 2 + src/controllers/otp.controller.js | 98 ++++++++++++++++++++++++++++++ src/otpgenerator.js | 12 ++++ src/routes/index.js | 2 + src/routes/otp.route.js | 13 ++++ src/util/sms_template.js | 23 +++++++ 8 files changed, 152 insertions(+) create mode 100644 src/controllers/otp.controller.js create mode 100644 src/otpgenerator.js create mode 100644 src/routes/otp.route.js create mode 100644 src/util/sms_template.js diff --git a/.gitignore b/.gitignore index 713d500..16208e3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ +.vscode/ .env diff --git a/src/app.js b/src/app.js index 3c86b46..c2cd73c 100644 --- a/src/app.js +++ b/src/app.js @@ -17,3 +17,4 @@ app.use((err, _req, res, _next) => { }); module.exports = app; + diff --git a/src/controllers/neft.controller.js b/src/controllers/neft.controller.js index 091b7a3..8cc47dc 100644 --- a/src/controllers/neft.controller.js +++ b/src/controllers/neft.controller.js @@ -30,6 +30,8 @@ async function send( 'API call failed: ' + (error.response?.data?.message || error.message) ); } + + } module.exports = { send }; diff --git a/src/controllers/otp.controller.js b/src/controllers/otp.controller.js new file mode 100644 index 0000000..b3037b5 --- /dev/null +++ b/src/controllers/otp.controller.js @@ -0,0 +1,98 @@ + +const { setJson, getJson } = require('../config/redis'); +const { generateOTP } = require('../otpgenerator'); +const { logger } = require('../util/logger'); +const axios = require('axios'); +const templates = require('../util/sms_template'); + +// Send OTP +async function SendOtp(req, res) { + const { mobileNumber, type, amount, beneficiary, ifsc, acctFrom, acctTo, ref, date } = req.body; + + if (!mobileNumber || !type) { + return res.status(400).json({ error: 'Mobile number and type are required' }); + } + + try { + const otp = generateOTP(6); + let message; + + // Pick template based on type + switch (type) { + case 'IMPS': + message = templates.IMPS(otp); + break; + case 'NEFT': + message = templates.NEFT(otp, amount, beneficiary); + break; + case 'RTGS': + message = templates.RTGS(otp, amount, beneficiary); + break; + case 'BENEFICIARY_ADD': + message = templates.BENEFICIARY_ADD(otp, beneficiary, ifsc); + break; + case 'BENEFICIARY_SUCCESS': + message = templates.BENEFICIARY_SUCCESS(beneficiary); + break; + case 'NOTIFICATION': + message = templates.NOTIFICATION(acctFrom, acctTo, amount, ref, date); + break; + case 'FORGOT_PASSWORD': + message = templates.FORGOT_PASSWORD(otp); + break; + default: + return res.status(400).json({ error: 'Invalid OTP type' }); + } + + // Call SMS API + const response = await axios.post('http://localhost:9999/api/SendtoMessage', { + mobileNumber, + stMessage: message, + }); + + if (response.data) { + // Save OTP only if it's OTP based (skip notifications without OTP) + if (message.includes('OTP')) { + await setJson(`otp:${mobileNumber}`, otp, 300); + } + + logger.info(`Sent OTP [${otp}] for type [${type}] to ${mobileNumber}`); + } + + return res.status(200).json({ message: 'Message sent successfully' }); + + } catch (err) { + logger.error(err, 'Error sending OTP'); + return res.status(500).json({ error: 'Internal server error' }); + } +} + + +// Verify OTP +async function VerifyOtp(req, res) { + const { mobileNumber } = req.query; + const {otp} =req.body + + if (!mobileNumber || !otp) { + return res.status(400).json({ error: 'Phone number and OTP are required' }); + } + + try { + const storedOtp = await getJson(`otp:${mobileNumber}`); + + if (!storedOtp) { + return res.status(400).json({ error: 'OTP expired or not found' }); + } + + if (parseInt(otp, 10) !== parseInt(storedOtp, 10)) { + return res.status(400).json({ error: 'Invalid OTP' }); + } + + return res.status(200).json({ message: 'OTP verified successfully' }); + } catch (err) { + logger.error(err, 'Error verifying OTP'); + return res.status(500).json({ error: 'Internal server error' }); + } +} + +module.exports = { SendOtp, VerifyOtp }; diff --git a/src/otpgenerator.js b/src/otpgenerator.js new file mode 100644 index 0000000..b66a46b --- /dev/null +++ b/src/otpgenerator.js @@ -0,0 +1,12 @@ + +function generateOTP(length) { + const digits = '0123456789'; + let otp = ''; + otp += digits[Math.floor(Math.random() * 9) + 1]; // first digit cannot be zero + for (let i = 1; i < length; i++) { + otp += digits[Math.floor(Math.random() * digits.length)]; + } + return otp; +} + +module.exports = { generateOTP }; diff --git a/src/routes/index.js b/src/routes/index.js index 9599fbd..749ec5c 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -8,6 +8,7 @@ const beneficiaryRoute = require('./beneficiary.route'); const neftRoute = require('./neft.route'); const rtgsRoute = require('./rtgs.route'); const { npciResponse } = require('../controllers/npci.controller'); +const otp = require('./otp.route'); const router = express.Router(); @@ -19,5 +20,6 @@ router.use('/payment/neft', authenticate, neftRoute); router.use('/payment/rtgs', authenticate, rtgsRoute); router.use('/beneficiary', authenticate, beneficiaryRoute); router.use('/npci/beneficiary-response', npciResponse); +router.use('/otp', otp); module.exports = router; diff --git a/src/routes/otp.route.js b/src/routes/otp.route.js new file mode 100644 index 0000000..fdf2a7d --- /dev/null +++ b/src/routes/otp.route.js @@ -0,0 +1,13 @@ + +const express = require('express'); +const otpController = require('../controllers/otp.controller'); + +const router = express.Router(); + +// Send OTP (POST request with body) +router.post('/send', otpController.SendOtp); + +// Verify OTP (GET request with query params ?mobileNumber=xxx&otp=123456) +router.post('/verify', otpController.VerifyOtp); + +module.exports = router; diff --git a/src/util/sms_template.js b/src/util/sms_template.js new file mode 100644 index 0000000..9afb6e3 --- /dev/null +++ b/src/util/sms_template.js @@ -0,0 +1,23 @@ +const templates = { + IMPS: (otp) => `Dear Customer, Please complete the fund transfer with OTP ${otp} -KCCB`, + + NEFT: (otp, amount, beneficiary) => + `Dear Customer, Please complete the NEFT of Rs.${amount} to ${beneficiary} with OTP:${otp} -KCCB`, + + RTGS: (otp, amount, beneficiary) => + `Dear Customer, Please complete the RTGS of Rs.${amount} to ${beneficiary} with OTP:${otp} -KCCB`, + + BENEFICIARY_ADD: (otp, beneficiary, ifsc) => + `Dear Customer, You have added beneficiary ${beneficiary} ${ifsc} for NEFT/RTGS. Please endorse the beneficiary with OTP ${otp} -KCCB`, + + BENEFICIARY_SUCCESS: (beneficiary) => + `Dear Customer, Your Beneficiary: ${beneficiary} for Net Banking is added successfully -KCCB`, + + NOTIFICATION: (acctFrom, acctTo, amount, ref, date) => + `Your A/c ${acctFrom} is debited for Rs. ${amount} to the credit of A/c ${acctTo} thru Net Banking - ref: ${ref} - ${date} - Kangra Central Co-Operative Bank -KCCB`, + + FORGOT_PASSWORD: (otp) => + `Dear Customer, Forgot Password OTP is ${otp} -KCCB`, +}; + +module.exports = templates; \ No newline at end of file From 470d8e15f6f5ca7f87e441bf835fc99b82ba59e5 Mon Sep 17 00:00:00 2001 From: asif Date: Wed, 20 Aug 2025 12:14:40 +0530 Subject: [PATCH 02/10] fixed typo in rtgs.route.js --- src/routes/rtgs.route.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/rtgs.route.js b/src/routes/rtgs.route.js index 389bb93..c0832c5 100644 --- a/src/routes/rtgs.route.js +++ b/src/routes/rtgs.route.js @@ -32,7 +32,7 @@ const rtgsRoute = async (req, res) => { return res.json({ message: 'SUCCESS', utr }); } else if (result.status.includes('INSUFFICIENT FUNDS')) { return res.status(422).json({ error: 'INSUFFICIENT_FUNDS' }); - } else if (result.status.include('INVALID CHECK DIGIT')) { + } else if (result.status.includes('INVALID CHECK DIGIT')) { return res.status(400).json({ error: 'INVALID_ACCOUNT_NUMBER' }); } else { return res.status(400).json({ error: 'PROBLEM_TRANSFERRING_FUNDS' }); From 6e6690746aea9c7383b2cd5dec6fe116a6366320 Mon Sep 17 00:00:00 2001 From: asif Date: Fri, 22 Aug 2025 15:31:13 +0530 Subject: [PATCH 03/10] added imps transactions payment feature --- src/controllers/imps.controller.js | 43 ++++++++++++++++++++++++++++++ src/routes/imps.route.js | 36 +++++++++++++++++++++++++ src/routes/index.js | 2 ++ src/validators/imps.validator.js | 36 +++++++++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 src/controllers/imps.controller.js create mode 100644 src/routes/imps.route.js create mode 100644 src/validators/imps.validator.js diff --git a/src/controllers/imps.controller.js b/src/controllers/imps.controller.js new file mode 100644 index 0000000..0eb933d --- /dev/null +++ b/src/controllers/imps.controller.js @@ -0,0 +1,43 @@ +const axios = require('axios'); +const { logger } = require('../util/logger'); + +async function send( + fromAccount, + toAccount, + amount, + ifscCode, + beneficiaryName, + beneficiaryAcctType = 'SAVING', + remarks = '' +) { + try { + const reqData = { + stBenAccNo: toAccount, + stBeneName: beneficiaryName, + stBenAccType: beneficiaryAcctType, + stBenIFSC: ifscCode, + stFromAccDetails: fromAccount, + stTransferAmount: amount, + stRemarks: remarks, + }; + logger.info(reqData, 'request data to be sent to IMPS server'); + const response = await axios.post( + 'http://localhost:6768/kccb/api/IMPS/Producer', + reqData, + { + headers: { + 'Content-Type': 'application/json', + }, + } + ); + logger.info(response, 'response from IMPS'); + return response.data; + } catch (error) { + logger.error(error, 'error from IMPS'); + throw new Error( + 'API call failed: ' + (error.response?.data?.message || error.message) + ); + } +} + +module.exports = { send }; diff --git a/src/routes/imps.route.js b/src/routes/imps.route.js new file mode 100644 index 0000000..7f6a31d --- /dev/null +++ b/src/routes/imps.route.js @@ -0,0 +1,36 @@ +const express = require('express'); +const impsController = require('../controllers/imps.controller'); +const { logger } = require('../util/logger'); +const impsValidator = require('../validators/imps.validator'); +const paymentSecretValidator = require('../validators/payment.secret.validator'); + +const router = express.Router(); +router.use(impsValidator, paymentSecretValidator); + +const impsRoute = async (req, res) => { + const { fromAccount, toAccount, ifscCode, amount, beneficiaryName } = + req.body; + + try { + const result = await impsController.send( + fromAccount, + toAccount, + amount, + ifscCode, + beneficiaryName, + 'SAVING', + 'check' + ); + + if (result.startsWith('Message produced successfully')) { + return res.json({ message: 'SUCCESS' }); + } else { + return res.json({ error: 'INVALID_REQUEST' }); + } + } catch (error) { + logger.error(error, 'error occured while doing IMPS'); + return res.json({ error: 'INTERVAL_SERVER_ERROR' }); + } +}; + +module.exports = impsRoute; diff --git a/src/routes/index.js b/src/routes/index.js index 749ec5c..8e86aac 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -7,6 +7,7 @@ const transferRoute = require('./transfer.route'); const beneficiaryRoute = require('./beneficiary.route'); const neftRoute = require('./neft.route'); const rtgsRoute = require('./rtgs.route'); +const impsRoute = require('./imps.route'); const { npciResponse } = require('../controllers/npci.controller'); const otp = require('./otp.route'); @@ -18,6 +19,7 @@ router.use('/transactions/account/:accountNo', authenticate, transactionRoute); router.use('/payment/transfer', authenticate, transferRoute); router.use('/payment/neft', authenticate, neftRoute); router.use('/payment/rtgs', authenticate, rtgsRoute); +router.use('/payment/imps', authenticate, impsRoute); router.use('/beneficiary', authenticate, beneficiaryRoute); router.use('/npci/beneficiary-response', npciResponse); router.use('/otp', otp); diff --git a/src/validators/imps.validator.js b/src/validators/imps.validator.js new file mode 100644 index 0000000..76d787d --- /dev/null +++ b/src/validators/imps.validator.js @@ -0,0 +1,36 @@ +const impsValidator = (req, res, next) => { + const { + fromAccount, + toAccount, + amount, + remitterName, + beneficiaryName, + ifscCode, + } = req.body; + + if (!isAccountNumbersValid(fromAccount, toAccount)) { + return res.status(400).json({ error: 'INVALID_ACCOUNT_NUMBER_FORMAT' }); + } + + if (amount < 1) { + return res.status(400).json({ error: 'INVALID_AMOUNT' }); + } + + if (!remitterName || !beneficiaryName) { + return res + .status(400) + .json({ error: 'REMITTER_NAME AND BENEFICIARY_NAME REQUIRED' }); + } + + if (!ifscCode || !/^[A-Z]{4}0[0-9]{6}$/.test(ifscCode)) { + return res.status(400).json({ error: 'INVALID_IFSC_CODE' }); + } + + next(); +}; + +const isAccountNumbersValid = (fromAcct, toAcct) => { + return !(!fromAcct || !toAcct || fromAcct.length != 11 || toAcct.length < 7); +}; + +module.exports = impsValidator; From bb446f41d82f5e3ce1c81e0d560c4d61a64a5acc Mon Sep 17 00:00:00 2001 From: asif Date: Tue, 26 Aug 2025 19:21:16 +0530 Subject: [PATCH 04/10] formatted auth route --- src/routes/auth.route.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/routes/auth.route.js b/src/routes/auth.route.js index ac8c9fb..2ab5178 100644 --- a/src/routes/auth.route.js +++ b/src/routes/auth.route.js @@ -9,6 +9,10 @@ router.get('/user_details', authenticate, authController.fetchUserDetails); router.get('/tpin', authenticate, authController.tpin); router.post('/tpin', authenticate, authController.setTpin); router.post('/login_password', authenticate, authController.setLoginPassword); -router.post('/transaction_password', authenticate, authController.setTransactionPassword); +router.post( + '/transaction_password', + authenticate, + authController.setTransactionPassword +); module.exports = router; From b1f2277c923410a0a5c15e270afea7eed5843e5f Mon Sep 17 00:00:00 2001 From: asif Date: Tue, 26 Aug 2025 11:47:49 +0530 Subject: [PATCH 05/10] fixed a bug where data and pin validations were not called --- src/routes/imps.route.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/routes/imps.route.js b/src/routes/imps.route.js index 7f6a31d..d0ff998 100644 --- a/src/routes/imps.route.js +++ b/src/routes/imps.route.js @@ -32,5 +32,6 @@ const impsRoute = async (req, res) => { return res.json({ error: 'INTERVAL_SERVER_ERROR' }); } }; +router.post('/', impsRoute); -module.exports = impsRoute; +module.exports = router; From 65519e64037d571a94ad4267b7ddd2f6ad800927 Mon Sep 17 00:00:00 2001 From: asif Date: Wed, 27 Aug 2025 12:29:27 +0530 Subject: [PATCH 06/10] added beneficiary deletion feature --- src/controllers/beneficiary.controller.js | 19 +++++++++++++++++++ src/routes/beneficiary.route.js | 4 ++++ src/services/beneficiary.service.js | 11 +++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/controllers/beneficiary.controller.js b/src/controllers/beneficiary.controller.js index ccac3bf..b59d2db 100644 --- a/src/controllers/beneficiary.controller.js +++ b/src/controllers/beneficiary.controller.js @@ -95,6 +95,24 @@ async function getBeneficiary(req, res) { } } +async function deleteBeneficiary(req, res) { + const { beneficiaryAccountNo } = req.params; + try { + await beneficiaryService.deleteBeneficiary(req.user, beneficiaryAccountNo); + res.status(204).send(); + } catch (error) { + if (error.message === 'ACCOUNT_NOT_FOUND') { + logger.warn( + `beneficiary ${beneficiaryAccountNo} does not exist for the customer ${req.user}` + ); + return res.status(400).json({ error: 'INVALID_BENEFICIARY_ACCOUNT_NO' }); + } else { + logger.error(error, 'error deleting beneficiary'); + return res.status(500).json({ error: 'INTERNAL_SERVER_ERROR' }); + } + } +} + async function getIfscDetails(req, res) { const { ifscCode } = req.query; if (!ifscCode) { @@ -127,4 +145,5 @@ module.exports = { addBeneficiary, getIfscDetails, getBeneficiary, + deleteBeneficiary, }; diff --git a/src/routes/beneficiary.route.js b/src/routes/beneficiary.route.js index d1483d8..47e7eba 100644 --- a/src/routes/beneficiary.route.js +++ b/src/routes/beneficiary.route.js @@ -9,5 +9,9 @@ router.get('/validate/outside-bank', beneficiaryController.validateOutsideBank); router.get('/ifsc-details', beneficiaryController.getIfscDetails); router.get('/', beneficiaryController.getBeneficiary); router.post('/', newBeneficiaryValidator, beneficiaryController.addBeneficiary); +router.delete( + '/:beneficiaryAccountNo', + beneficiaryController.deleteBeneficiary +); module.exports = router; diff --git a/src/services/beneficiary.service.js b/src/services/beneficiary.service.js index 136f3d1..1eeb7d1 100644 --- a/src/services/beneficiary.service.js +++ b/src/services/beneficiary.service.js @@ -44,6 +44,16 @@ async function getSingleBeneficiary(customerNo, accountNo) { return result.rows[0]; } +async function deleteBeneficiary(customerNo, beneficiaryAccountNo) { + const queryStr = + 'DELETE FROM beneficiaries WHERE customer_no = $1 AND account_no = $2'; + const result = await db.query(queryStr, [customerNo, beneficiaryAccountNo]); + if (result.rowCount == 0) { + throw new Error('ACCOUNT_NOT_FOUND'); + } + return; +} + async function getAllBeneficiaries(customerNo) { const queryStr = 'SELECT b.account_no, b.name, b.account_type, b.ifsc_code, i.bank_name, i.branch_name FROM beneficiaries b JOIN ifsc_details i ON b.ifsc_code = i.ifsc_code WHERE customer_no = $1'; @@ -66,4 +76,5 @@ module.exports = { validateOutsideBank, getAllBeneficiaries, getSingleBeneficiary, + deleteBeneficiary, }; From 33aa50413caab6868b8e93163d3858d7947aebdb Mon Sep 17 00:00:00 2001 From: asif Date: Fri, 29 Aug 2025 13:40:57 +0530 Subject: [PATCH 07/10] fix: check if password is not null on login req --- src/controllers/auth.controller.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/controllers/auth.controller.js b/src/controllers/auth.controller.js index 9a90add..94e23f8 100644 --- a/src/controllers/auth.controller.js +++ b/src/controllers/auth.controller.js @@ -14,7 +14,8 @@ async function login(req, res) { const currentTime = new Date().toISOString(); try { const user = await authService.validateUser(customerNo, password); - if (!user) return res.status(401).json({ error: 'invalid credentials' }); + if (!user || !password) + return res.status(401).json({ error: 'invalid credentials' }); const token = generateToken(user.customer_no, '1d'); const FirstTimeLogin = await authService.CheckFirstTimeLogin(customerNo); await db.query('UPDATE users SET last_login = $1 WHERE customer_no = $2', [ @@ -34,7 +35,6 @@ async function fetchUserDetails(req, res) { const user = await authService.findUserByCustomerNo(customerNo); if (!user) return res.status(404).json({ message: 'USER_NOT_FOUND' }); return res.json(user); - } catch (err) { logger.error(err, 'error occured while fetching user details'); res.status(500).json({ error: 'something went wrong' }); @@ -102,4 +102,11 @@ async function setTransactionPassword(req, res) { } } -module.exports = { login, tpin, setTpin, setLoginPassword, setTransactionPassword,fetchUserDetails }; +module.exports = { + login, + tpin, + setTpin, + setLoginPassword, + setTransactionPassword, + fetchUserDetails, +}; From 6533c5081c437cfd7aab22011b2787d0399cf939 Mon Sep 17 00:00:00 2001 From: asif Date: Fri, 29 Aug 2025 15:40:11 +0530 Subject: [PATCH 08/10] added logger for logging all kinds of requests with headers, body, ip and other data --- src/app.js | 22 +++++++++++++++++++++- src/util/logger.js | 25 +++++++++++++++++++++---- 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/app.js b/src/app.js index c2cd73c..e666308 100644 --- a/src/app.js +++ b/src/app.js @@ -1,6 +1,6 @@ const express = require('express'); const cors = require('cors'); -const { logger } = require('./util/logger'); +const { logger, requestLogger } = require('./util/logger'); const routes = require('./routes'); const app = express(); @@ -9,6 +9,26 @@ app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); +app.use((req, res, next) => { + const start = Date.now(); + + res.on('finish', () => { + requestLogger.info( + { + ip: req.ip || req.connection.remoteAddress, + method: req.method, + url: req.originalUrl, + headers: req.headers, + body: req.body, + status: res.statusCode, + responseTime: `${Date.now() - start}ms`, + }, + 'Incoming request' + ); + }); + next(); +}); + app.use('/api', routes); app.get('/health', (_, res) => res.send('server is healthy')); app.use((err, _req, res, _next) => { diff --git a/src/util/logger.js b/src/util/logger.js index eb033b0..4b6d33a 100644 --- a/src/util/logger.js +++ b/src/util/logger.js @@ -1,6 +1,19 @@ const pino = require('pino'); +const fs = require('fs'); +const path = require('path'); + const isDev = process.env.NODE_ENV !== 'production'; +const logDir = path.join(__dirname, 'logs'); +if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir); +} + +const requestLoggerStream = pino.destination({ + dest: path.join(logDir, 'requests.log'), + sync: false, +}); + const logger = pino({ transport: isDev ? { @@ -15,8 +28,12 @@ const logger = pino({ level: isDev ? 'debug' : 'info', }); -const requestLogger = (req, _res, next) => { - logger.info(`${req.method} ${req.url}`); - next(); -}; +const requestLogger = pino( + { + level: 'info', + base: null, + }, + requestLoggerStream +); + module.exports = { logger, requestLogger }; From 90f60f73245f3112a6d6072370d3ce8cbe950684 Mon Sep 17 00:00:00 2001 From: asif Date: Fri, 29 Aug 2025 15:40:36 +0530 Subject: [PATCH 09/10] added log files in .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 16208e3..535f0cf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ .vscode/ .env +src/util/logs/requests.log From b213259c7cf5ad34081df5ba14b23a6d13afc79b Mon Sep 17 00:00:00 2001 From: asif Date: Fri, 29 Aug 2025 15:49:35 +0530 Subject: [PATCH 10/10] changed the directory of log directory --- .gitignore | 2 +- src/util/logger.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 535f0cf..a4713c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ node_modules/ .vscode/ .env -src/util/logs/requests.log +logs/requests.log diff --git a/src/util/logger.js b/src/util/logger.js index 4b6d33a..18c891f 100644 --- a/src/util/logger.js +++ b/src/util/logger.js @@ -4,7 +4,7 @@ const path = require('path'); const isDev = process.env.NODE_ENV !== 'production'; -const logDir = path.join(__dirname, 'logs'); +const logDir = path.join(__dirname, '../..', 'logs'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir); }