diff --git a/server/api/registration.post.ts b/server/api/registration.post.ts index 70cf32b..aed6350 100644 --- a/server/api/registration.post.ts +++ b/server/api/registration.post.ts @@ -116,7 +116,11 @@ export default defineEventHandler(async (event) => { membershipData }); - // 6. Create member record + // 6. Generate unique member ID and create member record + console.log('[api/registration.post] Generating unique member ID...'); + const { generateMemberID } = await import('~/server/utils/member-id'); + const generatedMemberID = await generateMemberID(); + console.log('[api/registration.post] Creating member record...'); const memberData = { first_name: body.first_name, @@ -131,6 +135,7 @@ export default defineEventHandler(async (event) => { membership_status: 'Active', registration_date: new Date().toISOString(), member_since: new Date().toISOString().split('T')[0], // YYYY-MM-DD format + member_id: generatedMemberID, // Include the generated member ID membership_date_paid: '', payment_due_date: paymentDueDate.toISOString() // 1 month from registration }; @@ -154,7 +159,12 @@ export default defineEventHandler(async (event) => { firstName: body.first_name, lastName: body.last_name, verificationLink, - memberId: createdMemberId + memberId: member.member_id || `MUSA-${createdMemberId}`, // Use formatted member_id + registrationDate: new Date().toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }) }); console.log('[api/registration.post] Welcome email sent successfully'); @@ -163,13 +173,13 @@ export default defineEventHandler(async (event) => { // Don't fail the registration if email fails - user can resend verification email later } - console.log(`[api/registration.post] ✅ Registration successful - Member ID: ${createdMemberId}, Keycloak ID: ${createdKeycloakId}`); + console.log(`[api/registration.post] ✅ Registration successful - Member ID: ${member.member_id || `MUSA-${createdMemberId}`}, Keycloak ID: ${createdKeycloakId}`); return { success: true, message: 'Registration successful! Please check your email to verify your account and set your password.', data: { - memberId: createdMemberId, + memberId: member.member_id || `MUSA-${createdMemberId}`, // Return formatted member_id email: body.email } }; diff --git a/server/utils/email.ts b/server/utils/email.ts index 9c3de31..509e8ca 100644 --- a/server/utils/email.ts +++ b/server/utils/email.ts @@ -23,6 +23,7 @@ export interface WelcomeEmailData { memberId: string; registrationDate?: string; logoUrl?: string; + email?: string; } export interface VerificationEmailData { @@ -230,15 +231,23 @@ export class EmailService { async sendWelcomeEmail(to: string, data: WelcomeEmailData): Promise { const template = this.getTemplate('welcome'); if (!template) { + console.error('[EmailService] ❌ Welcome email template not found! Available templates:', Array.from(this.templates.keys())); throw new Error('Welcome email template not found'); } + const config = useRuntimeConfig(); const templateData = { ...data, - logoUrl: data.logoUrl || `${useRuntimeConfig().public.domain}/MONACOUSA-Flags_376x376.png` + logoUrl: data.logoUrl || `${config.public.domain}/MONACOUSA-Flags_376x376.png`, + baseUrl: config.public.domain || 'https://portal.monacousa.org', + email: data.email || to }; + console.log('[EmailService] Template data:', templateData); + const html = template(templateData); + console.log('[EmailService] Generated HTML length:', html.length); + console.log('[EmailService] HTML preview (first 200 chars):', html.substring(0, 200)); await this.sendEmail({ to, diff --git a/server/utils/nocodb.ts b/server/utils/nocodb.ts index 2bd86ed..2b6d096 100644 --- a/server/utils/nocodb.ts +++ b/server/utils/nocodb.ts @@ -117,6 +117,7 @@ export const normalizeFieldsFromNocoDB = (data: any): Member => { 'Address': 'address', 'Membership Status': 'membership_status', 'Member Since': 'member_since', + 'Member ID': 'member_id', // Added field mapping for member_id 'Current Year Dues Paid': 'current_year_dues_paid', 'Membership Date Paid': 'membership_date_paid', 'Payment Due Date': 'payment_due_date', @@ -132,6 +133,7 @@ export const normalizeFieldsFromNocoDB = (data: any): Member => { 'address': 'address', 'membership_status': 'membership_status', 'member_since': 'member_since', + 'member_id': 'member_id', 'current_year_dues_paid': 'current_year_dues_paid', 'membership_date_paid': 'membership_date_paid', 'payment_due_date': 'payment_due_date' @@ -171,6 +173,7 @@ export const normalizeFieldsForNocoDB = (data: any): Record => { 'address': 'Address', 'membership_status': 'Membership Status', 'member_since': 'Member Since', + 'member_id': 'Member ID', // Added field mapping for member_id 'current_year_dues_paid': 'Current Year Dues Paid', 'membership_date_paid': 'Membership Date Paid', 'payment_due_date': 'Payment Due Date', @@ -311,6 +314,7 @@ export const createMember = async (data: Partial): Promise => { "membership_status", "address", "member_since", + "member_id", "keycloak_id" ];