diff --git a/index.js b/index.js index fa45e2b..761a33a 100644 --- a/index.js +++ b/index.js @@ -1031,10 +1031,10 @@ app.get("/api/healthcheck", (req, res) => { }); // logCall function (caller, callee) -const logCall = (caller, callee, srcIp) => { +const logCall = (caller, callee, srcIp, success, reason) => { pool.getConnection().then(conn => { - conn.query('INSERT INTO callLogs (caller, callee, timestamp, srcIp) VALUES (?, ?, ?, ?)', - [caller, callee, Math.floor(Date.now()), srcIp]).catch(err => { + conn.query('INSERT INTO callLogs (caller, callee, timestamp, srcIp, success, reason) VALUES (?, ?, ?, ?, ?, ?)', + [caller, callee, Math.floor(Date.now()), srcIp, success, reason]).catch(err => { console.error('Error logging call:', err); }).finally(() => { conn.release(); @@ -1056,17 +1056,20 @@ const genCall = (req, res, apiKey, ani, number) => { // If no row or error, return 401 if (!row) { res.status(401).send(`${process.env.MSG_ROUTE_ADDRESS}/401`) + logCall(ani, number, srcIp, false, "invalid_api_key"); return; } // Validate the ani and number are 7 digit numbers if (!ani || ani < 1000000 || ani > 9999999 || !number || number < 1000000 || number > 9999999) { res.status(400).send(`${process.env.MSG_ROUTE_ADDRESS}/400`); + logCall(ani, number, srcIp, false, "invalid_number"); return; } // Validate the ani is owned by the apiKey if (ani < row.block_start || ani > row.block_start + row.block_length) { res.status(403).send(`${process.env.MSG_ROUTE_ADDRESS}/403`); + logCall(ani, number, srcIp, false, "ani_not_in_block"); return; } @@ -1078,6 +1081,7 @@ const genCall = (req, res, apiKey, ani, number) => { const routeId = row ? row.id : null; if (!routeId) { res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`); + logCall(ani, number, srcIp, false, "no_route"); return; } @@ -1085,6 +1089,7 @@ const genCall = (req, res, apiKey, ani, number) => { if (blockRows.length > 0) { // ANI is blocked from calling this route console.log(`Blocked Call Attempt: ${ani} -> ${number}`); + logCall(ani, number, srcIp, false, "blocklist"); res.status(403).send(`${process.env.MSG_ROUTE_ADDRESS}/403`); return; } @@ -1093,7 +1098,7 @@ const genCall = (req, res, apiKey, ani, number) => { // Check if the ANI is within the block range // If it is, return `local` console.log(`New Call: ${ani} -> ${number}`); - logCall(ani, number); + logCall(ani, number, srcIp, true); // incriment estCallsMade analytics addAnalytic("estCallsMade"); dailyAnalytic("dailyCallsMade"); @@ -1104,19 +1109,24 @@ const genCall = (req, res, apiKey, ani, number) => { } } else { res.status(404).send(`${process.env.MSG_ROUTE_ADDRESS}/404`); + logCall(ani, number, srcIp, false, "no_route"); + return; } }).catch(err => { console.error('Error checking blocklist:', err); res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`); + logCall(ani, number, srcIp, false, "blocklist_error"); return; }); }).catch(err => { console.error('Error getting route:', err); res.status(500).send(`${process.env.MSG_ROUTE_ADDRESS}/500`) + }); }).catch(err => { console.error(err); res.status(401).send(`${process.env.MSG_ROUTE_ADDRESS}/401`) + logCall(ani, number, srcIp, false, "invalid_api_key"); }).finally(() => { conn.release(); }); diff --git a/migrations/011_update_callLogs_add_srcIp.sql b/migrations/011_update_callLogs_add_srcIp.sql index 273365a..e94e9af 100644 --- a/migrations/011_update_callLogs_add_srcIp.sql +++ b/migrations/011_update_callLogs_add_srcIp.sql @@ -1 +1,3 @@ -ALTER TABLE callLogs ADD COLUMN srcIp VARCHAR(255) NOT NULL DEFAULT 'unknown'; \ No newline at end of file +ALTER TABLE callLogs ADD COLUMN srcIp VARCHAR(255) NOT NULL DEFAULT 'unknown'; +ALTER TABLE callLogs ADD COLUMN success INTEGER NOT NULL DEFAULT 0; +ALTER TABLE callLogs ADD COLUMN reason VARCHAR(255) NOT NULL DEFAULT 'none'; \ No newline at end of file