diff --git a/shatter-backend/src/controllers/event_controller.ts b/shatter-backend/src/controllers/event_controller.ts index aa54532..9d1468b 100644 --- a/shatter-backend/src/controllers/event_controller.ts +++ b/shatter-backend/src/controllers/event_controller.ts @@ -290,3 +290,41 @@ export async function joinEventAsGuest(req: Request, res: Response) { return res.status(500).json({ success: false, msg: "Internal error" }); } } + +/** + * GET /api/events/:eventId + * Get event details by event ID + * + * @param req.params.eventId - Event ID (required) + * + * @returns 200 with event details on success + * @returns 400 if eventId is missing + * @returns 404 if event is not found + */ +export async function getEventById(req: Request, res: Response) { + try { + const { eventId } = req.params; + + if (!eventId) { + return res + .status(400) + .json({ success: false, error: "eventId is required" }); + } + + const event = await Event.findById(eventId).populate( + "participantIds", + "name userId", + ); + + if (!event) { + return res.status(404).json({ success: false, error: "Event not found" }); + } + + res.status(200).json({ + success: true, + event, + }); + } catch (err: any) { + res.status(500).json({ success: false, error: err.message }); + } +} diff --git a/shatter-backend/src/controllers/user_controller.ts b/shatter-backend/src/controllers/user_controller.ts index 877b53a..e33c0d0 100644 --- a/shatter-backend/src/controllers/user_controller.ts +++ b/shatter-backend/src/controllers/user_controller.ts @@ -39,3 +39,52 @@ export const createUser = async (req: Request, res: Response) => { res.status(500).json({ error: "Failed to create user" }); } }; + +// controller: GET /api/users/:userId +// Get a specific user by ID +export const getUserById = async (req: Request, res: Response) => { + try { + const { userId } = req.params; + + if (!userId) { + return res.status(400).json({ success: false, error: "userId is required" }); + } + + const user = await User.findById(userId).select("-passwordHash"); + + if (!user) { + return res.status(404).json({ success: false, error: "User not found" }); + } + + res.status(200).json({ success: true, user }); + } catch (err: any) { + res.status(500).json({ success: false, error: err.message }); + } +}; + +// controller: GET /api/users/:userId/events +// Get all events that a user has joined +export const getUserEvents = async (req: Request, res: Response) => { + try { + const { userId } = req.params; + + if (!userId) { + return res.status(400).json({ success: false, error: "userId is required" }); + } + + const user = await User.findById(userId) + .populate("eventHistoryIds", "name description joinCode startDate endDate currentState") + .select("eventHistoryIds"); + + if (!user) { + return res.status(404).json({ success: false, error: "User not found" }); + } + + res.status(200).json({ + success: true, + events: user.eventHistoryIds, + }); + } catch (err: any) { + res.status(500).json({ success: false, error: err.message }); + } +}; diff --git a/shatter-backend/src/routes/event_routes.ts b/shatter-backend/src/routes/event_routes.ts index bc5fa58..761a120 100644 --- a/shatter-backend/src/routes/event_routes.ts +++ b/shatter-backend/src/routes/event_routes.ts @@ -1,5 +1,5 @@ import { Router } from 'express'; -import { createEvent, getEventByJoinCode, joinEventAsUser, joinEventAsGuest } from '../controllers/event_controller'; +import { createEvent, getEventByJoinCode, getEventById, joinEventAsUser, joinEventAsGuest } from '../controllers/event_controller'; import { authMiddleware } from '../middleware/auth_middleware'; const router = Router(); @@ -7,6 +7,7 @@ const router = Router(); router.post("/createEvent", authMiddleware, createEvent); router.get("/event/:joinCode", getEventByJoinCode); +router.get("/:eventId", getEventById); router.post("/:eventId/join/user", authMiddleware, joinEventAsUser); router.post("/:eventId/join/guest", joinEventAsGuest); diff --git a/shatter-backend/src/routes/user_route.ts b/shatter-backend/src/routes/user_route.ts index a3d9720..d8df3e2 100644 --- a/shatter-backend/src/routes/user_route.ts +++ b/shatter-backend/src/routes/user_route.ts @@ -1,5 +1,5 @@ import { Router, Request, Response } from 'express'; -import { getUsers, createUser } from '../controllers/user_controller'; +import { getUsers, createUser, getUserById, getUserEvents } from '../controllers/user_controller'; import { authMiddleware } from '../middleware/auth_middleware'; import { User } from '../models/user_model'; @@ -22,4 +22,10 @@ router.get('/me', authMiddleware, async (req: Request, res: Response) => { } }); +// Get all events a user has joined - must come before /:userId to avoid route conflict +router.get('/:userId/events', authMiddleware, getUserEvents); + +// Get user by ID +router.get('/:userId', authMiddleware, getUserById); + export default router;