Skip to content

Commit 2af9044

Browse files
rajbosCopilot
andcommitted
Add admin overview dashboard with aggregate stats and trend chart
- Add getAllUploads() DB function with JOIN to get github_login per row - Add day index on usage_uploads for faster admin queries - Admin dashboard (shown to is_admin users) includes: - Aggregate stats card (today/7d/30d) with Active Users count - Token usage trend chart for all users (by model/editor/by user) - Top Users by token usage table (last 30 days) - All Users list (collapsible, unchanged) - By User grouping caps at top 10 users; others shown as 'Other' - Admin today stats patched client-side using browser local timezone - Admin section appears above personal data for immediate visibility Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent afe198c commit 2af9044

2 files changed

Lines changed: 387 additions & 6 deletions

File tree

sharing-server/src/db.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ function initSchema(db: DatabaseSync): void {
150150
db.exec(`
151151
CREATE INDEX IF NOT EXISTS idx_uploads_user_day ON usage_uploads(user_id, day);
152152
CREATE INDEX IF NOT EXISTS idx_uploads_dataset ON usage_uploads(dataset_id, day);
153+
CREATE INDEX IF NOT EXISTS idx_uploads_day ON usage_uploads(day);
153154
`);
154155

155156
// Add fluency_json column if it doesn't exist (migration for existing DBs)
@@ -257,6 +258,20 @@ export function getAllUsers(): UserRow[] {
257258
return getDb().prepare('SELECT * FROM users ORDER BY created_at DESC').all() as unknown as UserRow[];
258259
}
259260

261+
export interface AdminUploadRow extends UploadRow {
262+
github_login: string;
263+
}
264+
265+
export function getAllUploads(days = 30): AdminUploadRow[] {
266+
return getDb().prepare(`
267+
SELECT uu.*, u.github_login
268+
FROM usage_uploads uu
269+
JOIN users u ON uu.user_id = u.id
270+
WHERE uu.day >= date('now', '-' || ? || ' days')
271+
ORDER BY uu.day DESC, uu.model
272+
`).all(days) as unknown as AdminUploadRow[];
273+
}
274+
260275
export function upsertUserFluencyScore(userId: number, scoreJson: string): void {
261276
getDb().prepare(`
262277
UPDATE users SET fluency_score_json = ? WHERE id = ?

0 commit comments

Comments
 (0)