feat(events): add tag-based event recommendations API
This commit is contained in:
parent
3797ff7925
commit
fcbad24f3e
3 changed files with 233 additions and 0 deletions
34
server/api/events/recommended.get.js
Normal file
34
server/api/events/recommended.get.js
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
import Event from '../../models/event.js'
|
||||
import { connectDB } from '../../utils/mongoose.js'
|
||||
import { requireAuth } from '../../utils/auth.js'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const member = await requireAuth(event)
|
||||
|
||||
// Combine craft tags and cooperative ecology tags
|
||||
const craftTags = member.craftTags || []
|
||||
const ecologyTags = (member.communityEcology?.topics || []).map(t => t.tagSlug)
|
||||
const memberTags = [...new Set([...craftTags, ...ecologyTags].filter(Boolean))]
|
||||
|
||||
if (!memberTags.length) {
|
||||
return []
|
||||
}
|
||||
|
||||
await connectDB()
|
||||
|
||||
const query = getQuery(event)
|
||||
const limit = Math.min(Math.max(parseInt(query.limit) || 10, 1), 25)
|
||||
|
||||
const events = await Event.find({
|
||||
tags: { $in: memberTags },
|
||||
startDate: { $gt: new Date() },
|
||||
isCancelled: { $ne: true },
|
||||
isVisible: true
|
||||
})
|
||||
.sort({ startDate: 1 })
|
||||
.limit(limit)
|
||||
.select('title slug startDate endDate tagline tags eventType isOnline')
|
||||
.lean()
|
||||
|
||||
return events
|
||||
})
|
||||
|
|
@ -182,6 +182,7 @@ const eventSchema = new mongoose.Schema({
|
|||
refundAmount: Number,
|
||||
},
|
||||
],
|
||||
tags: [String],
|
||||
createdBy: { type: String, required: true },
|
||||
createdAt: { type: Date, default: Date.now },
|
||||
updatedAt: { type: Date, default: Date.now },
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue