fix: improve sql queries
This commit is contained in:
@@ -283,23 +283,32 @@ export const dashboard = new Elysia()
|
||||
const keyId = resolved?.keyId ?? null;
|
||||
if (!accountId) return redirect("/dashboard");
|
||||
|
||||
const [acc] = await sql`SELECT id, email_hash, plan, plan_expires_at, plan_stack, created_at FROM accounts WHERE id = ${accountId}`;
|
||||
const isSubKey = !!keyId;
|
||||
const apiKeys = isSubKey ? [] : await sql`SELECT id, key, label, created_at, last_used_at FROM api_keys WHERE account_id = ${accountId} ORDER BY created_at DESC`;
|
||||
const loginKey = isSubKey ? null : (cookie?.pingql_key?.value ?? null);
|
||||
const [{ count: monitorCount }] = await sql`SELECT COUNT(*)::int as count FROM monitors WHERE account_id = ${accountId}`;
|
||||
|
||||
let invoices: any[] = [];
|
||||
try {
|
||||
invoices = await sql`
|
||||
SELECT id, plan, months, amount_usd, coin, amount_crypto, status, created_at, paid_at, expires_at, txid
|
||||
FROM payments
|
||||
WHERE account_id = ${accountId}
|
||||
AND (status = 'paid' OR (status IN ('pending', 'underpaid', 'confirming') AND expires_at >= now()))
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 20
|
||||
`;
|
||||
} catch {}
|
||||
// All four reads are independent — fan them out in parallel instead of
|
||||
// serializing four round-trips. Each individual query is fast (PK seek or
|
||||
// small indexed scan); the win is just halving the wall-clock by not
|
||||
// waiting on each one in turn.
|
||||
const accountQ = sql`SELECT id, email_hash, plan, plan_expires_at, plan_stack, created_at FROM accounts WHERE id = ${accountId}`;
|
||||
const apiKeysQ = isSubKey
|
||||
? Promise.resolve([] as any[])
|
||||
: sql`SELECT id, key, label, created_at, last_used_at FROM api_keys WHERE account_id = ${accountId} ORDER BY created_at DESC`;
|
||||
const monitorCountQ = sql`SELECT COUNT(*)::int as count FROM monitors WHERE account_id = ${accountId}`;
|
||||
const invoicesQ = sql`
|
||||
SELECT id, plan, months, amount_usd, coin, amount_crypto, status, created_at, paid_at, expires_at, txid
|
||||
FROM payments
|
||||
WHERE account_id = ${accountId}
|
||||
AND (status = 'paid' OR (status IN ('pending', 'underpaid', 'confirming') AND expires_at >= now()))
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 20
|
||||
`.catch(() => [] as any[]);
|
||||
|
||||
const [accountRows, apiKeys, monitorCountRows, invoices] = await Promise.all([
|
||||
accountQ, apiKeysQ, monitorCountQ, invoicesQ,
|
||||
]);
|
||||
const acc = accountRows[0];
|
||||
const monitorCount = monitorCountRows[0].count;
|
||||
|
||||
return html("settings", { nav: "settings", account: acc, apiKeys, accountId, loginKey, isSubKey, monitorCount, invoices });
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user