fix(leaderboard): use refinery_spending_history and match canonical balance calc

- Changed refinery spent query from refinery_orders to refinery_spending_history
  (refinery_orders rows are deleted on item win, inflating displayed balance)
- Removed extra status != 'permanently_rejected' filter from earned subqueries
  to match getUserScrapsBalance which only checks scraps_paid_at IS NOT NULL
- Removed unused shopOrdersTable import
This commit is contained in:
End Nightshade 2026-02-19 09:54:40 -07:00
parent 75a4de7a49
commit 176fadea63
No known key found for this signature in database

View file

@ -2,7 +2,7 @@ import { Elysia, t } from 'elysia'
import { db } from '../db'
import { usersTable } from '../schemas/users'
import { projectsTable } from '../schemas/projects'
import { shopItemsTable, shopOrdersTable, refineryOrdersTable, shopPenaltiesTable } from '../schemas/shop'
import { shopItemsTable, refineryOrdersTable, shopPenaltiesTable } from '../schemas/shop'
import { sql, desc, eq, and, or, isNull } from 'drizzle-orm'
const leaderboard = new Elysia({ prefix: '/leaderboard' })
@ -16,10 +16,10 @@ leaderboard.get('/', async ({ query }) => {
id: usersTable.id,
username: usersTable.username,
avatar: usersTable.avatar,
scrapsEarned: sql<number>`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND status != 'permanently_rejected' AND scraps_paid_at IS NOT NULL), 0)`.as('scraps_earned'),
scrapsEarned: sql<number>`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND scraps_paid_at IS NOT NULL), 0)`.as('scraps_earned'),
scrapsBonus: sql<number>`COALESCE((SELECT SUM(amount) FROM user_bonuses WHERE user_id = ${usersTable.id}), 0)`.as('scraps_bonus'),
scrapsShopSpent: sql<number>`COALESCE((SELECT SUM(total_price) FROM shop_orders WHERE user_id = ${usersTable.id}), 0)`.as('scraps_shop_spent'),
scrapsRefinerySpent: sql<number>`COALESCE((SELECT SUM(cost) FROM refinery_orders WHERE user_id = ${usersTable.id}), 0)`.as('scraps_refinery_spent'),
scrapsRefinerySpent: sql<number>`COALESCE((SELECT SUM(cost) FROM refinery_spending_history WHERE user_id = ${usersTable.id}), 0)`.as('scraps_refinery_spent'),
hours: sql<number>`COALESCE(SUM(${projectsTable.hours}), 0)`.as('total_hours'),
projectCount: sql<number>`COUNT(${projectsTable.id})`.as('project_count')
})
@ -50,10 +50,10 @@ leaderboard.get('/', async ({ query }) => {
id: usersTable.id,
username: usersTable.username,
avatar: usersTable.avatar,
scrapsEarned: sql<number>`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND status != 'permanently_rejected' AND scraps_paid_at IS NOT NULL), 0)`.as('scraps_earned'),
scrapsEarned: sql<number>`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND scraps_paid_at IS NOT NULL), 0)`.as('scraps_earned'),
scrapsBonus: sql<number>`COALESCE((SELECT SUM(amount) FROM user_bonuses WHERE user_id = ${usersTable.id}), 0)`.as('scraps_bonus'),
scrapsShopSpent: sql<number>`COALESCE((SELECT SUM(total_price) FROM shop_orders WHERE user_id = ${usersTable.id}), 0)`.as('scraps_shop_spent'),
scrapsRefinerySpent: sql<number>`COALESCE((SELECT SUM(cost) FROM refinery_orders WHERE user_id = ${usersTable.id}), 0)`.as('scraps_refinery_spent'),
scrapsRefinerySpent: sql<number>`COALESCE((SELECT SUM(cost) FROM refinery_spending_history WHERE user_id = ${usersTable.id}), 0)`.as('scraps_refinery_spent'),
hours: sql<number>`COALESCE(SUM(${projectsTable.hours}), 0)`.as('total_hours'),
projectCount: sql<number>`COUNT(${projectsTable.id})`.as('project_count')
})
@ -64,7 +64,7 @@ leaderboard.get('/', async ({ query }) => {
sql`${projectsTable.status} != 'permanently_rejected'`
))
.groupBy(usersTable.id)
.orderBy(desc(sql`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND status != 'permanently_rejected' AND scraps_paid_at IS NOT NULL), 0) + COALESCE((SELECT SUM(amount) FROM user_bonuses WHERE user_id = ${usersTable.id}), 0) - COALESCE((SELECT SUM(total_price) FROM shop_orders WHERE user_id = ${usersTable.id}), 0) - COALESCE((SELECT SUM(cost) FROM refinery_orders WHERE user_id = ${usersTable.id}), 0)`))
.orderBy(desc(sql`COALESCE((SELECT SUM(scraps_awarded) FROM projects WHERE user_id = ${usersTable.id} AND scraps_paid_at IS NOT NULL), 0) + COALESCE((SELECT SUM(amount) FROM user_bonuses WHERE user_id = ${usersTable.id}), 0) - COALESCE((SELECT SUM(total_price) FROM shop_orders WHERE user_id = ${usersTable.id}), 0) - COALESCE((SELECT SUM(cost) FROM refinery_spending_history WHERE user_id = ${usersTable.id}), 0)`))
.limit(10)
return results.map((user, index) => ({