91 lines
No EOL
2.6 KiB
JavaScript
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'
|
|
})
|
|
}
|
|
}) |