JSFiddle - React, Tailwind, and code Playground
TypeScript
// usage
const emailWelcomeMessage = new EmailWelcomeMessage(
new NodeMailerEmailTransporter(config, nodeMailer),
new WelcomeEmailMessageBuilder()
);
emailWelcomeMessage.setRecipient('milos.zeman@hrad.cz');
emailWelcomeMessage.send();
// definitions
export interface EmailMessageBuilder {
buildTitle(): string;
buildBody(): string;
}
export interface EmailTransporter {
send(email: string, title: string, message: string): Promise<void>;
}
export class EmailWelcomeMessage {
private userEmail: string;
constructor(private transporter: EmailTransporter, private messageBuilder: EmailMessageBuilder) {
}
public async send(): Promise<void> {
await this.transporter.send(
this.userEmail,
this.messageBuilder.buildTitle(this.recipient),
this.messageBuilder.buildBody(this.recipient)
);
}
public setRecipient(email: string): void {
this.userEmail = email;
}
}
export class WelcomeEmailMessageBuilder implements EmailMessageBuilder {
public buildTitle(user: string): string {
return `Welcome!`;
}
public buildBody(user: string): string {
return `<h1>Thx for using this service, it is cool!</h1>`;
}
}
export class NodeMailerEmailTransporter implements EmailTransporter {
private transporter: NodeMailerTransporter;
constructor(private config: EmailConfig, nodeMailer: NodeMailer) {
this.transporter = nodemailer.createTransport({service: 'Gmail', auth: config.smtp.auth});
}
public async send(email: string, title: string, body: string): Promise<void> {
await this.transporter.sendMail({
from: this.config.from,
to: email,
subject: title,
text: body
});
}
}
// @ těžkej kopyvrajting