Skip to content

Commit ae9440f

Browse files
authored
feat: add email support (#745)
* feat(v2): add email support feat: add SMTP support * add ajv email, return email send failed, email length = 100 * return phone send failed
1 parent 17e024f commit ae9440f

File tree

46 files changed

+1642
-89
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+1642
-89
lines changed

config/defaults.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,23 @@ login:
126126
access_secret:
127127
template_code:
128128
sign_name:
129+
email:
130+
enable: true
131+
test_emails:
132+
- email:
133+
code:
134+
type: smtp
135+
smtp:
136+
host: smtpdm.aliyun.com
137+
port: 465
138+
secure: true
139+
auth:
140+
user:
141+
pass:
142+
aliCloud:
143+
access_id:
144+
access_secret:
145+
account_name: [email protected]
129146

130147
agora:
131148
app:

config/test.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,23 @@ login:
121121
access_secret:
122122
template_code:
123123
sign_name:
124+
email:
125+
enable: true
126+
test_emails:
127+
- email:
128+
code:
129+
type: smtp
130+
smtp:
131+
host: smtpdm.aliyun.com
132+
port: 465
133+
secure: true
134+
auth:
135+
user:
136+
pass:
137+
aliCloud:
138+
access_id:
139+
access_secret:
140+
account_name: [email protected]
124141

125142
agora:
126143
app:

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
"@types/lodash": "^4.14.170",
2424
"@types/node": "^18.0.0",
2525
"@types/node-rsa": "^1.1.1",
26+
"@types/nodemailer": "^6.4.9",
2627
"@types/qs": "^6.9.7",
2728
"@types/query-string": "^6.3.0",
2829
"@types/sinon": "^10.0.12",
@@ -58,6 +59,7 @@
5859
"webpack-node-externals": "^3.0.0"
5960
},
6061
"dependencies": {
62+
"@alicloud/dm20151123": "^1.0.6",
6163
"@alicloud/dysmsapi20170525": "^2.0.9",
6264
"@alicloud/openapi-client": "^0.4.1",
6365
"@fastify-userland/request-id": "^2.0.1",
@@ -89,6 +91,7 @@
8991
"mysql2": "^2.2.5",
9092
"nanoid": "^3.1.31",
9193
"node-rsa": "^1.1.1",
94+
"nodemailer": "^6.9.4",
9295
"prom-client": "^14.0.0",
9396
"qs": "^6.10.3",
9497
"reflect-metadata": "^0.1.13",

src/ErrorCode.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,12 @@ export enum ErrorCode {
5151
SMSVerificationCodeInvalid = 110000, // verification code invalid
5252
SMSAlreadyExist, // phone already exist by current user
5353
SMSAlreadyBinding, // phone are binding by other users
54+
SMSFailedToSendCode, // failed to send verification code
55+
56+
EmailVerificationCodeInvalid = 115000, // verification code invalid
57+
EmailAlreadyExist, // email already exist by current user
58+
EmailAlreadyBinding, // email are binding by other users
59+
EmailFailedToSendCode, // failed to send verification code
5460

5561
CensorshipFailed = 120000, // censorship failed
5662

src/constants/Config.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,31 @@ export const PhoneSMS = {
100100
},
101101
};
102102

103+
export const EmailSMS = {
104+
enable: config.login.email.enable,
105+
testEmails: config.login.email.test_emails.map(user => {
106+
return {
107+
email: String(user.email),
108+
code: user.code,
109+
};
110+
}),
111+
type: config.login.email.type,
112+
aliCloud: {
113+
accessId: config.login.email.aliCloud.access_id,
114+
accessSecret: config.login.email.aliCloud.access_secret,
115+
accountName: config.login.email.aliCloud.account_name,
116+
},
117+
smtp: {
118+
host: config.login.email.smtp.host,
119+
port: config.login.email.smtp.port,
120+
secure: config.login.email.smtp.secure,
121+
auth: {
122+
user: config.login.email.smtp.auth.user,
123+
pass: config.login.email.smtp.auth.pass,
124+
},
125+
},
126+
};
127+
103128
export const Agora = {
104129
appId: config.agora.app.id,
105130
appCertificate: config.agora.app.certificate,

src/constants/Project.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export enum LoginPlatform {
1515
Agora = "Agora",
1616
Google = "Google",
1717
Phone = "Phone",
18+
Email = "Email",
1819
}
1920

2021
export enum Gender {

src/dao/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { UserAgoraModel } from "../model/user/Agora";
1717
import { UserGoogleModel } from "../model/user/Google";
1818
import { UserPhoneModel } from "../model/user/Phone";
1919
import { UserSensitiveModel } from "../model/user/Sensitive";
20+
import { UserEmailModel } from "../model/user/Email";
2021

2122
export const UserDAO = DAOImplement(UserModel) as ReturnType<DAO<UserModel>>;
2223

@@ -32,6 +33,8 @@ export const UserGoogleDAO = DAOImplement(UserGoogleModel) as ReturnType<DAO<Use
3233

3334
export const UserPhoneDAO = DAOImplement(UserPhoneModel) as ReturnType<DAO<UserPhoneModel>>;
3435

36+
export const UserEmailDAO = DAOImplement(UserEmailModel) as ReturnType<DAO<UserEmailModel>>;
37+
3538
export const UserSensitiveDAO = DAOImplement(UserSensitiveModel) as ReturnType<
3639
DAO<UserSensitiveModel>
3740
>;

src/logger/LogConext.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,19 @@ export type LoggerSMS = LoggerBase & {
7676
};
7777
};
7878

79+
export type LoggerEmail = LoggerBase & {
80+
email: {
81+
accountName: string;
82+
email: string;
83+
verificationCode: string;
84+
};
85+
emailDetail?: {
86+
envId: string;
87+
requestId: string;
88+
messageId: string;
89+
};
90+
};
91+
7992
export type LoggerQueue = LoggerBase & {
8093
queue: {
8194
name: string;

src/logger/index.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
LoggerServer,
1313
LoggerService,
1414
LoggerSMS,
15+
LoggerEmail,
1516
} from "./LogConext";
1617
import { LoggerPluginFile } from "./plugins/LoggerPluginFile";
1718
import { LoggerPluginTerminal } from "./plugins/LoggerPluginTerminal";
@@ -104,6 +105,19 @@ export const createLoggerSMS = <R extends LoggerContext>(
104105
);
105106
};
106107

108+
export const createLoggerEmail = <R extends LoggerContext>(
109+
context: Partial<LoggerEmail & R>,
110+
): Logger<LoggerEmail & R> => {
111+
return new Logger<LoggerEmail & R>(
112+
"email",
113+
{
114+
...context,
115+
...baseContext,
116+
},
117+
loggerPlugins as LoggerAbstractPlugin<LoggerEmail & R>[],
118+
);
119+
};
120+
107121
export const createLoggerRTCScreenshot = <R extends LoggerContext>(
108122
context: Partial<LoggerRTCScreenshot & R>,
109123
): Logger<LoggerRTCScreenshot & R> => {

src/model/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { OAuthInfosModel } from "./oauth/oauth-infos";
1818
import { OAuthSecretsModel } from "./oauth/oauth-secrets";
1919
import { OAuthUsersModel } from "./oauth/oauth-users";
2020
import { UserSensitiveModel } from "./user/Sensitive";
21+
import { UserEmailModel } from "./user/Email";
2122

2223
export type Model =
2324
| UserModel
@@ -27,6 +28,7 @@ export type Model =
2728
| UserAgoraModel
2829
| UserGoogleModel
2930
| UserPhoneModel
31+
| UserEmailModel
3032
| UserSensitiveModel
3133
| RoomModel
3234
| RoomUserModel

0 commit comments

Comments
 (0)