[update] - icici api
This commit is contained in:
@@ -26,5 +26,8 @@
|
||||
"winston": "^3.14.2",
|
||||
"xss-clean": "^0.1.4",
|
||||
"yup": "^1.4.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^3.1.5"
|
||||
}
|
||||
}
|
||||
|
||||
18
src/api/icici.api.js
Normal file
18
src/api/icici.api.js
Normal file
@@ -0,0 +1,18 @@
|
||||
module.exports = {
|
||||
Registration: async (encryptedData) => {
|
||||
const { data, } = await axios.post(
|
||||
'https://apibankingonesandbox.icicibank.com/api/Corporate/CIB_SV/v1/Create',
|
||||
encryptedData,
|
||||
{
|
||||
headers: {
|
||||
'accept': "*",
|
||||
'Content-Type': 'text/plain',
|
||||
'apikey': 'COIbAAYzt0SMosd3fFexJlk42uqnPvvu',
|
||||
'x-forwarded-for': '77.68.102.23',
|
||||
'Content-Length': Buffer.byteLength(encryptedData).toString()
|
||||
}
|
||||
}
|
||||
)
|
||||
return data
|
||||
}
|
||||
}
|
||||
3
src/api/index.js
Normal file
3
src/api/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
module.exports = {
|
||||
iciciApi: require('./icici.api')
|
||||
}
|
||||
@@ -9,39 +9,39 @@ dotenv.config({ path: path.join(__dirname, '../../.env') });
|
||||
const envVarsSchema = yup.object().shape({
|
||||
NODE_ENV: yup.string().oneOf(['production', 'development', 'test']).required(),
|
||||
PORT: yup.number().default(3000),
|
||||
BY_PASS_OTP: yup.boolean().default(true).required('by pass otp is required'),
|
||||
JWT_SECRET: yup.string().required('JWT secret key is required'),
|
||||
JWT_ACCESS_EXPIRATION_MINUTES: yup.number().default(30).required('minutes after which access tokens expire'),
|
||||
JWT_REFRESH_EXPIRATION_DAYS: yup.number().default(30).required('days after which refresh tokens expire'),
|
||||
JWT_RESET_PASSWORD_EXPIRATION_MINUTES: yup.number()
|
||||
.default(10)
|
||||
.required('minutes after which reset password token expires'),
|
||||
JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: yup.number()
|
||||
.default(10)
|
||||
.required('minutes after which verify email token expires'),
|
||||
SMTP_HOST: yup.string().nullable().required('server that will send the emails'),
|
||||
SMTP_PORT: yup.number().nullable().required('port to connect to the email server'),
|
||||
SMTP_USERNAME: yup.string().nullable().required('username for email server'),
|
||||
SMTP_PASSWORD: yup.string().nullable().required('password for email server'),
|
||||
EMAIL_FROM: yup.string().nullable().required('the from field in the emails sent by the app'),
|
||||
TWILIO_ACCOUNT_SID: yup.string().nullable().required(),
|
||||
TWILIO_AUTH_TOKEN: yup.string().nullable().required(),
|
||||
TWILIO_SMS_FROM: yup.string().nullable().required(),
|
||||
OTP_EXPIRE_IN_MIN: yup.number().nullable(),
|
||||
CODE_SECRET: yup.string().required('Code secret key is required'),
|
||||
ONESIGNAL_APPID: yup.string().required('app id key is required'),
|
||||
ONESIGNAL_REST_APIKEY: yup.string().required('api key is required'),
|
||||
ONESIGNAL_AUTHKEY: yup.string().required('auth key is required'),
|
||||
// BY_PASS_OTP: yup.boolean().default(true).required('by pass otp is required'),
|
||||
// JWT_SECRET: yup.string().required('JWT secret key is required'),
|
||||
// JWT_ACCESS_EXPIRATION_MINUTES: yup.number().default(30).required('minutes after which access tokens expire'),
|
||||
// JWT_REFRESH_EXPIRATION_DAYS: yup.number().default(30).required('days after which refresh tokens expire'),
|
||||
// JWT_RESET_PASSWORD_EXPIRATION_MINUTES: yup.number()
|
||||
// .default(10)
|
||||
// .required('minutes after which reset password token expires'),
|
||||
// JWT_VERIFY_EMAIL_EXPIRATION_MINUTES: yup.number()
|
||||
// .default(10)
|
||||
// .required('minutes after which verify email token expires'),
|
||||
// SMTP_HOST: yup.string().nullable().required('server that will send the emails'),
|
||||
// SMTP_PORT: yup.number().nullable().required('port to connect to the email server'),
|
||||
// SMTP_USERNAME: yup.string().nullable().required('username for email server'),
|
||||
// SMTP_PASSWORD: yup.string().nullable().required('password for email server'),
|
||||
// EMAIL_FROM: yup.string().nullable().required('the from field in the emails sent by the app'),
|
||||
// TWILIO_ACCOUNT_SID: yup.string().nullable().required(),
|
||||
// TWILIO_AUTH_TOKEN: yup.string().nullable().required(),
|
||||
// TWILIO_SMS_FROM: yup.string().nullable().required(),
|
||||
// OTP_EXPIRE_IN_MIN: yup.number().nullable(),
|
||||
// CODE_SECRET: yup.string().required('Code secret key is required'),
|
||||
// ONESIGNAL_APPID: yup.string().required('app id key is required'),
|
||||
// ONESIGNAL_REST_APIKEY: yup.string().required('api key is required'),
|
||||
// ONESIGNAL_AUTHKEY: yup.string().required('auth key is required'),
|
||||
}).noUnknown();
|
||||
|
||||
|
||||
try {
|
||||
const envVars = envVarsSchema.validateSync(process.env, { abortEarly: false, stripUnknown: true });
|
||||
|
||||
|
||||
module.exports = {
|
||||
env: envVars?.NODE_ENV,
|
||||
port: envVars?.PORT,
|
||||
byPassOTP: envVars?.BY_PASS_OTP,
|
||||
// byPassOTP: envVars?.BY_PASS_OTP,
|
||||
mysql: {
|
||||
development: {
|
||||
username: "root",
|
||||
@@ -108,42 +108,42 @@ try {
|
||||
}
|
||||
},
|
||||
},
|
||||
jwt: {
|
||||
secret: envVars?.JWT_SECRET,
|
||||
accessExpirationMinutes: envVars?.JWT_ACCESS_EXPIRATION_MINUTES,
|
||||
refreshExpirationDays: envVars?.JWT_REFRESH_EXPIRATION_DAYS,
|
||||
resetPasswordExpirationMinutes: envVars?.JWT_RESET_PASSWORD_EXPIRATION_MINUTES,
|
||||
verifyEmailExpirationMinutes: envVars?.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES,
|
||||
},
|
||||
email: {
|
||||
smtp: {
|
||||
host: envVars?.SMTP_HOST,
|
||||
port: envVars?.SMTP_PORT,
|
||||
secure: process.env.SMTP_PORT == 465, // true for 465, false for other ports
|
||||
auth: {
|
||||
user: envVars?.SMTP_USERNAME,
|
||||
pass: envVars?.SMTP_PASSWORD,
|
||||
},
|
||||
},
|
||||
from: envVars?.EMAIL_FROM,
|
||||
},
|
||||
SMS: {
|
||||
accountSid: envVars.TWILIO_ACCOUNT_SID,
|
||||
authToken: envVars.TWILIO_AUTH_TOKEN,
|
||||
from: envVars.TWILIO_SMS_FROM,
|
||||
},
|
||||
expiryTime: {
|
||||
otp_in_Min: envVars.OTP_EXPIRE_IN_MIN || 2,
|
||||
},
|
||||
code: {
|
||||
secret: crypto.createHash('sha256').update(envVars.CODE_SECRET).digest(),
|
||||
blacklist: new Set(),
|
||||
},
|
||||
oneSignal:{
|
||||
appID:envVars.ONESIGNAL_APPID,
|
||||
userAuthKey:envVars.ONESIGNAL_AUTHKEY,
|
||||
restApiKey:envVars.ONESIGNAL_REST_APIKEY,
|
||||
}
|
||||
// jwt: {
|
||||
// secret: envVars?.JWT_SECRET,
|
||||
// accessExpirationMinutes: envVars?.JWT_ACCESS_EXPIRATION_MINUTES,
|
||||
// refreshExpirationDays: envVars?.JWT_REFRESH_EXPIRATION_DAYS,
|
||||
// resetPasswordExpirationMinutes: envVars?.JWT_RESET_PASSWORD_EXPIRATION_MINUTES,
|
||||
// verifyEmailExpirationMinutes: envVars?.JWT_VERIFY_EMAIL_EXPIRATION_MINUTES,
|
||||
// },
|
||||
// email: {
|
||||
// smtp: {
|
||||
// host: envVars?.SMTP_HOST,
|
||||
// port: envVars?.SMTP_PORT,
|
||||
// secure: process.env.SMTP_PORT == 465, // true for 465, false for other ports
|
||||
// auth: {
|
||||
// user: envVars?.SMTP_USERNAME,
|
||||
// pass: envVars?.SMTP_PASSWORD,
|
||||
// },
|
||||
// },
|
||||
// from: envVars?.EMAIL_FROM,
|
||||
// },
|
||||
// SMS: {
|
||||
// accountSid: envVars.TWILIO_ACCOUNT_SID,
|
||||
// authToken: envVars.TWILIO_AUTH_TOKEN,
|
||||
// from: envVars.TWILIO_SMS_FROM,
|
||||
// },
|
||||
// expiryTime: {
|
||||
// otp_in_Min: envVars.OTP_EXPIRE_IN_MIN || 2,
|
||||
// },
|
||||
// code: {
|
||||
// secret: crypto.createHash('sha256').update(envVars.CODE_SECRET).digest(),
|
||||
// blacklist: new Set(),
|
||||
// },
|
||||
// oneSignal:{
|
||||
// appID:envVars.ONESIGNAL_APPID,
|
||||
// userAuthKey:envVars.ONESIGNAL_AUTHKEY,
|
||||
// restApiKey:envVars.ONESIGNAL_REST_APIKEY,
|
||||
// }
|
||||
};
|
||||
} catch (error) {
|
||||
throw new Error(`Config validation error: ${Array.isArray(error.errors) ? error?.errors?.join(', ') : error}`);
|
||||
|
||||
@@ -1,60 +1,41 @@
|
||||
const crypto = require('crypto');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const axios = require('axios');
|
||||
const { iciciApi } = require('../../api');
|
||||
const { AsyncHandler } = require('../../utils/handler/Async.handler');
|
||||
|
||||
const bankApi = async (req, res) => {
|
||||
try {
|
||||
const publicKeyPath = path.join(__dirname, 'public_key.pem');
|
||||
const publicKeyPem = fs.readFileSync(publicKeyPath, 'utf8');
|
||||
const bankApi = AsyncHandler(async (req, res) => {
|
||||
const publicKeyPath = path.join(__dirname, 'public_key.pem');
|
||||
const publicKeyPem = fs.readFileSync(publicKeyPath, 'utf8');
|
||||
|
||||
const jsonData = {
|
||||
"AGGRNAME": "CIBTESTING",
|
||||
"AGGRID": "TXBCIBTEST001",
|
||||
"CORPID": "TXBCORP1",
|
||||
"USERID": "USER1",
|
||||
"URN": "TESTING123",
|
||||
"ALIASID": ""
|
||||
};
|
||||
const jsonString = JSON.stringify(jsonData);
|
||||
const jsonData = {
|
||||
"AGGRNAME": "CIBTESTING",
|
||||
"AGGRID": "TXBCIBTEST001",
|
||||
"CORPID": "TXBCORP1",
|
||||
"USERID": "USER1",
|
||||
"URN": "TESTING123",
|
||||
"ALIASID": ""
|
||||
};
|
||||
const jsonString = JSON.stringify(jsonData);
|
||||
|
||||
// Encrypt JSON data with the public key
|
||||
const buffer = Buffer.from(jsonString, 'utf-8');
|
||||
const encrypted = crypto.publicEncrypt(
|
||||
{
|
||||
key: publicKeyPem,
|
||||
padding: crypto.constants.RSA_PKCS1_PADDING
|
||||
},
|
||||
buffer
|
||||
);
|
||||
// Encrypt JSON data with the public key
|
||||
const buffer = Buffer.from(jsonString, 'utf-8');
|
||||
const encrypted = crypto.publicEncrypt(
|
||||
{
|
||||
key: publicKeyPem,
|
||||
padding: crypto.constants.RSA_PKCS1_PADDING
|
||||
},
|
||||
buffer
|
||||
);
|
||||
|
||||
// Encode encrypted bytes to Base64
|
||||
const base64Encrypted = encrypted.toString('base64');
|
||||
// Encode encrypted bytes to Base64
|
||||
const base64Encrypted = encrypted.toString('base64');
|
||||
|
||||
console.log('Base64 Encrypted Data:', base64Encrypted);
|
||||
const data = await iciciApi.Registration(base64Encrypted)
|
||||
res.status(200).json(data);
|
||||
|
||||
// Make an Axios request
|
||||
const response = await axios.post(
|
||||
'https://apibankingonesandbox.icicibank.com/api/Corporate/CIB_SV/v1/Create',
|
||||
base64Encrypted,
|
||||
{
|
||||
headers: {
|
||||
'accept': "*",
|
||||
'Content-Type': 'text/plain',
|
||||
'apikey': 'COIbAAYzt0SMosd3fFexJlk42uqnPvvu',
|
||||
'x-forwarded-for': '77.68.102.23',
|
||||
'Content-Length': Buffer.byteLength(base64Encrypted).toString()
|
||||
}
|
||||
}
|
||||
);
|
||||
res.status(200).json(response.data);
|
||||
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
res.status(500).json({ error: 'Encryption or API request failed' });
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
module.exports = {
|
||||
bankApi
|
||||
bankApi
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
module.export = {
|
||||
module.exports = {
|
||||
bankDetailsController: require('./bankDetails/bankDetails.controller'),
|
||||
}
|
||||
5
src/routes/icici/index.js
Normal file
5
src/routes/icici/index.js
Normal file
@@ -0,0 +1,5 @@
|
||||
const iciciRoutes = require('express').Router()
|
||||
|
||||
iciciRoutes.use('/', require('./user.routes'))
|
||||
|
||||
module.exports = iciciRoutes
|
||||
7
src/routes/icici/user.routes.js
Normal file
7
src/routes/icici/user.routes.js
Normal file
@@ -0,0 +1,7 @@
|
||||
const { bankDetailsController } = require('../../controllers')
|
||||
|
||||
const userRoutes = require('express').Router()
|
||||
|
||||
userRoutes.post('/', bankDetailsController.bankApi)
|
||||
|
||||
module.exports = userRoutes
|
||||
@@ -1,69 +1,32 @@
|
||||
const express = require('express');
|
||||
const { bankApi } = require('../controllers/bankDetails/bankDetails.controller'); // Adjust the path to your controller
|
||||
const express = require('express');;
|
||||
const config = require('../config/config');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
// Define your route here
|
||||
router.post('/bankDetails/create', bankApi); // Define the route directly in this file
|
||||
const defaultRoutes = [
|
||||
{
|
||||
path: '/bankDetails',
|
||||
route: require('./icici'),
|
||||
},
|
||||
];
|
||||
|
||||
module.exports = router;
|
||||
const devRoutes = [
|
||||
// routes available only in development mode
|
||||
// {
|
||||
// path: '/docs',
|
||||
// route: require('./docs/docs.route'),
|
||||
// },
|
||||
];
|
||||
|
||||
defaultRoutes.forEach((route) => {
|
||||
router.use(route.path, route.route);
|
||||
});
|
||||
|
||||
// const express = require('express');
|
||||
// const router = express.Router();
|
||||
/* istanbul ignore next */
|
||||
if (config.env === 'development') {
|
||||
devRoutes.forEach((route) => {
|
||||
router.use(route.path, route.route);
|
||||
});
|
||||
}
|
||||
|
||||
// // Ensure the correct path to your route file
|
||||
// const defaultRoutes = [
|
||||
// {
|
||||
// path: '/bankDetails',
|
||||
// route: require('./bankDetails.route'), // Check this path
|
||||
// },
|
||||
// ];
|
||||
|
||||
// defaultRoutes.forEach((route) => {
|
||||
// router.use(route.path, route.route);
|
||||
// });
|
||||
|
||||
// module.exports = router;
|
||||
|
||||
// // const express = require('express');
|
||||
|
||||
// // const router = express.Router();
|
||||
|
||||
// // const defaultRoutes = [
|
||||
// // {
|
||||
// // path: '/bankDetails',
|
||||
// // route: require('./bankDetails.route'),
|
||||
// // },
|
||||
// // ];
|
||||
|
||||
// // defaultRoutes.forEach((route) => {
|
||||
// // router.use(route.path, route.route);
|
||||
// // });
|
||||
|
||||
// // module.exports = router;
|
||||
|
||||
|
||||
|
||||
|
||||
// // const express = require('express');;
|
||||
// // const config = require('../../config/config');
|
||||
|
||||
// // const router = express.Router();
|
||||
|
||||
// // const defaultRoutes = [
|
||||
// // {
|
||||
// // path: '/bankDetails',
|
||||
// // route: require('./bankDetails')
|
||||
// // },
|
||||
// // ];
|
||||
|
||||
|
||||
// // /* istanbul ignore next */
|
||||
// // // if (config.env === 'development') {
|
||||
// // // devRoutes.forEach((route) => {
|
||||
// // // router.use(route.path, route.route);
|
||||
// // // })
|
||||
// // // }
|
||||
|
||||
// // module.exports = router;
|
||||
module.exports = router;
|
||||
42
src/utils/helper/transactionNumberGenrator.helper.js
Normal file
42
src/utils/helper/transactionNumberGenrator.helper.js
Normal file
@@ -0,0 +1,42 @@
|
||||
const moment = require('moment');
|
||||
|
||||
class TransactionNumberGenerator {
|
||||
constructor() {
|
||||
this.timestampMap = new Map();
|
||||
this.lock = { isLocked: false };
|
||||
}
|
||||
|
||||
_acquireLock() {
|
||||
while (this.lock.isLocked) { }
|
||||
this.lock.isLocked = true;
|
||||
}
|
||||
|
||||
_releaseLock() {
|
||||
this.lock.isLocked = false;
|
||||
}
|
||||
|
||||
// Convert date and time to Unix timestamp
|
||||
_getUnixTimestamp(dateTime) {
|
||||
return moment(dateTime, 'YYYY-MM-DD HH:mm:ss').unix();
|
||||
}
|
||||
|
||||
generateUniqueTimestamp(dateTime) {
|
||||
this._acquireLock();
|
||||
|
||||
const timestamp = this._getUnixTimestamp(dateTime);
|
||||
if (!this.timestampMap.has(timestamp)) {
|
||||
this.timestampMap.set(timestamp, 0);
|
||||
}
|
||||
let counter = this.timestampMap.get(timestamp) + 1;
|
||||
this.timestampMap.set(timestamp, counter);
|
||||
|
||||
this._releaseLock();
|
||||
|
||||
// Create unique number with timestamp and counter
|
||||
const uniqueNumber = ((timestamp % 10000000000) * 1000 + counter).toString().padStart(11, '0');
|
||||
|
||||
return uniqueNumber;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = TransactionNumberGenerator
|
||||
Reference in New Issue
Block a user