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

142
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
* @returns {Promise<CallStats>}
*/
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);
});
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 <t:${Math.floor(yesterday.start / 1000)}:f> to <t:${Math.floor(yesterday.end / 1000)}:f>`,
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 ] };