SPB Git

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%
4.7 KB · 137 lines typescript
Raw Blame History
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