JavaScript
Without Router - Current Approach
// Assuming this as previous logic without Router
const axios = require('axios');
const entityMetadataFromCR = {
baseUrl: 'http://fip-1.dev.sahamati.org.in/fip-simulate',
id: "FIP-SIMULATOR"
}
const getHttpConfig = ({ baseUrl, route, headers, data, methodType }) => {
return { url: `${baseUrl}${route}`, headers: headers, data, methodType };
};
const executeDiscoveryRequest = () => {
const route = '/v2/Accounts/discover';
const config = getHttpConfig({ baseUrl: entityMetadataFromCR.baseUrl, route, headers: {}, data: {}, methodType: 'POST' });
axios.request(config)
.then(response => response.data)
.catch(error => {
console.error('Error making discovery request:', error.message);
throw error;
});
};
const performAnotherOperations = async (accountDiscoverResponse) => {
console.log('Perform another operations with the response', accountDiscoverResponse);
}
executeDiscoveryRequest()
.then(performAnotherOperations)
.then(() => console.log('Account discovery successful.'))
.catch(() => console.log('Account discovery failed.'))
.finally(() => console.log('Account discovery completed.'));
With Router Integration - Request
const axios = require('axios');
// Entity metadata (from CR)
const entityMetadataFromCR = {
baseUrl: 'http://fip-1.sandbox.sahamati.org.in/fip-simulate',
id: 'FIP-SIMULATOR'
};
// Router Integration Helper URL
const ROUTER_INTEGRATION_HELPER_URL = 'https://api.sandbox.sahamati.org.in/router-helper/v1/request/header';
/**
* Builds a base axios config
*/
const getHttpConfig = ({ baseUrl, route, headers = {}, data = {}, methodType = 'POST' }) => {
return {
url: `${baseUrl}${route}`,
method: methodType,
headers: {
'Content-Type': 'application/json',
...headers
},
data
};
};
/**
* Calls Router Integration Helper Service to get host + x-request-meta
*/
const routerIntegrationHelper = async (route, rebitRequestBody) => {
const payload = {
rebitAPIEndpoint: route,
recipientId: entityMetadataFromCR.id,
customerId: '9875438980@AA_SIMULATOR',
requestBody: rebitRequestBody
};
const response = await axios.post(ROUTER_INTEGRATION_HELPER_URL, payload, {
headers: { 'Content-Type': 'application/json' }
});
return response.data; // { host, x-request-meta }
};
/**
* Adds Sahamati Router headers + updates URL
*/
const addSahamatiConfiguration = async ({ config, route, rebitRequestBody }) => {
const headerResponse = await routerIntegrationHelper(route, rebitRequestBody);
const host = headerResponse.host;
const xRequestMeta = headerResponse['x-request-meta'];
config.url = `${host}${route}`;
config.headers['x-request-meta'] = xRequestMeta;
return config;
};
/**
* Executes account discovery
*/
const executeDiscoveryRequest = async () => {
const route = '/Accounts/discover';
const rebitRequestBody = {}; // ReBIT defined request body
let config = getHttpConfig({
baseUrl: entityMetadataFromCR.baseUrl,
route,
headers: {},
data: rebitRequestBody,
methodType: 'POST'
});
// Add Sahamati configuration
config = await addSahamatiConfiguration({ config, route, rebitRequestBody });
const response = await axios.request(config);
return response.data;
};
/**
* Example: further operations after discovery
*/
const performAnotherOperations = async (accountDiscoverResponse) => {
console.log('Next steps with response:', accountDiscoverResponse);
};
// Run discovery flow
(async () => {
try {
const response = await executeDiscoveryRequest();
console.log('Account discovery successful:', response);
await performAnotherOperations(response);
} catch (error) {
console.error('Account discovery failed. Error:', error.message);
} finally {
console.log('Account discovery completed.');
}
})();
With Router Integration - Response
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
const ROUTER_RESPONSE_HEADER_URL = 'https://api.sandbox.sahamati.org.in/router-helper/v1/response/header';
const RECIPIENT_ID = 'AA-SIMULATOR';
function fetchAccountFromRequestBody(requestBody) {
if (!requestBody) return null;
const customer = requestBody.Customer;
if (!customer || typeof customer !== 'object') return null;
const identifiers = customer.Identifiers;
if (!Array.isArray(identifiers)) return null;
for (const idObj of identifiers) {
if (typeof idObj !== 'object') continue;
const { category, type, value } = idObj;
if (category === 'STRONG' && type === 'AADHAAR' && value) {
return {
FIType: 'DEPOSIT',
accType: 'SAVINGS',
accRefNumber: 'BANK11111111',
maskedAccNumber: 'XXXXXXX3468',
};
}
}
return null;
}
async function routerIntegrationHelper(requestBody) {
const resp = await axios.post(ROUTER_RESPONSE_HEADER_URL, requestBody, {
headers: { 'Content-Type': 'application/json' },
timeout: 30000,
});
return resp.data;
}
app.post('/accounts/discover', async (req, res) => {
const incomingRequestBody = req.body;
const discoveredAccount = fetchAccountFromRequestBody(incomingRequestBody);
if (!discoveredAccount) {
return res.status(404).json({ error: 'Account not found' });
}
const responseBody = {
ver: '2.0.0',
timestamp: new Date().toISOString(), // Use current timestamp
txnid: 'f35761ac-4a18-11e8-96ff-0277a9fbfedcs',
DiscoveredAccounts: [discoveredAccount],
};
const responseHeaderRequestBody = {
rebitAPIEndpoint: '/accounts/discover',
customerId: '9977336577@aa_simulator', // Optionally extract from incomingRequestBody
recipientId: RECIPIENT_ID,
additionalAttributes: {},
responseBody,
};
try {
const responseHeaderResp = await routerIntegrationHelper(responseHeaderRequestBody);
const xResponseMeta = responseHeaderResp['x-response-meta'];
if (xResponseMeta) {
res.set('x-response-meta', xResponseMeta);
}
} catch (err) {
// Optionally log error or handle as needed
}
res.json(responseBody);
});
app.listen(3000, () => {
console.log('Server running on port 3000');
});
Last updated
Was this helpful?