Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions src/utils/Email.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,3 +173,35 @@ export class Email {
});
}
}

export class EmailUtils {
public static getSubject(_type: "register" | "reset" | "bind", language?: string): string {
if (language && language.startsWith("zh")) {
return "Flat 验证码";
} else {
return "Flat Verification Code";
}
}

public static getMessage(
type: "register" | "reset" | "bind",
email: string,
code: string,
language?: string,
): string {
const name = email.split("@")[0];
if (language && language.startsWith("zh")) {
if (type === "register") {
return `${name},你好!<br><br>感谢注册 <a href="http://flat.whiteboard.agora.io/">Flat 在线教室</a>,请在10分钟内输入验证码:<br><br><h1 style="text-align:center">${code}</h1><br><br>Flat 是一款<a href="https://github.com/netless-io/flat">开源</a>的在线授课软件,专为个人老师设计。我们努力克制保持简单、清爽、专注课中互动体验,希望可以给你带来愉悦的上课体验。<br><br>目前 Flat 正在积极开发中,如果你在使用过程中遇到问题,欢迎联系我进行反馈。它在一天天长大,我们很高兴与你分享这份喜悦。<br><br>Leo Yang<br>Flat 产品经理<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
} else {
return `${name},你好!请在10分钟内输入验证码:<br><br><h1 style="text-align:center">${code}</h1><br><br>目前 Flat 正在积极开发中,如果你在使用过程中遇到问题,欢迎联系我进行反馈。它在一天天长大,我们很高兴与你分享这份喜悦。<br><br>Leo Yang<br>Flat 产品经理<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
}
} else {
if (type === "register") {
return `Hello, ${name}! <br><br>Thank you for registering with <a href="http://flat.whiteboard.agora.io/">Flat Online Classroom</a>. Please enter the verification code within 10 minutes:<br><br><h1 style="text-align:center">${code}</h1><br><br>Flat is an <a href="https://github.com/netless-io/flat">open-source</a> online teaching software designed specifically for freelance teachers. We strive to maintain a simple, refreshing, and focused in-class interactive experience, aiming to provide you with a pleasant teaching experience.<br><br>Currently, Flat is actively under development. If you encounter any issues during usage, please feel free to contact me for feedback. It is growing day by day, and we are delighted to share this joy with you.<br><br>Thanks and Regards,<br>Leo Yang<br>Flat PM<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
} else {
return `Hello, ${name}! Please enter the verification code within 10 minutes:<br><br><h1 style="text-align:center">${code}</h1><br><br><Currently, Flat is actively under development. If you encounter any issues during usage, please feel free to contact me for feedback. It is growing day by day, and we are delighted to share this joy with you.<br><br>Thanks and Regards,<br>Leo Yang<br>Flat PM<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
}
}
}
}
14 changes: 10 additions & 4 deletions src/v1/controller/user/binding/platform/email/SendMessage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { AbstractController } from "../../../../../../abstract/controller";
import { FastifySchema, Response, ResponseError } from "../../../../../../types/Server";
import RedisService from "../../../../../../thirdPartyService/RedisService";
import { RedisKey } from "../../../../../../utils/Redis";
import { Email } from "../../../../../../utils/Email";
import { Email, EmailUtils } from "../../../../../../utils/Email";
import { Status } from "../../../../../../constants/Project";
import { MessageExpirationSecond, MessageIntervalSecond } from "./Constants";
import { ServiceUserEmail } from "../../../../../service/user/UserEmail";
Expand All @@ -27,6 +27,10 @@ export class SendMessage extends AbstractController<RequestType, ResponseType> {
type: "string",
format: "email",
},
language: {
type: "string",
nullable: true,
},
},
},
};
Expand All @@ -36,12 +40,13 @@ export class SendMessage extends AbstractController<RequestType, ResponseType> {
};

public async execute(): Promise<Response<ResponseType>> {
const { email } = this.body;
const { email, language } = this.body;

const sms = new Email(email, {
tagName: "bind",
subject: "Flat Verification Code",
subject: EmailUtils.getSubject("bind", language),
htmlBody: (email: string, code: string) =>
`Hello, ${email}! Please enter the verification code within 10 minutes:<br><br><h1 style="text-align:center">${code}</h1><br><br><Currently, Flat is actively under development. If you encounter any issues during usage, please feel free to contact me for feedback. It is growing day by day, and we are delighted to share this joy with you.<br><br>Thanks and Regards,<br>Leo Yang<br>Flat PM<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`,
EmailUtils.getMessage("bind", email, code, language),
});

if (await SendMessage.canSend(email)) {
Expand Down Expand Up @@ -93,6 +98,7 @@ export class SendMessage extends AbstractController<RequestType, ResponseType> {
interface RequestType {
body: {
email: string;
language?: string;
};
}

Expand Down
40 changes: 5 additions & 35 deletions src/v2/services/user/email.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { EmailSMS, Server } from "../../../constants/Config";
import { FError } from "../../../error/ControllerError";
import { ErrorCode } from "../../../ErrorCode";
import { createLoggerService } from "../../../logger";
import { Email } from "../../../utils/Email";
import { Email, EmailUtils } from "../../../utils/Email";
import { hash } from "../../../utils/Hash";
import { RedisKey } from "../../../utils/Redis";
import { MessageExpirationSecond, MessageIntervalSecond } from "../../constants";
Expand All @@ -25,9 +25,9 @@ export class UserEmailService {
public async sendMessageForRegister(email: string, language?: string): Promise<void> {
const sms = new Email(email, {
tagName: "register",
subject: this.getSubject("register", language),
subject: EmailUtils.getSubject("register", language),
htmlBody: (email: string, code: string) =>
this.getMessage("register", email, code, language),
EmailUtils.getMessage("register", email, code, language),
});

if (await UserEmailService.canSend(email)) {
Expand Down Expand Up @@ -56,9 +56,9 @@ export class UserEmailService {
public async sendMessageForReset(email: string, language?: string): Promise<void> {
const sms = new Email(email, {
tagName: "reset",
subject: this.getSubject("reset", language),
subject: EmailUtils.getSubject("reset", language),
htmlBody: (email: string, code: string) =>
this.getMessage("reset", email, code, language),
EmailUtils.getMessage("reset", email, code, language),
});

if (await UserEmailService.canSend(email)) {
Expand Down Expand Up @@ -207,36 +207,6 @@ export class UserEmailService {
};
}

private getSubject(_type: "register" | "reset", language?: string): string {
if (language && language.startsWith("zh")) {
return "Flat 验证码";
} else {
return "Flat Verification Code";
}
}

private getMessage(
type: "register" | "reset" | "bind",
email: string,
code: string,
language?: string,
): string {
const name = email.split("@")[0];
if (language && language.startsWith("zh")) {
if (type === "register") {
return `${name},你好!<br><br>感谢注册 <a href="http://flat.whiteboard.agora.io/">Flat 在线教室</a>,请在10分钟内输入验证码:<br><br><h1 style="text-align:center">${code}</h1><br><br>Flat 是一款<a href="https://github.com/netless-io/flat">开源</a>的在线授课软件,专为个人老师设计。我们努力克制保持简单、清爽、专注课中互动体验,希望可以给你带来愉悦的上课体验。<br><br>目前 Flat 正在积极开发中,如果你在使用过程中遇到问题,欢迎联系我进行反馈。它在一天天长大,我们很高兴与你分享这份喜悦。<br><br>Leo Yang<br>Flat 产品经理<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
} else {
return `${name},你好!请在10分钟内输入验证码:<br><br><h1 style="text-align:center">${code}</h1><br><br>目前 Flat 正在积极开发中,如果你在使用过程中遇到问题,欢迎联系我进行反馈。它在一天天长大,我们很高兴与你分享这份喜悦。<br><br>Leo Yang<br>Flat 产品经理<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
}
} else {
if (type === "register") {
return `Hello, ${name}! <br><br>Thank you for registering with <a href="http://flat.whiteboard.agora.io/">Flat Online Classroom</a>. Please enter the verification code within 10 minutes:<br><br><h1 style="text-align:center">${code}</h1><br><br>Flat is an <a href="https://github.com/netless-io/flat">open-source</a> online teaching software designed specifically for freelance teachers. We strive to maintain a simple, refreshing, and focused in-class interactive experience, aiming to provide you with a pleasant teaching experience.<br><br>Currently, Flat is actively under development. If you encounter any issues during usage, please feel free to contact me for feedback. It is growing day by day, and we are delighted to share this joy with you.<br><br>Thanks and Regards,<br>Leo Yang<br>Flat PM<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
} else {
return `Hello, ${name}! Please enter the verification code within 10 minutes:<br><br><h1 style="text-align:center">${code}</h1><br><br><Currently, Flat is actively under development. If you encounter any issues during usage, please feel free to contact me for feedback. It is growing day by day, and we are delighted to share this joy with you.<br><br>Thanks and Regards,<br>Leo Yang<br>Flat PM<br><a href="mailto:yangliu02@agora.io">yangliu02@agora.io</a>`;
}
}
}

private async hasPhone(userUUID: string): Promise<boolean> {
const exist = await userPhoneDAO.findOne(this.DBTransaction, ["id"], {
user_uuid: userUUID,
Expand Down