irelandcuca/HumanMaster6HD
1
1const express = require('express');2const { Pool } = require('pg');3const session = require('express-session');4const pgSession = require('connect-pg-simple')(session);5require('dotenv').config();6 7const app = express();8const PORT = process.env.PORT || 7860; 9 10// 1. Initialize High-Performance Database Connection Pool11const pool = new Pool({12 connectionString: process.env.DATABASE_URL,13 ssl: { 14 rejectUnauthorized: false,15 require: true16 } 17});18 19 20// 2. Attach Express Session management directly to your 'sessions' Table21app.use(session({22 store: new pgSession({23 pool: pool,24 tableName: 'sessions'25 }),26 secret: process.env.SESSION_SECRET || 'ucdm_global_secure_secret_token',27 resave: false,28 saveUninitialized: false,29 cookie: { 30 maxAge: 30 * 24 * 60 * 60 * 1000, 31 secure: false, 32 httpOnly: true 33 }34}));35 36// 3. Visual Admin Dashboard Interface37app.get('/', async (req, res) => {38 try {39 // Fetch real-time data counts from your tables40 const userCount = await pool.query('SELECT COUNT(*) FROM users');41 const logCount = await pool.query('SELECT COUNT(*) FROM usage_logs');42 43 res.send(`44 <!DOCTYPE html>45 <html lang="en">46 <head>47 <meta charset="UTF-8">48 <meta name="viewport" content="width=device-width, initial-scale=1.0">49 <title>Audio AI Hub Admin Dashboard</title>50 <style>51 body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #0f172a; color: #f8fafc; padding: 40px; margin: 0; }52 .container { max-width: 800px; margin: 0 auto; }53 .header { border-bottom: 1px solid #334155; padding-bottom: 20px; margin-bottom: 30px; }54 h1 { color: #38bdf8; margin: 0; font-size: 28px; }55 .status-badge { background: #10b981; color: white; padding: 4px 10px; border-radius: 12px; font-size: 12px; display: inline-block; margin-top: 8px; }56 .grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin-top: 20px; }57 .card { background: #1e293b; border: 1px solid #334155; padding: 24px; border-radius: 12px; text-align: center; }58 .card-number { font-size: 48px; font-weight: bold; color: #f59e0b; margin: 10px 0; }59 .card-label { color: #94a3b8; font-size: 14px; text-transform: uppercase; letter-spacing: 0.5px; }60 </style>61 </head>62 <body>63 <div class="container">64 <div class="header">65 <h1>Audio AI Hub Administrative Engine</h1>66 <div class="status-badge">● Engine Operational</div>67 </div>68 <p>Your Docker core container is fully active on Hugging Face. The database proxy lines are listening for live app integrations.</p>69 70 <div class="grid">71 <div class="card">72 <div class="card-label">Registered App Users</div>73 <div class="card-number">${userCount.rows[0].count}</div>74 </div>75 <div class="card">76 <div class="card-label">Total Files Processed</div>77 <div class="card-number">${logCount.rows[0].count}</div>78 </div>79 </div>80 </div>81 </body>82 </html>83 `);84 } catch (err) {85 res.status(500).send(`86 <body style="background: #0f172a; color: #f8fafc; padding: 40px; font-family: sans-serif;">87 <h2 style="color: #ef4444;">Database Connection Error</h2>88 <p>Your server is running, but it cannot connect to your PostgreSQL database.</p>89 <code style="background: #1e293b; padding: 10px; display: block; border-radius: 6px; color: #f8fafc;">${err.message}</code>90 <p>Please double-check your <strong>DATABASE_URL</strong> secret in the Space settings tab.</p>91 </body>92 `);93 }94});95 96// 4. API Core Schema Integration Routes97 98// Create/Sync User99app.post('/api/users', async (req, res) => {100 const { id, email, first_name, last_name, profile_image_url, tier } = req.body;101 try {102 const result = await pool.query(103 `INSERT INTO users (id, email, first_name, last_name, profile_image_url, tier) 104 VALUES (COALESCE($1, gen_random_uuid()::text), $2, $3, $4, $5, COALESCE($6, 'free'::tier)) 105 ON CONFLICT (email) DO UPDATE 106 SET first_name = EXCLUDED.first_name, last_name = EXCLUDED.last_name, profile_image_url = EXCLUDED.profile_image_url, updated_at = now()107 RETURNING *`,108 [id, email, first_name, last_name, profile_image_url, tier]109 );110 res.status(201).json({ success: true, user: result.rows[0] });111 } catch (err) { res.status(500).json({ error: err.message }); }112});113 114// Write Processed Usage Log115app.post('/api/logs', async (req, res) => {116 const { user_id, preset, original_filename, output_filename } = req.body;117 try {118 const result = await pool.query(119 `INSERT INTO usage_logs (user_id, preset, original_filename, output_filename) 120 VALUES ($1, $2, $3, $4) RETURNING *`,121 [user_id, preset, original_filename, output_filename]122 );123 res.status(201).json({ success: true, log: result.rows[0] });124 } catch (err) { res.status(500).json({ error: err.message }); }125});126 127// Explicitly bind network listening parameters128app.listen(PORT, '0.0.0.0', () => {129 console.log(`Server actively routing pipelines on port ${PORT}`);130});131 