117 lines
3.3 KiB
JavaScript
117 lines
3.3 KiB
JavaScript
function getProfileStats({ db, userId }) {
|
|
if (!userId) {
|
|
return { stats: [] };
|
|
}
|
|
const accountsTable = resolveTable(db, "accounts");
|
|
const transactionsTable = resolveTable(db, "transactions");
|
|
if (!accountsTable || !transactionsTable) {
|
|
return {
|
|
stats: [
|
|
{ label: "Balance", value: 0 },
|
|
{ label: "Total earned", value: 0 },
|
|
{ label: "Total spent", value: 0 },
|
|
{ label: "Given to others", value: 0 },
|
|
{ label: "Received from others", value: 0 }
|
|
]
|
|
};
|
|
}
|
|
const account = db
|
|
.prepare(`SELECT balance FROM ${quoteIdentifier(accountsTable)} WHERE user_id = ?`)
|
|
.get(userId);
|
|
const earned = db
|
|
.prepare(
|
|
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
|
|
"WHERE to_user_id = ? AND (from_user_id IS NULL OR from_user_id = '')"
|
|
)
|
|
.get(userId);
|
|
const spent = db
|
|
.prepare(
|
|
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
|
|
"WHERE from_user_id = ? AND (to_user_id IS NULL OR to_user_id = '')"
|
|
)
|
|
.get(userId);
|
|
const transfersOut = db
|
|
.prepare(
|
|
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
|
|
"WHERE from_user_id = ? AND to_user_id IS NOT NULL AND to_user_id != ''"
|
|
)
|
|
.get(userId);
|
|
const transfersIn = db
|
|
.prepare(
|
|
`SELECT COALESCE(SUM(amount), 0) AS total FROM ${quoteIdentifier(transactionsTable)} ` +
|
|
"WHERE to_user_id = ? AND from_user_id IS NOT NULL AND from_user_id != ''"
|
|
)
|
|
.get(userId);
|
|
|
|
return {
|
|
stats: [
|
|
{ label: "Balance", value: account?.balance ?? 0 },
|
|
{ label: "Total earned", value: earned?.total ?? 0 },
|
|
{ label: "Total spent", value: spent?.total ?? 0 },
|
|
{ label: "Given to others", value: transfersOut?.total ?? 0 },
|
|
{ label: "Received from others", value: transfersIn?.total ?? 0 }
|
|
]
|
|
};
|
|
}
|
|
|
|
function getLeaderboards({ db, limit = 10 }) {
|
|
const accountsTable = resolveTable(db, "accounts");
|
|
if (!accountsTable) {
|
|
return {
|
|
boards: [
|
|
{
|
|
title: "Top balances",
|
|
valueLabel: "Balance",
|
|
rows: []
|
|
}
|
|
]
|
|
};
|
|
}
|
|
const rows = db
|
|
.prepare(
|
|
`SELECT user_profiles.internal_username AS username, ${quoteIdentifier(accountsTable)}.balance AS value ` +
|
|
`FROM ${quoteIdentifier(accountsTable)} ` +
|
|
`JOIN user_profiles ON user_profiles.id = ${quoteIdentifier(accountsTable)}.user_id ` +
|
|
`ORDER BY ${quoteIdentifier(accountsTable)}.balance DESC LIMIT ?`
|
|
)
|
|
.all(limit);
|
|
|
|
return {
|
|
boards: [
|
|
{
|
|
title: "Top balances",
|
|
valueLabel: "Balance",
|
|
rows
|
|
}
|
|
]
|
|
};
|
|
}
|
|
|
|
function resolveTable(db, suffix) {
|
|
const legacyStem = ["echo", "nomy"].join("");
|
|
const current = `economy_${suffix}`;
|
|
const legacy = `${legacyStem}_${suffix}`;
|
|
if (tableExists(db, current)) {
|
|
return current;
|
|
}
|
|
if (tableExists(db, legacy)) {
|
|
return legacy;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function tableExists(db, name) {
|
|
return Boolean(
|
|
db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(name)
|
|
);
|
|
}
|
|
|
|
function quoteIdentifier(name) {
|
|
return `"${name.replace(/"/g, '""')}"`;
|
|
}
|
|
|
|
module.exports = {
|
|
getProfileStats,
|
|
getLeaderboards
|
|
};
|