81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
// Create a Helcim customer
|
|
import jwt from 'jsonwebtoken'
|
|
import Member from '../../models/member.js'
|
|
import { connectDB } from '../../utils/mongoose.js'
|
|
import { createHelcimCustomer } from '../../utils/helcim.js'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
await connectDB()
|
|
const config = useRuntimeConfig(event)
|
|
const body = await validateBody(event, helcimCustomerSchema)
|
|
|
|
// Check if member already exists
|
|
const existingMember = await Member.findOne({ email: body.email })
|
|
if (existingMember) {
|
|
throw createError({
|
|
statusCode: 409,
|
|
statusMessage: 'A member with this email already exists'
|
|
})
|
|
}
|
|
|
|
// Create customer in Helcim
|
|
const customerData = await createHelcimCustomer({
|
|
customerType: 'PERSON',
|
|
contactName: body.name,
|
|
email: body.email
|
|
})
|
|
|
|
// Create member in database
|
|
const member = await Member.create({
|
|
email: body.email,
|
|
name: body.name,
|
|
circle: body.circle,
|
|
contributionTier: body.contributionTier,
|
|
helcimCustomerId: customerData.id,
|
|
status: 'pending_payment'
|
|
})
|
|
|
|
// Generate JWT token for the session
|
|
const token = jwt.sign(
|
|
{
|
|
memberId: member._id,
|
|
email: body.email,
|
|
helcimCustomerId: customerData.id
|
|
},
|
|
config.jwtSecret,
|
|
{ expiresIn: '7d' }
|
|
)
|
|
|
|
// Set the session cookie server-side
|
|
setCookie(event, 'auth-token', token, {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === 'production',
|
|
sameSite: 'lax',
|
|
maxAge: 60 * 60 * 24 * 7, // 7 days (matches verify.get.js and refresh.post.js)
|
|
path: '/',
|
|
domain: undefined // Let browser set domain automatically
|
|
})
|
|
return {
|
|
success: true,
|
|
customerId: customerData.id,
|
|
customerCode: customerData.customerCode,
|
|
token,
|
|
member: {
|
|
id: member._id,
|
|
email: member.email,
|
|
name: member.name,
|
|
circle: member.circle,
|
|
contributionTier: member.contributionTier,
|
|
status: member.status
|
|
}
|
|
}
|
|
} catch (error) {
|
|
if (error.statusCode) throw error
|
|
console.error('Error creating Helcim customer:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: 'An unexpected error occurred'
|
|
})
|
|
}
|
|
})
|