Spaces:
Sleeping
Sleeping
| import { Request, Response, NextFunction } from 'express'; | |
| import { canAccessTrip, isOwner } from '../db/database'; | |
| import { AuthRequest } from '../types'; | |
| /** Middleware: verifies the authenticated user is an owner or member of the trip, then attaches trip to req. */ | |
| function requireTripAccess(req: Request, res: Response, next: NextFunction): void { | |
| const authReq = req as AuthRequest; | |
| const tripId = req.params.tripId || req.params.id; | |
| if (!tripId) { | |
| res.status(400).json({ error: 'Trip ID required' }); | |
| return; | |
| } | |
| const trip = canAccessTrip(Number(tripId), authReq.user.id); | |
| if (!trip) { | |
| res.status(404).json({ error: 'Trip not found' }); | |
| return; | |
| } | |
| authReq.trip = trip; | |
| next(); | |
| } | |
| /** Middleware: verifies the authenticated user is the trip owner (not just a member). */ | |
| function requireTripOwner(req: Request, res: Response, next: NextFunction): void { | |
| const authReq = req as AuthRequest; | |
| const tripId = req.params.tripId || req.params.id; | |
| if (!tripId) { | |
| res.status(400).json({ error: 'Trip ID required' }); | |
| return; | |
| } | |
| if (!isOwner(Number(tripId), authReq.user.id)) { | |
| res.status(403).json({ error: 'Only the trip owner can do this' }); | |
| return; | |
| } | |
| next(); | |
| } | |
| export { requireTripAccess, requireTripOwner }; | |