feat: role-aware welcome email (USER vs Professional/AGENT variants)
This commit is contained in:
@@ -708,10 +708,11 @@ export class AuthService {
|
|||||||
const profile =
|
const profile =
|
||||||
user.role === UserRole.AGENT ? user.agentProfile : user.userProfile;
|
user.role === UserRole.AGENT ? user.agentProfile : user.userProfile;
|
||||||
|
|
||||||
// Emit event for welcome email
|
// Emit event for welcome email (role-aware template selection)
|
||||||
this.eventEmitter.emit('user.email-verified', {
|
this.eventEmitter.emit('user.email-verified', {
|
||||||
email: user.email,
|
email: user.email,
|
||||||
name: profile?.firstName,
|
name: profile?.firstName,
|
||||||
|
role: user.role,
|
||||||
});
|
});
|
||||||
|
|
||||||
this.audit.log({
|
this.audit.log({
|
||||||
|
|||||||
@@ -88,12 +88,12 @@ export class EmailListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@OnEvent('user.email-verified')
|
@OnEvent('user.email-verified')
|
||||||
async handleEmailVerified(payload: { email: string; name?: string }) {
|
async handleEmailVerified(payload: { email: string; name?: string; role?: string }) {
|
||||||
this.logger.log(`Email verified for: ${payload.email}`);
|
this.logger.log(`Email verified for: ${payload.email}`);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Send welcome email after verification
|
// Send welcome email after verification (role-aware: USER vs AGENT)
|
||||||
await this.emailService.sendWelcomeEmail(payload.email, payload.name);
|
await this.emailService.sendWelcomeEmail(payload.email, payload.name, payload.role);
|
||||||
this.logger.log(`Welcome email sent to: ${payload.email}`);
|
this.logger.log(`Welcome email sent to: ${payload.email}`);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.logger.error(`Failed to send welcome email to ${payload.email}:`, error);
|
this.logger.error(`Failed to send welcome email to ${payload.email}:`, error);
|
||||||
|
|||||||
@@ -101,10 +101,13 @@ export class EmailService {
|
|||||||
// ==========================================
|
// ==========================================
|
||||||
// WELCOME EMAIL
|
// WELCOME EMAIL
|
||||||
// ==========================================
|
// ==========================================
|
||||||
async sendWelcomeEmail(email: string, name?: string): Promise<boolean> {
|
async sendWelcomeEmail(email: string, name?: string, role?: 'USER' | 'AGENT' | string): Promise<boolean> {
|
||||||
const frontendUrl = this.configService.get<string>('FRONTEND_URL') || 'http://localhost:3000';
|
const frontendUrl = this.configService.get<string>('FRONTEND_URL') || 'http://localhost:3000';
|
||||||
const html = getWelcomeEmailTemplate({ name, frontendUrl });
|
const html = getWelcomeEmailTemplate({ name, frontendUrl, role });
|
||||||
const text = `Welcome to RE-Quest, ${name || 'User'}! Your real estate journey starts now.`;
|
const isAgent = role === 'AGENT';
|
||||||
|
const text = isAgent
|
||||||
|
? `Welcome to RE-Quest, ${name || 'there'}! Complete your profile and upload your license, E&O insurance, and certifications to start receiving leads.`
|
||||||
|
: `Welcome to RE-Quest, ${name || 'there'}! Explore and connect with top real estate professionals.`;
|
||||||
|
|
||||||
return this.sendEmail({
|
return this.sendEmail({
|
||||||
to: email,
|
to: email,
|
||||||
|
|||||||
@@ -2,30 +2,48 @@ import { getBaseTemplate } from './base.template';
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Welcome email template
|
* Welcome email template
|
||||||
* Sent after email verification is complete
|
* Sent after email verification is complete.
|
||||||
|
*
|
||||||
|
* Two variants:
|
||||||
|
* - USER → simple welcome + "Start Exploring" CTA
|
||||||
|
* - AGENT → "Professional" onboarding checklist + "Complete Profile" CTA
|
||||||
*/
|
*/
|
||||||
export interface WelcomeTemplateData {
|
export interface WelcomeTemplateData {
|
||||||
name?: string;
|
name?: string;
|
||||||
frontendUrl?: string;
|
frontendUrl?: string;
|
||||||
|
role?: 'USER' | 'AGENT' | string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getWelcomeEmailTemplate(data: WelcomeTemplateData): string {
|
export function getWelcomeEmailTemplate(data: WelcomeTemplateData): string {
|
||||||
const { name, frontendUrl } = data;
|
const { name, frontendUrl, role } = data;
|
||||||
const logoUrl = frontendUrl ? `${frontendUrl}/assets/images/splash-logo.png` : undefined;
|
const logoUrl = frontendUrl ? `${frontendUrl}/assets/images/splash-logo.png` : undefined;
|
||||||
|
const greetingName = name || 'there';
|
||||||
|
const isAgent = role === 'AGENT';
|
||||||
|
|
||||||
const content = `
|
const content = isAgent
|
||||||
|
? `
|
||||||
<h1>Welcome to RE-Quest!</h1>
|
<h1>Welcome to RE-Quest!</h1>
|
||||||
<p>Hi ${name || 'there'},</p>
|
<p>Hi ${greetingName},</p>
|
||||||
<p>We're thrilled to have you join RE-Quest - your trusted real estate platform!</p>
|
<p>We're thrilled to have you join RE-Quest — your trusted real estate platform.</p>
|
||||||
<p>Here's what you can do:</p>
|
<p>Your next steps:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Browse thousands of property listings</li>
|
<li>Complete your profile</li>
|
||||||
<li>Connect with top real estate agents</li>
|
<li>Upload your license, E&O insurance, and certifications for verification</li>
|
||||||
<li>Save your favorite properties</li>
|
<li>Activate your subscription</li>
|
||||||
<li>Get personalized recommendations</li>
|
<li>and let your leads chase you</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="button-container">
|
<div class="button-container">
|
||||||
<a href="${frontendUrl || '#'}" class="button">Start Exploring</a>
|
<a href="${frontendUrl ? `${frontendUrl}/agent/edit` : '#'}" class="button">Complete Profile</a>
|
||||||
|
</div>
|
||||||
|
<p>If you have any questions, our support team is always here to help!</p>
|
||||||
|
`
|
||||||
|
: `
|
||||||
|
<h1>Welcome to RE-Quest!</h1>
|
||||||
|
<p>Hi ${greetingName},</p>
|
||||||
|
<p>We're thrilled to have you join RE-Quest — your trusted real estate platform.</p>
|
||||||
|
<p>From here you can explore and connect with top real estate professionals and begin your real estate journey!</p>
|
||||||
|
<div class="button-container">
|
||||||
|
<a href="${frontendUrl ? `${frontendUrl}/user/profiles` : '#'}" class="button">Start Exploring</a>
|
||||||
</div>
|
</div>
|
||||||
<p>If you have any questions, our support team is always here to help!</p>
|
<p>If you have any questions, our support team is always here to help!</p>
|
||||||
`;
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user