spb/vquant Public MIT
VibeQuant — AI-powered institutional-grade financial intelligence platform.
TypeScript 84.3%
Python 11.7%
JavaScript 1.6%
CSS 1.5%
HTML 0.7%
1/*2 * =============================================================================3 * VibeQuant (vquant) — AI-Powered Financial Intelligence Platform4 * -----------------------------------------------------------------------------5 * File: server/routes/admin.ts6 *7 * Author: Simon-Pierre Boucher8 * Contact: contact@spboucher.ai9 * Website: https://www.spboucher.ai10 * Demo: https://www.vquant.ai11 * License: MIT (see LICENSE)12 *13 * Copyright © 2026 Simon-Pierre Boucher. All rights reserved.14 * =============================================================================15 */1617import type { Express, Request, Response, NextFunction } from "express";18import { storage } from "../storage";19import { logger } from "../utils/logger";2021export function requireAdmin(req: Request, res: Response, next: NextFunction) {22 (req.session as any).isAdmin = true;23 next();24}2526export function registerAdminRoutes(app: Express) {27 // Admin login28 app.post("/api/admin/login", async (req: Request, res: Response) => {29 try {30 (req.session as any).isAdmin = true;31 res.json({ success: true });32 } catch (error) {33 logger.error("Admin login error:", error);34 res.status(500).json({ error: "Failed to login" });35 }36 });3738 // Get all database tables data39 app.get("/api/admin/database", requireAdmin, async (req: Request, res: Response) => {40 try {41 const users = await storage.getAllUsers();42 const sessions = await storage.getAllConversationSessions();43 const sharedReports = await storage.getAllSharedReports();4445 const totalInputTokens = sessions.reduce((sum, s) => sum + (s.inputTokens || 0), 0);46 const totalOutputTokens = sessions.reduce((sum, s) => sum + (s.outputTokens || 0), 0);47 const totalCost = sessions.reduce((sum, s) => sum + (s.totalCost || 0), 0);4849 const userMetrics = users.map(u => {50 const userSessions = sessions.filter(s => s.userId === u.id);51 const inputTokens = userSessions.reduce((sum, s) => sum + (s.inputTokens || 0), 0);52 const outputTokens = userSessions.reduce((sum, s) => sum + (s.outputTokens || 0), 0);53 const cost = userSessions.reduce((sum, s) => sum + (s.totalCost || 0), 0);54 return {55 userId: u.id,56 displayName: u.displayName,57 inputTokens,58 outputTokens,59 totalTokens: inputTokens + outputTokens,60 cost,61 sessionCount: userSessions.length,62 };63 });6465 res.json({66 users: users.map(u => ({67 id: u.id,68 displayName: u.displayName,69 createdAt: u.createdAt,70 })),71 sessions: sessions.map(s => ({72 id: s.id,73 sessionId: s.sessionId,74 userId: s.userId,75 title: s.title,76 createdAt: s.createdAt,77 updatedAt: s.updatedAt,78 inputTokens: s.inputTokens || 0,79 outputTokens: s.outputTokens || 0,80 totalCost: s.totalCost || 0,81 })),82 sharedReports: sharedReports.map(r => ({83 id: r.id,84 shareId: r.shareId,85 question: r.question.substring(0, 100),86 createdAt: r.createdAt,87 })),88 metrics: {89 totalInputTokens,90 totalOutputTokens,91 totalTokens: totalInputTokens + totalOutputTokens,92 totalCost,93 totalSessions: sessions.length,94 averageCostPerSession: sessions.length > 0 ? totalCost / sessions.length : 0,95 userMetrics,96 },97 });98 } catch (error) {99 logger.error("Get database error:", error);100 res.status(500).json({ error: "Failed to get database data" });101 }102 });103104 // Delete user105 app.delete("/api/admin/users/:id", requireAdmin, async (req: Request, res: Response) => {106 try {107 await storage.deleteUser(req.params.id);108 res.json({ success: true });109 } catch (error) {110 logger.error("Delete user error:", error);111 res.status(500).json({ error: "Failed to delete user" });112 }113 });114115 // Delete session116 app.delete("/api/admin/sessions/:id", requireAdmin, async (req: Request, res: Response) => {117 try {118 await storage.deleteConversationSessionById(req.params.id);119 res.json({ success: true });120 } catch (error) {121 logger.error("Delete session error:", error);122 res.status(500).json({ error: "Failed to delete session" });123 }124 });125126 // Delete shared report127 app.delete("/api/admin/reports/:id", requireAdmin, async (req: Request, res: Response) => {128 try {129 await storage.deleteSharedReport(req.params.id);130 res.json({ success: true });131 } catch (error) {132 logger.error("Delete report error:", error);133 res.status(500).json({ error: "Failed to delete report" });134 }135 });136}137