import { loadPublicEvent } from '../../utils/loadEvent.js' import { getOptionalMember } from '../../utils/auth.js' import { hasMemberAccess } from '../../utils/tickets.js' export default defineEventHandler(async (event) => { try { const identifier = getRouterParam(event, 'id') const eventData = await loadPublicEvent(event, identifier, { lean: true, select: '-registrations.email' }) // Members-only events are hidden from non-members (parallel to isVisible). // Registration/ticket endpoints still surface a "members only" error so an // authenticated guest sees actionable copy when posting; here we just 404. if (eventData.membersOnly) { const requester = await getOptionalMember(event) const canSee = requester?.role === 'admin' || hasMemberAccess(requester) if (!canSee) { throw createError({ statusCode: 404, statusMessage: 'Event not found' }) } } return { ...eventData, id: eventData._id.toString(), registeredCount: eventData.registrations?.length || 0, isFull: eventData.maxAttendees ? (eventData.registrations?.length || 0) >= eventData.maxAttendees : false } } catch (error) { if (error.statusCode) { throw error } console.error('Error fetching event:', error) throw createError({ statusCode: 500, statusMessage: 'Failed to fetch event' }) } })