← 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}`);
});