ghostguild-org/server/api/events/[id].get.js

65 lines
No EOL
1.7 KiB
JavaScript

import Event from '../../models/event.js'
import { connectDB } from '../../utils/mongoose.js'
import mongoose from 'mongoose'
export default defineEventHandler(async (event) => {
try {
// Ensure database connection
await connectDB()
const identifier = getRouterParam(event, 'id')
if (!identifier) {
throw createError({
statusCode: 400,
statusMessage: 'Event identifier is required'
})
}
// Fetch event from database - try by slug first, then by ID
let eventData
// Check if identifier is a valid MongoDB ObjectId
if (mongoose.Types.ObjectId.isValid(identifier)) {
eventData = await Event.findById(identifier)
.select('-registrations.email') // Hide emails for privacy
.lean()
}
// If not found by ID or not a valid ObjectId, try by slug
if (!eventData) {
eventData = await Event.findOne({ slug: identifier })
.select('-registrations.email') // Hide emails for privacy
.lean()
}
if (!eventData) {
throw createError({
statusCode: 404,
statusMessage: 'Event not found'
})
}
// Add computed fields
const eventWithMeta = {
...eventData,
id: eventData._id.toString(),
registeredCount: eventData.registrations?.length || 0,
isFull: eventData.maxAttendees ?
(eventData.registrations?.length || 0) >= eventData.maxAttendees :
false
}
return eventWithMeta
} catch (error) {
console.error('Error fetching event:', error)
if (error.statusCode) {
throw error
}
throw createError({
statusCode: 500,
statusMessage: 'Failed to fetch event'
})
}
})