import fetch from 'node-fetch'; import { getNodeProfile, getNodeVersionAsNumber, getUserEmail } from '../../src/env/nodeProfile'; import { API } from './API'; import { HTTP_METHOD } from './httpMethod'; import { sendJsonRequest } from './httpRequestUtil'; type UserSession = { csrfToken: string; cookies: string }; const userSessions: { [nodeName: string]: { [userName: string]: UserSession } } = {}; export async function getUserSession(nodeName: string, userName: string): Promise { if (userSessions[nodeName] && userSessions[nodeName][userName]) { return userSessions[nodeName][userName]; } return await loginToNodeAsUser(nodeName, userName); } async function loginToNodeAsUser(nodeName: string, userName: string): Promise { const partyProfile = getNodeProfile(nodeName); const loginName = partyProfile[userName + 'Username']; const loginPassword = partyProfile[userName + 'Password']; userSessions[nodeName] = userSessions[nodeName] || {}; const baseUrl = partyProfile.baseUrl; const version = getNodeVersionAsNumber(nodeName); if (!!version && version >= 8) { userSessions[nodeName][userName] = await callLoginEndpoint( baseUrl, getUserEmail(loginName, nodeName), loginPassword ); } else { userSessions[nodeName][userName] = await callLoginEndpoint(baseUrl, loginName, loginPassword); } return userSessions[nodeName][userName]; } async function callLoginEndpoint(baseUrl: string, loginName: string, loginPassword: string): Promise { const loginUrl = baseUrl + API.LOGIN; const loginBody = { username: loginName, password: loginPassword }; logger.info('loginBody:' + JSON.stringify(loginBody)); const loginResponse = await fetch(loginUrl, { method: HTTP_METHOD.POST, body: JSON.stringify(loginBody), headers: { 'Content-Type': 'application/json' } }); logger.info('Login Response:' + (await loginResponse.text())); if (loginResponse.status != 200) { throw new Error('Login failed by using ' + loginUrl); } const csrfToken = loginResponse.headers.get('x-csrf-token'); const cookies = loginResponse.headers.get('set-cookie'); return { csrfToken: csrfToken, cookies: cookies }; } export async function makeAuthenticatedRequest( party: string, userName: string, endPoint: string, httpMethod: HTTP_METHOD, requestBody?: any ): Promise { const { csrfToken, cookies } = await getUserSession(party, userName); const baseUrl = getNodeProfile(party).baseUrl; const requestUrl = baseUrl + API.VERSION + endPoint; return await sendJsonRequest(cookies, csrfToken, requestUrl, httpMethod, requestBody); }