Initial fullstack scaffold: Events, Guests, Budget, Bookings
- Express backend with PostgreSQL (JWT auth, full CRUD) - React + Vite + TailwindCSS frontend in Hebrew (RTL) - Features: Digital Booking System, Guest Management, Smart Budget Management - Docker Compose with postgres healthcheck - Auto-runs migrations on startup Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
103
routes/events.js
Normal file
103
routes/events.js
Normal file
@@ -0,0 +1,103 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const pool = require('../db');
|
||||
const { authMiddleware } = require('./auth');
|
||||
|
||||
// Get all events for user
|
||||
router.get('/', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const result = await pool.query(
|
||||
'SELECT * FROM events WHERE user_id = $1 ORDER BY date ASC',
|
||||
[req.userId]
|
||||
);
|
||||
res.json(result.rows);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Get single event
|
||||
router.get('/:id', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const result = await pool.query(
|
||||
'SELECT * FROM events WHERE id = $1 AND user_id = $2',
|
||||
[req.params.id, req.userId]
|
||||
);
|
||||
if (result.rows.length === 0) return res.status(404).json({ error: 'Event not found' });
|
||||
res.json(result.rows[0]);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Create event
|
||||
router.post('/', authMiddleware, async (req, res) => {
|
||||
const { name, date, location, event_type, budget, notes } = req.body;
|
||||
if (!name || !date) return res.status(400).json({ error: 'Name and date are required' });
|
||||
try {
|
||||
const result = await pool.query(
|
||||
`INSERT INTO events (user_id, name, date, location, event_type, budget, notes)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *`,
|
||||
[req.userId, name, date, location, event_type || 'general', budget || 0, notes]
|
||||
);
|
||||
res.status(201).json(result.rows[0]);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Update event
|
||||
router.put('/:id', authMiddleware, async (req, res) => {
|
||||
const { name, date, location, event_type, budget, status, notes } = req.body;
|
||||
try {
|
||||
const result = await pool.query(
|
||||
`UPDATE events SET name=$1, date=$2, location=$3, event_type=$4, budget=$5, status=$6, notes=$7
|
||||
WHERE id=$8 AND user_id=$9 RETURNING *`,
|
||||
[name, date, location, event_type, budget, status, notes, req.params.id, req.userId]
|
||||
);
|
||||
if (result.rows.length === 0) return res.status(404).json({ error: 'Event not found' });
|
||||
res.json(result.rows[0]);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Delete event
|
||||
router.delete('/:id', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const result = await pool.query(
|
||||
'DELETE FROM events WHERE id=$1 AND user_id=$2 RETURNING id',
|
||||
[req.params.id, req.userId]
|
||||
);
|
||||
if (result.rows.length === 0) return res.status(404).json({ error: 'Event not found' });
|
||||
res.json({ message: 'Event deleted' });
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
// Get event stats
|
||||
router.get('/:id/stats', authMiddleware, async (req, res) => {
|
||||
try {
|
||||
const [guestsRes, budgetRes, bookingsRes] = await Promise.all([
|
||||
pool.query('SELECT rsvp_status, COUNT(*) FROM guests WHERE event_id=$1 GROUP BY rsvp_status', [req.params.id]),
|
||||
pool.query('SELECT SUM(estimated_cost) as estimated, SUM(actual_cost) as actual FROM budget_items WHERE event_id=$1', [req.params.id]),
|
||||
pool.query('SELECT SUM(cost) as total_bookings FROM bookings WHERE event_id=$1', [req.params.id]),
|
||||
]);
|
||||
res.json({
|
||||
guests: guestsRes.rows,
|
||||
budget: budgetRes.rows[0],
|
||||
bookings: bookingsRes.rows[0],
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
res.status(500).json({ error: 'Server error' });
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user