diff --git a/fs_template/email_register.tpl b/fs_template/email_register.tpl
index 3565d19e..c5b8cb2a 100644
--- a/fs_template/email_register.tpl
+++ b/fs_template/email_register.tpl
@@ -6,7 +6,7 @@ Thank you for registering an account with {{ .CompanyName }}. We are thrilled to
Please take a moment to confirm your email address by clicking the button below so we can activate your account:
-Confirm Account: .UserName
+Confirm Account: {{ .UserName }}
Confirming your email ensures your account is properly secured. This also lets you access member-only tools and content.
diff --git a/fs_template/reset_password.tpl b/fs_template/reset_password.tpl
new file mode 100644
index 00000000..828226c6
--- /dev/null
+++ b/fs_template/reset_password.tpl
@@ -0,0 +1,16 @@
+Dear {{ .UserName }},
+
+We have received your request to reset your {{ .CompanyName }} account password.
+
+Please click the button below to confirm your new password:
+
+
{{ .MaskedPassword }}
(This can be replaced by the masked new password)
+
+Confirm New Password
+
+This password reset confirmation link will expire in 60 minutes. Please let us know if you have any other questions!
+
+Regards,
+{{ .SenderName }}
+{{ .SenderTitle }}
+{{ .CompanyName }}
\ No newline at end of file
diff --git a/server/auth/internal/logic/email_manager.go b/server/auth/internal/logic/email_manager.go
index 24a1c16a..8931ef6a 100644
--- a/server/auth/internal/logic/email_manager.go
+++ b/server/auth/internal/logic/email_manager.go
@@ -2,6 +2,7 @@ package logic
import (
"bytes"
+ "fmt"
"fusenapi/utils/check"
"fusenapi/utils/fstpl"
"log"
@@ -52,6 +53,7 @@ func init() {
}
type EmailFormat struct {
+ TemplateName string // 模板名字
UniqueKey string // 用于处理唯一的任务,重发都会被利用到
TargetEmail string // 发送的目标email
CompanyName string // fs公司名
@@ -61,6 +63,48 @@ type EmailFormat struct {
Extend map[string]string
}
+func (eformat *EmailFormat) Vaild() error {
+
+ // 1. 检查模板名称
+ if tpls.Lookup(eformat.TemplateName) == nil {
+ return fmt.Errorf("%s template name is not found", eformat.TemplateName)
+ }
+
+ // 2. 检查公司名称
+ if eformat.CompanyName == "" {
+ return fmt.Errorf("company name cannot be empty")
+ }
+
+ // 3. 检查确认链接
+ if eformat.ConfirmationLink == "" {
+ return fmt.Errorf("confirmation link cannot be empty")
+ }
+
+ // 4. 检查发送人名称
+ if eformat.SenderName == "" {
+ return fmt.Errorf("sender name cannot be empty")
+ }
+
+ // 5. 检查发送人头衔
+ if eformat.SenderTitle == "" {
+ return fmt.Errorf("sender title cannot be empty")
+ }
+
+ // 6. 检查目标邮箱
+ if eformat.TargetEmail == "" {
+ return fmt.Errorf("target email cannot be empty")
+ }
+
+ // 7. 检查唯一键
+ if eformat.UniqueKey == "" {
+ return fmt.Errorf("unique key cannot be empty")
+ }
+
+ // 所有校验通过
+ return nil
+
+}
+
// EmailSender
type EmailSender struct {
lock sync.Mutex
@@ -87,8 +131,9 @@ func (m *EmailSender) ProcessEmailTasks() {
break
}
- if emailformat.UniqueKey == "" {
- logx.Error("email UniqueKey must be exists")
+ err := emailformat.Vaild()
+ if err != nil {
+ logx.Error(err)
continue
}
@@ -111,7 +156,9 @@ func (m *EmailSender) ProcessEmailTasks() {
go func() {
defer func() { <-m.semaphore }() // Release a token
- content := RenderEmailRegisterTemplate(emailformat.CompanyName,
+ content := RenderEmailTemplate(
+ emailformat.TemplateName,
+ emailformat.CompanyName,
emailformat.ConfirmationLink,
emailformat.SenderName,
emailformat.SenderTitle,
@@ -162,7 +209,7 @@ func (m *EmailSender) ClearExpiredTasks() {
}
}
-func RenderEmailRegisterTemplate(companyName, confirmationLink, senderName, senderTitle string, extend map[string]string) []byte {
+func RenderEmailTemplate(templateName, companyName, confirmationLink, senderName, senderTitle string, extend map[string]string) []byte {
data := map[string]string{
"CompanyName": companyName,
@@ -176,7 +223,7 @@ func RenderEmailRegisterTemplate(companyName, confirmationLink, senderName, send
}
var result bytes.Buffer
- err := tpls.ExecuteTemplate(&result, "email_register.tpl", data)
+ err := tpls.ExecuteTemplate(&result, templateName, data)
if err != nil {
log.Fatal(err)
}
diff --git a/server/auth/internal/logic/useremailregisterlogic.go b/server/auth/internal/logic/useremailregisterlogic.go
index be88c9b4..9511b9ca 100644
--- a/server/auth/internal/logic/useremailregisterlogic.go
+++ b/server/auth/internal/logic/useremailregisterlogic.go
@@ -75,6 +75,7 @@ func (l *UserEmailRegisterLogic) UserEmailRegister(req *types.RequestEmailRegist
userName := token.Extend["first_name"].(string) + " " + token.Extend["last_name"].(string)
// 进入发送邮箱的系统
EmailManager.EmailTasks <- &EmailFormat{
+ TemplateName: "email_register.tpl",
UniqueKey: "register-" + req.Email,
TargetEmail: req.Email,
CompanyName: "fusen",
diff --git a/server/auth/internal/logic/userregisterlogic.go b/server/auth/internal/logic/userregisterlogic.go
index 6d621e48..83e0c5bb 100644
--- a/server/auth/internal/logic/userregisterlogic.go
+++ b/server/auth/internal/logic/userregisterlogic.go
@@ -74,6 +74,7 @@ func (l *UserRegisterLogic) UserRegister(req *types.RequestUserRegister, userinf
// 进入发送邮箱的系统
EmailManager.EmailTasks <- &EmailFormat{
+ TemplateName: "email_register.tpl",
UniqueKey: "register-" + req.Email,
TargetEmail: req.Email,
CompanyName: "fusen",
diff --git a/server/auth/internal/types/types.go b/server/auth/internal/types/types.go
index 4fda1d3d..44ab1232 100644
--- a/server/auth/internal/types/types.go
+++ b/server/auth/internal/types/types.go
@@ -28,7 +28,8 @@ type RequestUserRegister struct {
}
type RequestUserResetToken struct {
- Wid string `json:"wid"`
+ Wid string `json:"wid"`
+ Email string `json:"email"` // email
}
type DataResetToken struct {
diff --git a/server/info/internal/logic/infologic.go b/server/info/internal/logic/infologic.go
index 582fc116..689e52de 100644
--- a/server/info/internal/logic/infologic.go
+++ b/server/info/internal/logic/infologic.go
@@ -76,7 +76,7 @@ func (mquery *ModuleQuery) EncodeEmpty() map[string]any {
query = "." + query
}
k := fmt.Sprintf("%s%s", mquery.ModuleName, query)
- qstr[k] = map[string]any{}
+ qstr[k] = nil
}
return qstr
diff --git a/server_api/auth.api b/server_api/auth.api
index 3e0279a9..5c8c7f90 100644
--- a/server_api/auth.api
+++ b/server_api/auth.api
@@ -12,28 +12,28 @@ import "basic.api"
service auth {
@handler UserLoginHandler
post /api/auth/login(RequestUserLogin) returns (response);
-
+
@handler UserRegisterHandler
post /api/auth/register(RequestUserRegister) returns (response);
-
+
@handler AcceptCookieHandler
post /api/auth/accept-cookie(request) returns (response);
-
+
@handler UserGoogleLoginHandler
get /api/auth/oauth2/login/google(RequestGoogleLogin) returns (response);
-
+
@handler UserEmailConfirmationHandler
get /api/auth/email/confirmation(RequestEmailConfirmation) returns (response);
-
+
@handler UserEmailRegisterHandler
post /api/auth/oauth2/register(RequestEmailRegister) returns (response);
-
+
@handler UserResetTokenHandler
post /api/auth/reset/token(RequestUserResetToken) returns (response);
-
+
@handler UserResetPasswordHandler
post /api/auth/reset/password(RequestUserResetPassword) returns (response);
-
+
@handler DebugAuthDeleteHandler
post /api/auth/debug/delete(RequestAuthDelete) returns (response);
}
@@ -79,7 +79,8 @@ type (
// RequestUserResetToken 请求重置token, 一定不为null
RequestUserResetToken {
- Wid string `json:"wid"`
+ Wid string `json:"wid"`
+ Email string `json:"email"` // email
}
// UserResetTokenHandler 返回重置token