ghostguild-org/server/api/series/index.get.js

91 lines
No EOL
2.6 KiB
JavaScript

import Event from '../../models/event.js'
import { connectDB } from '../../utils/mongoose.js'
export default defineEventHandler(async (event) => {
try {
await connectDB()
const query = getQuery(event)
// Build filter for series events only
const filter = {
'series.isSeriesEvent': true,
isVisible: query.includeHidden === 'true' ? { $exists: true } : true
}
// Filter by series type
if (query.seriesType) {
filter['series.type'] = query.seriesType
}
// Filter for upcoming series
if (query.upcoming === 'true') {
filter.startDate = { $gte: new Date() }
}
// Fetch all series events and group them by series.id
const events = await Event.find(filter)
.sort({ 'series.id': 1, 'series.position': 1, startDate: 1 })
.select('-registrations')
.lean()
// Group events by series ID
const seriesMap = new Map()
events.forEach(event => {
const seriesId = event.series?.id
if (!seriesId) return
if (!seriesMap.has(seriesId)) {
seriesMap.set(seriesId, {
id: seriesId,
title: event.series.title,
description: event.series.description,
type: event.series.type,
totalEvents: event.series.totalEvents,
events: [],
firstEventDate: event.startDate,
lastEventDate: event.endDate
})
}
const series = seriesMap.get(seriesId)
series.events.push({
...event,
id: event._id.toString()
})
// Update date range
if (event.startDate < series.firstEventDate) {
series.firstEventDate = event.startDate
}
if (event.endDate > series.lastEventDate) {
series.lastEventDate = event.endDate
}
})
// Convert to array and add computed fields
const seriesArray = Array.from(seriesMap.values()).map(series => {
const now = new Date()
return {
...series,
eventCount: series.events.length,
startDate: series.firstEventDate,
endDate: series.lastEventDate,
isOngoing: series.firstEventDate <= now && series.lastEventDate >= now,
isUpcoming: series.firstEventDate > now,
isCompleted: series.lastEventDate < now,
status: series.lastEventDate < now ? 'completed' :
series.firstEventDate <= now && series.lastEventDate >= now ? 'active' : 'upcoming'
}
})
return seriesArray
} catch (error) {
console.error('Error fetching event series:', error)
throw createError({
statusCode: 500,
statusMessage: 'Failed to fetch event series'
})
}
})