[update] - icici api

This commit is contained in:
Swapnil Bendal
2024-09-18 16:07:02 +05:30
parent 582f88abbb
commit 4c811297df
11 changed files with 1522 additions and 172 deletions

View File

@@ -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
View 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
View File

@@ -0,0 +1,3 @@
module.exports = {
iciciApi: require('./icici.api')
}

View File

@@ -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}`);

View File

@@ -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
}

View File

@@ -1,3 +1,3 @@
module.export = {
module.exports = {
bankDetailsController: require('./bankDetails/bankDetails.controller'),
}

View File

@@ -0,0 +1,5 @@
const iciciRoutes = require('express').Router()
iciciRoutes.use('/', require('./user.routes'))
module.exports = iciciRoutes

View File

@@ -0,0 +1,7 @@
const { bankDetailsController } = require('../../controllers')
const userRoutes = require('express').Router()
userRoutes.post('/', bankDetailsController.bankApi)
module.exports = userRoutes

View File

@@ -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;

View 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

1328
yarn.lock Normal file

File diff suppressed because it is too large Load Diff