130 lines
3.9 KiB
JavaScript
130 lines
3.9 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const { db } = require('./db');
|
|
const crypto = require('crypto');
|
|
|
|
// Health Check
|
|
router.get('/health', (req, res) => {
|
|
res.json({ status: 'ok' });
|
|
});
|
|
|
|
// Create Event
|
|
router.post('/events', (req, res) => {
|
|
const { name, description, startDate, endDate } = req.body;
|
|
if (!name || !startDate || !endDate) {
|
|
return res.status(400).json({ error: 'Missing required fields' });
|
|
}
|
|
|
|
const id = crypto.randomUUID();
|
|
try {
|
|
const stmt = db.prepare('INSERT INTO events (id, name, description, start_date, end_date) VALUES (?, ?, ?, ?, ?)');
|
|
stmt.run(id, name, description || '', startDate, endDate);
|
|
|
|
res.json({
|
|
id,
|
|
message: 'Event created successfully'
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Failed to create event' });
|
|
}
|
|
});
|
|
|
|
// Get Event Details
|
|
router.get('/events/:id', (req, res) => {
|
|
try {
|
|
const stmt = db.prepare('SELECT * FROM events WHERE id = ?');
|
|
const event = stmt.get(req.params.id);
|
|
|
|
if (!event) {
|
|
return res.status(404).json({ error: 'Event not found' });
|
|
}
|
|
|
|
res.json(event);
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Failed to retrieve event' });
|
|
}
|
|
});
|
|
|
|
// Submit Response (Vote)
|
|
router.post('/events/:id/respond', (req, res) => {
|
|
const eventId = req.params.id;
|
|
const { name, votes } = req.body; // votes: [{ date: '2023-01-01', status: 'available' }]
|
|
|
|
if (!name || !Array.isArray(votes)) {
|
|
return res.status(400).json({ error: 'Invalid input' });
|
|
}
|
|
|
|
const participantId = crypto.randomUUID();
|
|
|
|
const insertParticipant = db.prepare('INSERT INTO participants (id, event_id, name) VALUES (?, ?, ?)');
|
|
const insertVote = db.prepare('INSERT INTO votes (id, participant_id, date, status) VALUES (?, ?, ?, ?)');
|
|
|
|
const transaction = db.transaction(() => {
|
|
insertParticipant.run(participantId, eventId, name);
|
|
for (const vote of votes) {
|
|
insertVote.run(crypto.randomUUID(), participantId, vote.date, vote.status);
|
|
}
|
|
});
|
|
|
|
try {
|
|
transaction();
|
|
res.json({ success: true, participantId });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Failed to submit response' });
|
|
}
|
|
});
|
|
|
|
// Get Analytics
|
|
router.get('/events/:id/analytics', (req, res) => {
|
|
const eventId = req.params.id;
|
|
|
|
try {
|
|
// Check if event exists
|
|
const event = db.prepare('SELECT * FROM events WHERE id = ?').get(eventId);
|
|
if (!event) return res.status(404).json({ error: 'Event not found' });
|
|
|
|
// Get all participants
|
|
const participants = db.prepare('SELECT * FROM participants WHERE event_id = ?').all(eventId);
|
|
|
|
// Get all votes for this event (via participants)
|
|
const votes = db.prepare(`
|
|
SELECT v.participant_id, v.date, v.status
|
|
FROM votes v
|
|
JOIN participants p ON v.participant_id = p.id
|
|
WHERE p.event_id = ?
|
|
`).all(eventId);
|
|
|
|
res.json({
|
|
event,
|
|
participants,
|
|
votes
|
|
});
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Failed to retrieve analytics' });
|
|
}
|
|
});
|
|
|
|
// Admin: Get All Events (password protected)
|
|
router.get('/admin/events', (req, res) => {
|
|
const password = req.headers['x-admin-password'];
|
|
const adminPassword = process.env.ADMIN_PASSWORD || '123456';
|
|
|
|
if (password !== adminPassword) {
|
|
return res.status(401).json({ error: 'Unauthorized' });
|
|
}
|
|
|
|
try {
|
|
const events = db.prepare('SELECT id, name, description, start_date, end_date, created_at FROM events ORDER BY created_at DESC').all();
|
|
res.json({ events });
|
|
} catch (err) {
|
|
console.error(err);
|
|
res.status(500).json({ error: 'Failed to retrieve events' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|