#!/usr/bin/env node
/**
* Debug script to show the exact API request being sent for Bank Leumi costs
* This will display all headers, parameters, and the full request URL
*/
const axios = require('axios');
const https = require('https');
// Create axios instance with request/response interceptors to log everything
const axiosInstance = axios.create({
httpsAgent: new https.Agent({
rejectUnauthorized: true
})
});
// Request interceptor to log full request details
axiosInstance.interceptors.request.use(request => {
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π€ OUTGOING API REQUEST');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
console.log('π URL:', request.url);
console.log('π Method:', request.method.toUpperCase());
console.log('\nπ¦ QUERY PARAMETERS:');
if (request.params) {
Object.entries(request.params).forEach(([key, value]) => {
console.log(` ${key}: ${value}`);
});
} else {
console.log(' (none)');
}
console.log('\nπ HEADERS:');
Object.entries(request.headers).forEach(([key, value]) => {
if (key.toLowerCase() === 'authorization') {
// Truncate JWT token for readability
const truncated = value.substring(0, 50) + '...' + value.substring(value.length - 20);
console.log(` ${key}: ${truncated}`);
} else {
console.log(` ${key}: ${value}`);
}
});
if (request.data) {
console.log('\nπ REQUEST BODY:');
console.log(JSON.stringify(request.data, null, 2));
}
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
return request;
});
// Response interceptor to log response details
axiosInstance.interceptors.response.use(
response => {
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('π₯ API RESPONSE');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
console.log('β
Status:', response.status, response.statusText);
console.log('π Headers:', Object.keys(response.headers).join(', '));
if (response.data) {
const dataStr = JSON.stringify(response.data);
if (dataStr.length > 500) {
console.log('π Data: Large response -', dataStr.length, 'characters');
// Show summary if it's cost data
if (response.data.data && Array.isArray(response.data.data)) {
console.log(` Rows returned: ${response.data.data.length}`);
if (response.data.data.length > 0) {
const sample = response.data.data[0];
console.log(' Sample row:', JSON.stringify(sample, null, 2).substring(0, 200) + '...');
}
}
} else {
console.log('π Data:', JSON.stringify(response.data, null, 2));
}
}
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
return response;
},
error => {
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ');
console.log('β API ERROR');
console.log('ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
if (error.response) {
console.log('Status:', error.response.status, error.response.statusText);
console.log('Error Data:', JSON.stringify(error.response.data, null, 2));
} else {
console.log('Error:', error.message);
}
console.log('\nββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
throw error;
}
);
async function debugBankLeumiRequest() {
console.log('π BANK LEUMI COST REQUEST DEBUGGER\n');
console.log('=====================================\n');
const username = 'david+allcloud@umbrellacost.com';
const password = 'B4*zcI7#F7poEC';
try {
// Step 1: Authenticate
console.log('STEP 1: Authenticating...\n');
const authResponse = await axiosInstance.post('https://api.umbrellacost.io/api/v1/users/signin', {
username: username,
password: password
});
const token = authResponse.data.jwtToken;
const userKey = JSON.parse(Buffer.from(token.split('.')[1], 'base64').toString()).sub;
console.log('β
Authentication successful');
console.log(' User Key:', userKey, '\n');
// Step 2: Get Bank Leumi division info
console.log('STEP 2: Getting Bank Leumi divisions...\n');
const tempApiKey = `${userKey}:15808:0`;
const divisionsResponse = await axiosInstance.get('https://api.umbrellacost.io/api/v1/users/plain-sub-users', {
headers: {
'Authorization': token,
'apikey': tempApiKey
}
});
// Extract Bank Leumi divisions
const leumiDivisions = divisionsResponse.data.customerDivisions['Bank Leumi'];
console.log(`\nβ
Found ${leumiDivisions.length} Bank Leumi divisions:\n`);
leumiDivisions.forEach((div, i) => {
console.log(`Division ${i + 1}:`);
console.log(` Account Name: ${div.accountName}`);
console.log(` Account ID: ${div.accountId}`);
console.log(` Account Key: ${div.accountKey}`);
console.log(` Division ID: ${div.divisionId}`);
console.log(` Cloud Type: ${div.cloudTypeId === 0 ? 'AWS' : 'Azure'}\n`);
});
// Step 3: Make cost request for each division
console.log('STEP 3: Making cost requests for Bank Leumi...\n');
for (const division of leumiDivisions) {
console.log(`\nπ¦ Testing ${division.accountName} (Division ID: ${division.divisionId})`);
console.log('βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ\n');
const apiKey = `${userKey}:${division.accountKey}:${division.divisionId}`;
console.log('π API Key Components:');
console.log(` User Key: ${userKey}`);
console.log(` Account Key: ${division.accountKey}`);
console.log(` Division ID: ${division.divisionId}`);
console.log(` Full API Key: ${apiKey}\n`);
// Try different parameter combinations
const testCases = [
{
name: 'Test 1: With startDate/endDate (UI format)',
params: {
startDate: '2024-12-01',
endDate: '2024-12-31',
costType: 'net_amortized',
isPpApplied: false
}
},
{
name: 'Test 2: With from/to parameters',
params: {
from: '2024-12-01',
to: '2024-12-31',
costType: 'net_amortized',
isPpApplied: false
}
},
{
name: 'Test 3: Without isPpApplied in params',
params: {
startDate: '2024-12-01',
endDate: '2024-12-31',
costType: 'net_amortized'
}
},
{
name: 'Test 4: With groupBy parameter',
params: {
startDate: '2024-12-01',
endDate: '2024-12-31',
costType: 'net_amortized',
groupBy: 'day',
isPpApplied: false
}
}
];
for (const test of testCases) {
console.log(`\nπ§ͺ ${test.name}`);
console.log('Parameters:', JSON.stringify(test.params, null, 2));
try {
const response = await axiosInstance.get('https://api.umbrellacost.io/api/v1/invoices/caui', {
params: test.params,
headers: {
'Authorization': token,
'apikey': apiKey,
'commonParams': JSON.stringify({ isPpApplied: false }),
'Content-Type': 'application/json',
'Accept': 'application/json'
}
});
if (response.data?.data?.length > 0) {
console.log(`β
SUCCESS! Found ${response.data.data.length} rows`);
// Show first row as example
const firstRow = response.data.data[0];
console.log('First row sample:', {
date: firstRow.date || firstRow.Date,
cost: firstRow.cost || firstRow.Cost,
service: firstRow.service_name || firstRow.ServiceName,
customer: firstRow.customer_name || firstRow.customerName
});
break; // Stop testing if we found data
} else {
console.log('β οΈ No data returned');
}
} catch (error) {
console.log(`β Request failed: ${error.response?.data?.message || error.message}`);
}
}
}
console.log('\n=====================================');
console.log('Debug session complete');
console.log('=====================================\n');
} catch (error) {
console.error('Fatal error:', error.message);
}
}
// Run the debug session
debugBankLeumiRequest();