import Event from "../../models/event.js"; import { connectDB } from "../../utils/mongoose.js"; import { getOptionalMember } from "../../utils/auth.js"; import { hasMemberAccess } from "../../utils/tickets.js"; export default defineEventHandler(async (event) => { try { // Ensure database connection await connectDB(); // Get query parameters for filtering const query = getQuery(event); const filter = {}; // Only show visible events on public calendar (unless specifically requested) if (query.includeHidden !== "true") { filter.isVisible = true; } // Filter for upcoming events only if requested if (query.upcoming === "true") { filter.startDate = { $gte: new Date() }; } // Filter by event type if provided if (query.eventType) { filter.eventType = query.eventType; } // Hide members-only events from non-members. Admins and members see them. const requester = await getOptionalMember(event); const canSeeMembersOnly = requester?.role === "admin" || hasMemberAccess(requester); if (!canSeeMembersOnly) { filter.membersOnly = { $ne: true }; } // Fetch events from database const events = await Event.find(filter).sort({ startDate: 1 }).lean(); const requesterEmail = requester?.email?.toLowerCase(); const requesterId = requester?._id?.toString(); // Add computed fields; strip registrations from the response. const eventsWithMeta = events.map((event) => { const regs = event.registrations || []; const isRegistered = !!requester && regs.some( (r) => !r.cancelledAt && ((r.memberId && r.memberId.toString() === requesterId) || (r.email && r.email.toLowerCase() === requesterEmail)), ); const { registrations, ...rest } = event; return { ...rest, id: event._id.toString(), registeredCount: regs.length, isRegistered, }; }); return eventsWithMeta; } catch (error) { console.error("Error fetching events:", error); throw createError({ statusCode: 500, statusMessage: "Failed to fetch events", }); } });