From 27bcc4ecc14558099b9a89616bfd7145b4adc967 Mon Sep 17 00:00:00 2001 From: Rory& Date: Sat, 20 Sep 2025 20:41:10 +0200 Subject: [PATCH] Try to factor out multi-query sql stuff --- index.js | 144 +++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 102 insertions(+), 42 deletions(-) diff --git a/index.js b/index.js index aee1a18..a4b73a3 100644 --- a/index.js +++ b/index.js @@ -22,54 +22,105 @@ function getYesterday() { ); } + +/** + * @param {string} query + * @param {any} params + * @returns {Promise} + */ +async function queryScalarAsync(query, ...params) { + const connection = await mysql.createConnection({ + host: process.env.DATABASE_HOST, + user: process.env.DATABASE_USER, + password: process.env.DATABASE_PASSWORD, + database: process.env.DATABASE_NAME + }); + await connection.connect(); + return new Promise((resolve, reject) => { + connection.query(query, params, (err, results) => { + if (err) { + reject(err); + } else { + resolve(results[0]); + } + connection.end(); + }); + }); +} + /** * Fetch call statistics * @returns {Promise} */ async function getPreviousDayData() { - return new Promise(async (resolve, reject) => { - const yesterday = getYesterday(); - const connection = await mysql.createConnection({ - host: process.env.DATABASE_HOST, - user: process.env.DATABASE_USER, - password: process.env.DATABASE_PASSWORD, - database: process.env.DATABASE_NAME, - multipleStatements: true - }); - await connection.connect(); - await connection.query(` + const [ callsYesterday, callsThisMonth, callsTotal ] = Promise.all([ + queryScalarAsync(` SELECT COUNT(DISTINCT uniqueid) AS call_count FROM cdr WHERE calldate BETWEEN ? AND ?; + `, getYesterday().startDate, getYesterday().endDate), + queryScalarAsync(` SELECT COUNT(DISTINCT uniqueid) AS call_count FROM cdr WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?); + `, getYesterday().startDate, getYesterday().startDate), + queryScalarAsync(` SELECT COUNT(DISTINCT uniqueid) AS call_count FROM cdr; - `, [ yesterday.start, yesterday.end, yesterday.start, yesterday.start ], (err, res) => { - if (err) { - reject(err); - } - connection.end(); - // let output = { - // "Calls Made": res[0][0].call_count, - // "Monthly Total": res[1][0].call_count, - // "Total Calls Ever Placed": res[2][0].call_count, - // "System Uptime": getSystemUptime().toString(false, false), - // "All Time Record": null, // Placeholder - // } - - const stats = new CallStats({ - callsMadeToday: res[0][0].call_count, - totalCallsThisMonth: res[1][0].call_count, - totalCallsEverPlaced: res[2][0].call_count, - allTimeRecord: null // Placeholder - }); - - console.log(stats); - resolve(stats); - }); + `) + ]); + const stats = new CallStats({ + totalCallsMade: callsYesterday, + totalCallsThisMonth: callsThisMonth, + totalCallsEverPlaced: callsTotal }); + console.log("Got stats:", stats); + return stats; + // return new Promise(async (resolve, reject) => { + // const yesterday = getYesterday(); + // const connection = await mysql.createConnection({ + // host: process.env.DATABASE_HOST, + // user: process.env.DATABASE_USER, + // password: process.env.DATABASE_PASSWORD, + // database: process.env.DATABASE_NAME, + // multipleStatements: true + // }); + // await connection.connect(); + // await connection.query(` + // SELECT COUNT(DISTINCT uniqueid) AS call_count + // FROM cdr + // WHERE calldate BETWEEN ? AND ?; + // + // SELECT COUNT(DISTINCT uniqueid) AS call_count + // FROM cdr + // WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?); + // + // SELECT COUNT(DISTINCT uniqueid) AS call_count + // FROM cdr; + // `, [ yesterday.start, yesterday.end, yesterday.start, yesterday.start ], (err, res) => { + // if (err) { + // reject(err); + // } + // connection.end(); + // // let output = { + // // "Calls Made": res[0][0].call_count, + // // "Monthly Total": res[1][0].call_count, + // // "Total Calls Ever Placed": res[2][0].call_count, + // // "System Uptime": getSystemUptime().toString(false, false), + // // "All Time Record": null, // Placeholder + // // } + // + // const stats = new CallStats({ + // callsMadeToday: res[0][0].call_count, + // totalCallsThisMonth: res[1][0].call_count, + // totalCallsEverPlaced: res[2][0].call_count, + // allTimeRecord: null // Placeholder + // }); + // + // console.log(stats); + // resolve(stats); + // }); + // }); } function getSystemUptime() { @@ -118,30 +169,39 @@ async function sendSummary() { console.log("Preparing summary."); const data = await getPreviousDayData(); console.log("Updating records..."); - const updatedData = await updateRecords(data, records); + const stats = await updateRecords(data, records); console.log("Saving."); await records.toJSONFile(JSON_FILE); const yesterday = getYesterday(); - const makeField = (name, value) => ({ name, value: value === undefined ? "***ERR: UNDEFINED***" : value.toString(), inline: false }); + + await sendSummaryDiscord(yesterday, stats) +} + +async function sendSummaryDiscord(yesterday, stats) { + const makeField = (name, value) => ({ + name, + value: value === undefined ? "***ERR: UNDEFINED***" : value.toString(), + inline: false + }); let embed = { title: `Summary from to `, color: 0x1E90FF, fields: [ - makeField("Calls Made", updatedData.totalCallsMade), - makeField("Monthly Total", updatedData.totalCallsThisMonth), - makeField("Total Calls Ever Placed", updatedData.totalCallsEverPlaced), + makeField("Calls Made", stats.totalCallsMade), + makeField("Monthly Total", stats.totalCallsThisMonth), + makeField("Total Calls Ever Placed", stats.totalCallsEverPlaced), makeField("System Uptime", getSystemUptime().toString(false, false)), - makeField("All Time Record", updatedData.allTimeRecord) + makeField("All Time Record", stats.allTimeRecord) ], timestamp: new Date(), footer: {} } - if (updatedData.isNewRecord) { + if (stats.isNewRecord) { embed.color = 0xFFD700; // Gold color for new record - embed.fields.push(makeField("🎉 NEW RECORD! 🎉", `A new record has been set, at ${updatedData.totalCallsMade}!`)); + embed.fields.push(makeField("🎉 NEW RECORD! 🎉", `A new record has been set, at ${stats.totalCallsMade}!`)); } const payload = { embeds: [ embed ] };