Try to factor out multi-query sql stuff

This commit is contained in:
Rory& 2025-09-20 20:41:10 +02:00
parent 6751fb93a3
commit 27bcc4ecc1

144
index.js
View file

@ -22,54 +22,105 @@ function getYesterday() {
); );
} }
/**
* @param {string} query
* @param {any} params
* @returns {Promise<int>}
*/
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 * Fetch call statistics
* @returns {Promise<CallStats>} * @returns {Promise<CallStats>}
*/ */
async function getPreviousDayData() { async function getPreviousDayData() {
return new Promise(async (resolve, reject) => { const [ callsYesterday, callsThisMonth, callsTotal ] = Promise.all([
const yesterday = getYesterday(); queryScalarAsync(`
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 SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr FROM cdr
WHERE calldate BETWEEN ? AND ?; WHERE calldate BETWEEN ? AND ?;
`, getYesterday().startDate, getYesterday().endDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr FROM cdr
WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?); WHERE MONTH (calldate) = MONTH (?) AND YEAR (calldate) = YEAR (?);
`, getYesterday().startDate, getYesterday().startDate),
queryScalarAsync(`
SELECT COUNT(DISTINCT uniqueid) AS call_count SELECT COUNT(DISTINCT uniqueid) AS call_count
FROM cdr; FROM cdr;
`, [ yesterday.start, yesterday.end, yesterday.start, yesterday.start ], (err, res) => { `)
if (err) { ]);
reject(err); const stats = new CallStats({
} totalCallsMade: callsYesterday,
connection.end(); totalCallsThisMonth: callsThisMonth,
// let output = { totalCallsEverPlaced: callsTotal
// "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);
});
}); });
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() { function getSystemUptime() {
@ -118,30 +169,39 @@ async function sendSummary() {
console.log("Preparing summary."); console.log("Preparing summary.");
const data = await getPreviousDayData(); const data = await getPreviousDayData();
console.log("Updating records..."); console.log("Updating records...");
const updatedData = await updateRecords(data, records); const stats = await updateRecords(data, records);
console.log("Saving."); console.log("Saving.");
await records.toJSONFile(JSON_FILE); await records.toJSONFile(JSON_FILE);
const yesterday = getYesterday(); 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 = { let embed = {
title: `Summary from <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`, title: `Summary from <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`,
color: 0x1E90FF, color: 0x1E90FF,
fields: [ fields: [
makeField("Calls Made", updatedData.totalCallsMade), makeField("Calls Made", stats.totalCallsMade),
makeField("Monthly Total", updatedData.totalCallsThisMonth), makeField("Monthly Total", stats.totalCallsThisMonth),
makeField("Total Calls Ever Placed", updatedData.totalCallsEverPlaced), makeField("Total Calls Ever Placed", stats.totalCallsEverPlaced),
makeField("System Uptime", getSystemUptime().toString(false, false)), makeField("System Uptime", getSystemUptime().toString(false, false)),
makeField("All Time Record", updatedData.allTimeRecord) makeField("All Time Record", stats.allTimeRecord)
], ],
timestamp: new Date(), timestamp: new Date(),
footer: {} footer: {}
} }
if (updatedData.isNewRecord) { if (stats.isNewRecord) {
embed.color = 0xFFD700; // Gold color for new record 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 ] }; const payload = { embeds: [ embed ] };