108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
// Get existing or create new Helcim customer (for upgrading members)
|
|
import Member from '../../models/member.js'
|
|
import { requireAuth } from '../../utils/auth.js'
|
|
import {
|
|
getHelcimCustomer,
|
|
findHelcimCustomerByEmail,
|
|
createHelcimCustomer
|
|
} from '../../utils/helcim.js'
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
try {
|
|
const member = await requireAuth(event)
|
|
|
|
// 1. Short-circuit: member already has a Helcim customer ID on file.
|
|
// Verify it still resolves before falling through — otherwise we'd
|
|
// silently orphan the old customer and create a duplicate.
|
|
if (member.helcimCustomerId) {
|
|
try {
|
|
const customer = await getHelcimCustomer(member.helcimCustomerId)
|
|
if (customer?.id) {
|
|
if (!member.helcimCustomerCode && customer.customerCode) {
|
|
await Member.findByIdAndUpdate(
|
|
member._id,
|
|
{ $set: { helcimCustomerCode: customer.customerCode } },
|
|
{ runValidators: false }
|
|
)
|
|
}
|
|
return {
|
|
success: true,
|
|
customerId: customer.id,
|
|
customerCode: customer.customerCode,
|
|
existing: true
|
|
}
|
|
}
|
|
} catch (err) {
|
|
// Only fall through on 404 (customer was deleted in Helcim).
|
|
// Any other error must propagate — silently recreating was the
|
|
// original duplicate-customer bug.
|
|
if (err?.statusCode !== 404) throw err
|
|
}
|
|
}
|
|
|
|
// 2. Fall back to search by email (case-insensitive match).
|
|
let existingCustomer = null
|
|
try {
|
|
const searchData = await findHelcimCustomerByEmail(member.email)
|
|
const memberEmail = member.email.toLowerCase()
|
|
if (searchData.customers?.length) {
|
|
existingCustomer = searchData.customers.find(
|
|
c => c.email?.toLowerCase() === memberEmail
|
|
) || null
|
|
}
|
|
} catch (searchError) {
|
|
console.error('Error searching for customer:', searchError)
|
|
// Fall through to create
|
|
}
|
|
|
|
if (existingCustomer) {
|
|
if (!member.helcimCustomerId || !member.helcimCustomerCode) {
|
|
await Member.findByIdAndUpdate(
|
|
member._id,
|
|
{ $set: {
|
|
helcimCustomerId: existingCustomer.id,
|
|
helcimCustomerCode: existingCustomer.customerCode
|
|
} },
|
|
{ runValidators: false }
|
|
)
|
|
}
|
|
return {
|
|
success: true,
|
|
customerId: existingCustomer.id,
|
|
customerCode: existingCustomer.customerCode,
|
|
existing: true
|
|
}
|
|
}
|
|
|
|
// 3. No match anywhere — create a fresh customer.
|
|
const customerData = await createHelcimCustomer({
|
|
contactName: member.name,
|
|
businessName: member.name,
|
|
email: member.email
|
|
})
|
|
|
|
await Member.findByIdAndUpdate(
|
|
member._id,
|
|
{ $set: {
|
|
helcimCustomerId: customerData.id,
|
|
helcimCustomerCode: customerData.customerCode
|
|
} },
|
|
{ runValidators: false }
|
|
)
|
|
|
|
return {
|
|
success: true,
|
|
customerId: customerData.id,
|
|
customerCode: customerData.customerCode,
|
|
existing: false
|
|
}
|
|
|
|
} catch (error) {
|
|
if (error.statusCode) throw error
|
|
console.error('Error in get-or-create-customer:', error)
|
|
throw createError({
|
|
statusCode: 500,
|
|
statusMessage: 'An unexpected error occurred'
|
|
})
|
|
}
|
|
})
|