Add unique member ID generation to registration process
Build And Push Image / docker (push) Successful in 3m25s
Details
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:
parent
f1a462094a
commit
f4044c4477
|
|
@ -116,7 +116,11 @@ export default defineEventHandler(async (event) => {
|
||||||
membershipData
|
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...');
|
console.log('[api/registration.post] Creating member record...');
|
||||||
const memberData = {
|
const memberData = {
|
||||||
first_name: body.first_name,
|
first_name: body.first_name,
|
||||||
|
|
@ -131,6 +135,7 @@ export default defineEventHandler(async (event) => {
|
||||||
membership_status: 'Active',
|
membership_status: 'Active',
|
||||||
registration_date: new Date().toISOString(),
|
registration_date: new Date().toISOString(),
|
||||||
member_since: new Date().toISOString().split('T')[0], // YYYY-MM-DD format
|
member_since: new Date().toISOString().split('T')[0], // YYYY-MM-DD format
|
||||||
|
member_id: generatedMemberID, // Include the generated member ID
|
||||||
membership_date_paid: '',
|
membership_date_paid: '',
|
||||||
payment_due_date: paymentDueDate.toISOString() // 1 month from registration
|
payment_due_date: paymentDueDate.toISOString() // 1 month from registration
|
||||||
};
|
};
|
||||||
|
|
@ -154,7 +159,12 @@ export default defineEventHandler(async (event) => {
|
||||||
firstName: body.first_name,
|
firstName: body.first_name,
|
||||||
lastName: body.last_name,
|
lastName: body.last_name,
|
||||||
verificationLink,
|
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');
|
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
|
// 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 {
|
return {
|
||||||
success: true,
|
success: true,
|
||||||
message: 'Registration successful! Please check your email to verify your account and set your password.',
|
message: 'Registration successful! Please check your email to verify your account and set your password.',
|
||||||
data: {
|
data: {
|
||||||
memberId: createdMemberId,
|
memberId: member.member_id || `MUSA-${createdMemberId}`, // Return formatted member_id
|
||||||
email: body.email
|
email: body.email
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ export interface WelcomeEmailData {
|
||||||
memberId: string;
|
memberId: string;
|
||||||
registrationDate?: string;
|
registrationDate?: string;
|
||||||
logoUrl?: string;
|
logoUrl?: string;
|
||||||
|
email?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface VerificationEmailData {
|
export interface VerificationEmailData {
|
||||||
|
|
@ -230,15 +231,23 @@ export class EmailService {
|
||||||
async sendWelcomeEmail(to: string, data: WelcomeEmailData): Promise<void> {
|
async sendWelcomeEmail(to: string, data: WelcomeEmailData): Promise<void> {
|
||||||
const template = this.getTemplate('welcome');
|
const template = this.getTemplate('welcome');
|
||||||
if (!template) {
|
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');
|
throw new Error('Welcome email template not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const config = useRuntimeConfig();
|
||||||
const templateData = {
|
const templateData = {
|
||||||
...data,
|
...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);
|
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({
|
await this.sendEmail({
|
||||||
to,
|
to,
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ export const normalizeFieldsFromNocoDB = (data: any): Member => {
|
||||||
'Address': 'address',
|
'Address': 'address',
|
||||||
'Membership Status': 'membership_status',
|
'Membership Status': 'membership_status',
|
||||||
'Member Since': 'member_since',
|
'Member Since': 'member_since',
|
||||||
|
'Member ID': 'member_id', // Added field mapping for member_id
|
||||||
'Current Year Dues Paid': 'current_year_dues_paid',
|
'Current Year Dues Paid': 'current_year_dues_paid',
|
||||||
'Membership Date Paid': 'membership_date_paid',
|
'Membership Date Paid': 'membership_date_paid',
|
||||||
'Payment Due Date': 'payment_due_date',
|
'Payment Due Date': 'payment_due_date',
|
||||||
|
|
@ -132,6 +133,7 @@ export const normalizeFieldsFromNocoDB = (data: any): Member => {
|
||||||
'address': 'address',
|
'address': 'address',
|
||||||
'membership_status': 'membership_status',
|
'membership_status': 'membership_status',
|
||||||
'member_since': 'member_since',
|
'member_since': 'member_since',
|
||||||
|
'member_id': 'member_id',
|
||||||
'current_year_dues_paid': 'current_year_dues_paid',
|
'current_year_dues_paid': 'current_year_dues_paid',
|
||||||
'membership_date_paid': 'membership_date_paid',
|
'membership_date_paid': 'membership_date_paid',
|
||||||
'payment_due_date': 'payment_due_date'
|
'payment_due_date': 'payment_due_date'
|
||||||
|
|
@ -171,6 +173,7 @@ export const normalizeFieldsForNocoDB = (data: any): Record<string, any> => {
|
||||||
'address': 'Address',
|
'address': 'Address',
|
||||||
'membership_status': 'Membership Status',
|
'membership_status': 'Membership Status',
|
||||||
'member_since': 'Member Since',
|
'member_since': 'Member Since',
|
||||||
|
'member_id': 'Member ID', // Added field mapping for member_id
|
||||||
'current_year_dues_paid': 'Current Year Dues Paid',
|
'current_year_dues_paid': 'Current Year Dues Paid',
|
||||||
'membership_date_paid': 'Membership Date Paid',
|
'membership_date_paid': 'Membership Date Paid',
|
||||||
'payment_due_date': 'Payment Due Date',
|
'payment_due_date': 'Payment Due Date',
|
||||||
|
|
@ -311,6 +314,7 @@ export const createMember = async (data: Partial<Member>): Promise<Member> => {
|
||||||
"membership_status",
|
"membership_status",
|
||||||
"address",
|
"address",
|
||||||
"member_since",
|
"member_since",
|
||||||
|
"member_id",
|
||||||
"keycloak_id"
|
"keycloak_id"
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue