Add series management and ticketing features: Introduce series event functionality in event creation, enhance event display with series information, and implement ticketing options for public events. Update layouts and improve form handling for better user experience.
This commit is contained in:
parent
c3a29fa47c
commit
a88aa62198
24 changed files with 2897 additions and 44 deletions
136
server/api/events/[id]/payment.post.js
Normal file
136
server/api/events/[id]/payment.post.js
Normal file
|
|
@ -0,0 +1,136 @@
|
|||
import Event from '../../../models/event.js'
|
||||
import Member from '../../../models/member.js'
|
||||
import { connectDB } from '../../../utils/mongoose.js'
|
||||
import { processHelcimPayment } from '../../../utils/helcim.js'
|
||||
import mongoose from 'mongoose'
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
try {
|
||||
await connectDB()
|
||||
const identifier = getRouterParam(event, 'id')
|
||||
const body = await readBody(event)
|
||||
|
||||
if (!identifier) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Event identifier is required'
|
||||
})
|
||||
}
|
||||
|
||||
// Validate required payment fields
|
||||
if (!body.name || !body.email || !body.paymentToken) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'Name, email, and payment token are required'
|
||||
})
|
||||
}
|
||||
|
||||
// Fetch the event
|
||||
let eventData
|
||||
if (mongoose.Types.ObjectId.isValid(identifier)) {
|
||||
eventData = await Event.findById(identifier)
|
||||
}
|
||||
if (!eventData) {
|
||||
eventData = await Event.findOne({ slug: identifier })
|
||||
}
|
||||
|
||||
if (!eventData) {
|
||||
throw createError({
|
||||
statusCode: 404,
|
||||
statusMessage: 'Event not found'
|
||||
})
|
||||
}
|
||||
|
||||
// Check if event requires payment
|
||||
if (eventData.pricing.isFree || !eventData.pricing.paymentRequired) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'This event does not require payment'
|
||||
})
|
||||
}
|
||||
|
||||
// Check if user is already registered
|
||||
const existingRegistration = eventData.registrations.find(
|
||||
reg => reg.email.toLowerCase() === body.email.toLowerCase()
|
||||
)
|
||||
|
||||
if (existingRegistration) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: 'You are already registered for this event'
|
||||
})
|
||||
}
|
||||
|
||||
// Check if user is a member (members get free access)
|
||||
const member = await Member.findOne({ email: body.email.toLowerCase() })
|
||||
|
||||
if (member) {
|
||||
// Members get free access - register directly without payment
|
||||
eventData.registrations.push({
|
||||
name: body.name,
|
||||
email: body.email.toLowerCase(),
|
||||
membershipLevel: `${member.circle}-${member.contributionTier}`,
|
||||
isMember: true,
|
||||
paymentStatus: 'not_required',
|
||||
amountPaid: 0
|
||||
})
|
||||
|
||||
await eventData.save()
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Successfully registered as a member (no payment required)',
|
||||
registration: eventData.registrations[eventData.registrations.length - 1]
|
||||
}
|
||||
}
|
||||
|
||||
// Process payment for non-members
|
||||
const paymentResult = await processHelcimPayment({
|
||||
amount: eventData.pricing.publicPrice,
|
||||
paymentToken: body.paymentToken,
|
||||
customerData: {
|
||||
name: body.name,
|
||||
email: body.email
|
||||
}
|
||||
})
|
||||
|
||||
if (!paymentResult.success) {
|
||||
throw createError({
|
||||
statusCode: 400,
|
||||
statusMessage: paymentResult.message || 'Payment failed'
|
||||
})
|
||||
}
|
||||
|
||||
// Add registration with successful payment
|
||||
eventData.registrations.push({
|
||||
name: body.name,
|
||||
email: body.email.toLowerCase(),
|
||||
membershipLevel: 'non-member',
|
||||
isMember: false,
|
||||
paymentStatus: 'completed',
|
||||
paymentId: paymentResult.transactionId,
|
||||
amountPaid: eventData.pricing.publicPrice
|
||||
})
|
||||
|
||||
await eventData.save()
|
||||
|
||||
return {
|
||||
success: true,
|
||||
message: 'Payment successful and registered for event',
|
||||
paymentId: paymentResult.transactionId,
|
||||
registration: eventData.registrations[eventData.registrations.length - 1]
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error processing event payment:', error)
|
||||
|
||||
if (error.statusCode) {
|
||||
throw error
|
||||
}
|
||||
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: 'Failed to process payment and registration'
|
||||
})
|
||||
}
|
||||
})
|
||||
Loading…
Add table
Add a link
Reference in a new issue