diff options
| author | Anjana Vakil <contact@anjana.dev> | 2025-08-26 12:40:16 -0500 |
|---|---|---|
| committer | Anjana Vakil <contact@anjana.dev> | 2025-08-26 12:40:16 -0500 |
| commit | 1dc4f56425209d4ce1d7bb78ec8b5e7b5a755a82 (patch) | |
| tree | 58d06cd695ae17302daff7a87d9096f1d39ea54a /backend/src/routes | |
reset
Diffstat (limited to 'backend/src/routes')
| -rw-r--r-- | backend/src/routes/api.js | 12 | ||||
| -rw-r--r-- | backend/src/routes/events.js | 97 | ||||
| -rw-r--r-- | backend/src/routes/users.js | 65 |
3 files changed, 174 insertions, 0 deletions
diff --git a/backend/src/routes/api.js b/backend/src/routes/api.js new file mode 100644 index 0000000..2eb07d1 --- /dev/null +++ b/backend/src/routes/api.js @@ -0,0 +1,12 @@ +import { Router } from 'express'; +import usersRouter from './users.js'; +import eventsRouter from './events.js'; + + +const router = Router(); + +router.use('/users', usersRouter); +router.use('/events', eventsRouter); + + +export default router; diff --git a/backend/src/routes/events.js b/backend/src/routes/events.js new file mode 100644 index 0000000..b95c747 --- /dev/null +++ b/backend/src/routes/events.js @@ -0,0 +1,97 @@ +import db from '../db.js'; +import { Router } from 'express'; +import { getUser } from './users.js'; + +const router = Router(); + +const joinHost = (event) => { + const host = getUser(event.host_id); + return { ...event, host }; +} + +const joinRSVPs = (event) => { + const { id } = event; + const getRSVPs = db.prepare('SELECT * FROM rsvps WHERE event_id = @id'); + const rsvps = getRSVPs.all({ id }); + return { ...event, rsvps }; +} + +const getEvent = (eventId) => { + const byId = db.prepare('SELECT * FROM events WHERE id = @eventId'); + const event = byId.get({ eventId }); + return joinHost(event); +} + +router.get('/', (_req, res) => { + const listEvents = db.prepare(`SELECT * FROM events`); + const events = listEvents.all(); + res.json(events.map(joinHost).map(joinRSVPs)); +}); + +const insertEvent = db.prepare(`INSERT INTO events VALUES (@id, @title, @description, @image_url, @date, @host_id)`); + +router.post('/new', (req, res) => { + const data = req.body; + const { lastInsertRowid: id } = insertEvent.run(data); + const event = getEvent(id); + res.status(201).json(event); +}); + +router.get('/:id', (req, res) => { + const id = parseInt(req.params.id); + const event = getEvent(id); + if (!event) { + return res.status(404).json({ error: 'Event not found' }); + } + res.json(event); +}); + +router.patch('/:id', (req, res) => { + const eventId = parseInt(req.params.id); + const patch = req.body; + + const updateCol = db.prepare(` + UPDATE events SET @col = @val WHERE id = @eventId + `); + const updateEvent = db.transaction((patch) => { + for (const [col, val] of Object.entries(patch)) { + updateCol.run({ col, val, eventId }); + } + }); + + updateEvent(Object.entries(patch)); + const updated = getEvent(eventId); + res.json(updated); +}); + +router.delete('/:id', (req, res) => { + const deleteEvent = db.prepare(`DELETE FROM events WHERE id = @eventId`); + const eventId = parseInt(req.params.id); + const event = getEvent(eventId); + if (!event) { + return res.status(404).json({ error: 'Event not found' }); + } + deleteEvent.run({ eventId }); + res.json(event); +}); + +router.post('/:id/rsvp', (req, res) => { + const eventId = parseInt(req.params.id); + const { name, email } = req.body; + + const getRSVP = db.prepare(`SELECT * FROM rsvps WHERE (event_id = ${eventId} AND email = '${email}')`); + const insertRSVP = db.prepare(`INSERT INTO rsvps VALUES (@eventId, @name, @email)`); + + let [rsvp] = getRSVP.all({ eventId, email }); + if (rsvp) { + // This email has already RSVPed + res.status(200).json({ rsvp }); + } else { + // New RSVP + insertRSVP.run({ name, email, eventId }); + rsvp = getRSVP.run({ eventId, email }); + res.status(201).json({ rsvp }); + } +}); + +export default router; diff --git a/backend/src/routes/users.js b/backend/src/routes/users.js new file mode 100644 index 0000000..6d874e9 --- /dev/null +++ b/backend/src/routes/users.js @@ -0,0 +1,65 @@ +import { Router } from 'express'; +import db from '../db.js'; + +const router = Router(); + +export const getUser = (userId) => { + const byId = db.prepare('SELECT * FROM users WHERE id = @userId'); + return byId.get({ userId }); +} + +router.get('/', (_req, res) => { + const listUsers = db.prepare(`SELECT * FROM users`) + const users = listUsers.all(); + res.json(users); +}); + +router.post('/new', (req, res) => { + const data = req.body; + const cols = Object.keys(data).join(' , '); + const vals = Object.values(data).join(' , '); + const insertUser = db.prepare(`INSERT INTO users(@cols) VALUES (@vals)`); + const { lastInsertRowid: id } = insertUser.run({ cols, vals }); + const user = getUser(id); + res.json(user); +}); + +router.get('/:id', (req, res) => { + const id = req.params.id; + const user = getUser(id); + if (!user) { + res.status(404).json({ error: 'User not found' }); + } + res.json(user); +}); + +router.patch('/:id', (req, res) => { + const userId = req.params.id; + const patch = req.body; + + const updateCol = db.prepare(` + UPDATE users SET @col = @val WHERE id = @userId + `); + const updateUser = db.transaction((patch) => { + for (const [col, val] of Object.entries(patch)) { + updateCol.run(col, val, userId); + }; + }); + + updateUser(Object.entries(patch)); + const updated = getUser(userId); + res.json(updated); +}); + +router.delete('/:id', (req, res) => { + const deleteUser = db.prepare(`DELETE FROM users WHERE id = @userId`) + const userId = parseInt(req.params.id); + const user = getUser(userId); + if (!user) { + res.status(404).json({ error: 'User not found' }); + } + deleteUser.run({ userId }); + res.json(user); +}); + +export default router; |
