From 6b637e3b2e7d96f59a3068dd543ed1c3da77b81d Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Thu, 11 Apr 2024 00:18:39 +0800 Subject: [PATCH] feat: fix SendgridEmailProvider error handling, fix send-email template --- controllers/service.go | 32 +++++++++++++++--------------- email/sendgrid.go | 35 +++++++++++++++++++++++++++++++-- web/src/VerificationListPage.js | 20 +++++++++++++++++++ 3 files changed, 69 insertions(+), 18 deletions(-) diff --git a/controllers/service.go b/controllers/service.go index 86d8e806..15f12941 100644 --- a/controllers/service.go +++ b/controllers/service.go @@ -113,25 +113,25 @@ func (c *ApiController) SendEmail() { content := emailForm.Content if content == "" { - code := "123456" + content = provider.Content + } - // "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes." - content = strings.Replace(provider.Content, "%s", code, 1) - if !strings.HasPrefix(userId, "app/") { - var user *object.User - user, err = object.GetUser(userId) - if err != nil { - c.ResponseError(err.Error()) - return - } - - userString := "Hi" - if user != nil { - userString = user.GetFriendlyName() - } - content = strings.Replace(content, "%{user.friendlyName}", userString, 1) + code := "123456" + // "You have requested a verification code at Casdoor. Here is your code: %s, please enter in 5 minutes." + content = strings.Replace(content, "%s", code, 1) + userString := "Hi" + if !strings.HasPrefix(userId, "app/") { + var user *object.User + user, err = object.GetUser(userId) + if err != nil { + c.ResponseError(err.Error()) + return + } + if user != nil { + userString = user.GetFriendlyName() } } + content = strings.Replace(content, "%{user.friendlyName}", userString, 1) for _, receiver := range emailForm.Receivers { err = object.SendEmail(provider, emailForm.Title, content, receiver, emailForm.Sender) diff --git a/email/sendgrid.go b/email/sendgrid.go index 6c7bad46..086a7189 100644 --- a/email/sendgrid.go +++ b/email/sendgrid.go @@ -15,6 +15,10 @@ package email import ( + "encoding/json" + "fmt" + "strings" + "github.com/sendgrid/sendgrid-go" "github.com/sendgrid/sendgrid-go/helpers/mail" ) @@ -23,6 +27,14 @@ type SendgridEmailProvider struct { ApiKey string } +type SendgridResponseBody struct { + Errors []struct { + Message string `json:"message"` + Field interface{} `json:"field"` + Help interface{} `json:"help"` + } `json:"errors"` +} + func NewSendgridEmailProvider(apiKey string) *SendgridEmailProvider { return &SendgridEmailProvider{ApiKey: apiKey} } @@ -32,6 +44,25 @@ func (s *SendgridEmailProvider) Send(fromAddress string, fromName, toAddress str to := mail.NewEmail("", toAddress) message := mail.NewSingleEmail(from, subject, to, "", content) client := sendgrid.NewSendClient(s.ApiKey) - _, err := client.Send(message) - return err + response, err := client.Send(message) + if err != nil { + return err + } + + if response.StatusCode >= 300 { + var responseBody SendgridResponseBody + err = json.Unmarshal([]byte(response.Body), &responseBody) + if err != nil { + return err + } + + messages := []string{} + for _, sendgridError := range responseBody.Errors { + messages = append(messages, sendgridError.Message) + } + + return fmt.Errorf("SendGrid status code: %d, error message: %s", response.StatusCode, strings.Join(messages, " | ")) + } + + return nil } diff --git a/web/src/VerificationListPage.js b/web/src/VerificationListPage.js index 5e98294a..52f33e3e 100644 --- a/web/src/VerificationListPage.js +++ b/web/src/VerificationListPage.js @@ -110,6 +110,26 @@ class VerificationListPage extends BaseListPage { ); }, }, + { + title: i18next.t("general:Client IP"), + dataIndex: "remoteAddr", + key: "remoteAddr", + width: "100px", + sorter: true, + ...this.getColumnSearchProps("remoteAddr"), + render: (text, record, index) => { + let clientIp = text; + if (clientIp.endsWith(": ")) { + clientIp = clientIp.slice(0, -2); + } + + return ( + + {clientIp} + + ); + }, + }, { title: i18next.t("verification:Receiver"), dataIndex: "receiver",