Files
cobble/src/functions/backend/db/bot-files/grab-storage-usage.ts
T
2026-10-21 17:56:09 +01:00

62 lines
1.7 KiB
TypeScript

import BunSQLite from "@moduletrace/bun-sqlite";
import type { BotFileScope } from "@/src/dict/bot-file-dict";
type Params = {
scope: BotFileScope;
owner_id: number | string;
};
type UsageRow = {
total: number | null;
files: number | null;
};
/**
* How many bytes (and files) a directory holds.
*/
export default async function grabStorageUsage({ scope, owner_id }: Params) {
const res = await BunSQLite.sql<UsageRow>({
sql: `SELECT COALESCE(SUM(size), 0) AS total, COUNT(*) AS files FROM bot_files WHERE scope = ? AND owner_id = ?`,
values: [scope, owner_id],
});
const row = res.payload?.[0];
return {
bytes: Number(row?.total) || 0,
files: Number(row?.files) || 0,
};
}
/**
* Every directory's usage at once, for the settings page.
*/
export async function grabStorageUsageByOwner() {
const res = await BunSQLite.sql<{ scope: string; owner_id: number; total: number; files: number }>({
sql: `SELECT scope, owner_id, SUM(size) AS total, COUNT(*) AS files FROM bot_files GROUP BY scope, owner_id`,
values: [],
});
return (res.payload || []).map((row) => ({
scope: row.scope as BotFileScope,
owner_id: Number(row.owner_id),
bytes: Number(row.total) || 0,
files: Number(row.files) || 0,
}));
}
/**
* Total bytes across every directory.
*/
export async function grabTotalStorageUsage() {
const res = await BunSQLite.sql<{ total: number | null; files: number | null }>({
sql: `SELECT COALESCE(SUM(size), 0) AS total, COUNT(*) AS files FROM bot_files`,
values: [],
});
return {
bytes: Number(res.payload?.[0]?.total) || 0,
files: Number(res.payload?.[0]?.files) || 0,
};
}