From 1ebe666bb3f6ea3b221aa36f9a2755ee4eda492c Mon Sep 17 00:00:00 2001 From: "tomosa.sarkar" Date: Mon, 10 Nov 2025 12:06:46 +0530 Subject: [PATCH] feat: Api for report of active and inactive users. --- src/controllers/otp.controller.js | 8 ++-- src/controllers/report.controller.js | 65 ++++++++++++++++++++++++++++ src/routes/index.js | 3 ++ src/routes/report.route.js | 9 ++++ src/services/report.service.js | 18 ++++++++ 5 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 src/controllers/report.controller.js create mode 100644 src/routes/report.route.js create mode 100644 src/services/report.service.js diff --git a/src/controllers/otp.controller.js b/src/controllers/otp.controller.js index 1c27e3b..3335ed8 100644 --- a/src/controllers/otp.controller.js +++ b/src/controllers/otp.controller.js @@ -117,7 +117,9 @@ async function SendOtp(req, res) { default: return res.status(400).json({ error: 'Invalid OTP type' }); } - + if (message.includes('OTP')) { + await setJson(`otp:${mobileNumber}`, otp, 300); + } // Call SMS API const response = await axios.post( 'http://localhost:9999/api/SendtoMessage', @@ -126,12 +128,8 @@ async function SendOtp(req, res) { 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' }); diff --git a/src/controllers/report.controller.js b/src/controllers/report.controller.js new file mode 100644 index 0000000..39f583d --- /dev/null +++ b/src/controllers/report.controller.js @@ -0,0 +1,65 @@ + +const reportService = require('../services/report.service'); +const { logger } = require('../util/logger'); + +async function active_users(req, res) { + const { from_date, to_date } = req.body; + if (!from_date || !to_date) { + return res.status(400).json({ error: 'from_date and to_date are required' }); + } + try { + const users = await reportService.total_users(from_date, to_date); + const activeUsers = users.filter(u => u.is_first_login === false); + const inactiveUsers = users.filter(u => u.is_first_login === true); + const active_user_list = activeUsers.map(u => ({ + customer_no: u.customer_no, + user_name: u.preferred_name, + created_at: u.created_at, + last_login: u.last_login, + status: "active" + })); + logger.info(`fetch total number of users and active users from date ${from_date} to ${to_date}`); + res.json({ + total_users: users.length, + active_users: activeUsers.length, + inactive_users: inactiveUsers.length, + active_user_list: active_user_list + }); + } catch (err) { + logger.error(err, 'failed to fetch data'); + res.status(500).json({ error: 'something went wrong' }); + } +} + +async function inactive_users(req, res) { + const { from_date, to_date } = req.body; + if (!from_date || !to_date) { + return res.status(400).json({ error: 'from_date and to_date are required' }); + } + try { + const users = await reportService.total_users(from_date, to_date); + const activeUsers = users.filter(u => u.is_first_login === false); + const inactiveUsers = users.filter(u => u.is_first_login === true); + const inactive_user_list = inactiveUsers.map(u => ({ + customer_no: u.customer_no, + user_name: u.preferred_name, + created_at: u.created_at, + last_login: u.last_login, + status: "in-active" + })); + logger.info(`fetch total number of users and inactive users from date ${from_date} to ${to_date}`); + res.json({ + total_users: users.length, + active_users: activeUsers.length, + inactive_users: inactiveUsers.length, + inactive_user_list: inactive_user_list + }); + } catch (err) { + logger.error(err, 'failed to fetch data'); + res.status(500).json({ error: 'something went wrong' }); + } +} + + + +module.exports = { active_users ,inactive_users }; \ No newline at end of file diff --git a/src/routes/index.js b/src/routes/index.js index 8dd7a6f..45ed4ae 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -4,6 +4,7 @@ const adminAuthRoute = require('./admin_auth.route'); const detailsRoute = require('./customer_details.route'); const transactionRoute = require('./transactions.route'); const authenticate = require('../middlewares/auth.middleware'); +const adminAuthenticate = require('../middlewares/admin.middleware'); const transferRoute = require('./transfer.route'); const beneficiaryRoute = require('./beneficiary.route'); const neftRoute = require('./neft.route'); @@ -11,6 +12,7 @@ const rtgsRoute = require('./rtgs.route'); const impsRoute = require('./imps.route'); const { npciResponse } = require('../controllers/npci.controller'); const otp = require('./otp.route'); +const reports =require('./report.route'); const router = express.Router(); @@ -24,6 +26,7 @@ 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('/report',adminAuthenticate,reports); router.use('/otp', otp); module.exports = router; diff --git a/src/routes/report.route.js b/src/routes/report.route.js new file mode 100644 index 0000000..507ffa9 --- /dev/null +++ b/src/routes/report.route.js @@ -0,0 +1,9 @@ +const reportController = require('../controllers/report.controller'); +const express = require('express'); + +const router = express.Router(); + +router.post('/active_users', reportController.active_users); +router.post('/in-active_users', reportController.inactive_users); + +module.exports = router; diff --git a/src/services/report.service.js b/src/services/report.service.js new file mode 100644 index 0000000..809aaae --- /dev/null +++ b/src/services/report.service.js @@ -0,0 +1,18 @@ +const db = require('../config/db'); +const { logger } = require('../util/logger'); + +async function total_users(from_date, to_date) { + try { + const result = await db.query( + `SELECT * FROM users WHERE created_at BETWEEN $1 AND $2`, + [from_date, to_date] + ); + logger.info("data fetch for users"); + return result.rows; + } catch (err) { + logger.error(err, 'failed to fetch data'); + res.status(500).json({ error: 'something went wrong' }); + } +} + +module.exports = { total_users }; \ No newline at end of file