librechat-balances/server.js
DJP 2cc8178a18 Add credit request system with public form and admin dashboard
- Public page at /request for users to submit top-up requests
  (email + OMG job number, no auth required)
- Admin "Requests" view with pending/processed/all filters
- Approve with preset amounts (5M/10M/20M) or reject
- Pending count badge in sidebar nav
- Request data stored in JSON file (data/requests.json)
- Data volume mounted for persistence across rebuilds

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 14:43:42 -04:00

66 lines
1.8 KiB
JavaScript

require('dotenv').config();
const express = require('express');
const path = require('path');
const { MongoClient } = require('mongodb');
const app = express();
const PORT = process.env.PORT || 3002;
const MONGO_URI = process.env.MONGO_URI || 'mongodb://localhost:27017/LibreChat';
const API_KEY = process.env.API_KEY || 'change-me';
let db;
async function connectDB() {
const client = new MongoClient(MONGO_URI);
await client.connect();
db = client.db();
console.log('Connected to MongoDB');
return db;
}
function authMiddleware(req, res, next) {
const key = req.headers['x-api-key'] || req.query.key;
if (key !== API_KEY) {
return res.status(401).json({ error: 'Unauthorized' });
}
next();
}
function dbMiddleware(req, res, next) {
req.db = db;
next();
}
app.use(express.json());
app.use(express.static(path.join(__dirname, 'public')));
const apiRoutes = require('./routes/api');
const requestRoutes = require('./routes/requests');
// Public: submit a credit request (no auth needed)
app.use('/api/requests', requestRoutes.publicRouter);
// Admin: manage credit requests (auth required)
app.use('/api/admin/requests', authMiddleware, requestRoutes.adminRouter);
// Admin: balance management API (auth required)
app.use('/api', dbMiddleware, authMiddleware, apiRoutes);
app.get('/health', (req, res) => res.json({ status: 'ok' }));
app.get('/request', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'request.html'));
});
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'public', 'index.html'));
});
connectDB().then(() => {
app.listen(PORT, '0.0.0.0', () => {
console.log(`Balance Manager running on http://localhost:${PORT}`);
});
}).catch(err => {
console.error('Failed to connect to MongoDB:', err);
process.exit(1);
});