← back to IWasCute

server.js

58 lines

const express = require('express');
const path = require('path');
const app = express();
const PORT = process.env.PORT || 7350;

// Basic auth for admin
function adminAuth(req, res, next) {
  const auth = req.headers.authorization;
  if (!auth || auth !== 'Basic ' + Buffer.from('admin:DWSecure2024!').toString('base64')) {
    res.set('WWW-Authenticate', 'Basic realm="IWasCute Admin"');
    return res.status(401).send('Auth required');
  }
  next();
}

app.use(express.json());

// In-memory submissions store (would be DB in production)
const submissions = [];

// API: submit a photo
app.post('/api/submit', (req, res) => {
  const sub = { id: Date.now(), ...req.body, status: 'pending', submittedAt: new Date().toISOString() };
  submissions.push(sub);
  res.json({ ok: true, id: sub.id });
});

// API: list submissions (admin)
app.get('/api/admin/submissions', adminAuth, (req, res) => {
  res.json({ submissions: submissions.slice().reverse() });
});

// API: approve/reject (admin)
app.post('/api/admin/review', adminAuth, (req, res) => {
  const { id, action } = req.body;
  const sub = submissions.find(s => s.id === id);
  if (!sub) return res.status(404).json({ error: 'Not found' });
  sub.status = action === 'approve' ? 'approved' : 'rejected';
  sub.reviewedAt = new Date().toISOString();
  res.json({ ok: true, status: sub.status });
});

// Admin dashboard
app.get('/admin', adminAuth, (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'admin.html'));
});

app.use(express.static(path.join(__dirname, 'public')));

// SPA fallback
app.use((req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'index.html'));
});

app.listen(PORT, '0.0.0.0', () => {
  console.log(`[IWasCute] Running on http://45.61.58.125:${PORT}`);
});