Add unique member ID generation to registration process
Build And Push Image / docker (push) Successful in 3m25s Details

- Generate and store unique member IDs during user registration
- Update email templates to include formatted member ID and registration date
- Add member_id field mapping in NocoDB utility functions
- Enhance email service with better logging and template data handling
This commit is contained in:
Matt 2025-08-11 16:05:24 +02:00
parent f1a462094a
commit f4044c4477
3 changed files with 28 additions and 5 deletions

View File

@ -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
}
};

View File

@ -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<void> {
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,

View File

@ -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<string, any> => {
'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<Member>): Promise<Member> => {
"membership_status",
"address",
"member_since",
"member_id",
"keycloak_id"
];