// server/api/members/create.post.js import Member from '../../models/member.js' import { connectDB } from '../../utils/mongoose.js' import { getSlackService } from '../../utils/slack.ts' // Simple payment check function to avoid import issues const requiresPayment = (contributionValue) => contributionValue !== '0' // Function to invite member to Slack async function inviteToSlack(member) { try { const slackService = getSlackService() if (!slackService) { console.warn('Slack service not configured, skipping invitation') return } console.log(`Processing Slack invitation for ${member.email}...`) const inviteResult = await slackService.inviteUserToSlack( member.email, member.name ) if (inviteResult.success) { // Update member record based on the actual result if (inviteResult.status === 'existing_user_added_to_channel' || inviteResult.status === 'user_already_in_channel' || inviteResult.status === 'new_user_invited_to_workspace') { member.slackInviteStatus = 'sent' member.slackUserId = inviteResult.userId member.slackInvited = true } else { // Manual invitation required member.slackInviteStatus = 'pending' member.slackInvited = false } await member.save() // Send notification to vetting channel await slackService.notifyNewMember( member.name, member.email, member.circle, member.contributionTier, inviteResult.status ) console.log(`Successfully processed Slack invitation for ${member.email}: ${inviteResult.status}`) } else { // Update member record to reflect failed invitation member.slackInviteStatus = 'failed' await member.save() console.error(`Failed to process Slack invitation for ${member.email}: ${inviteResult.error}`) // Don't throw error - member creation should still succeed } } catch (error) { console.error('Error during Slack invitation process:', error) // Update member record to reflect failed invitation try { member.slackInviteStatus = 'failed' await member.save() } catch (saveError) { console.error('Failed to update member Slack status:', saveError) } // Don't throw error - member creation should still succeed } } export default defineEventHandler(async (event) => { // Ensure database is connected await connectDB() const body = await readBody(event) try { // 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' }) } const member = new Member(body) await member.save() // Send Slack invitation for new members await inviteToSlack(member) // TODO: Process payment with Helcim if not free tier if (requiresPayment(body.contributionTier)) { // Payment processing will be added here console.log('Payment processing needed for tier:', body.contributionTier) } // TODO: Send welcome email console.log('Welcome email should be sent to:', body.email) return { success: true, member } } catch (error) { if (error.statusCode) { throw error } throw createError({ statusCode: 400, statusMessage: error.message }) } })