From 1296d58843a36386ab9107684098a71422e9062b Mon Sep 17 00:00:00 2001 From: yk Date: Thu, 2 Dec 2021 09:56:24 +0300 Subject: [PATCH 1/3] - send mail --- .../emails/password_reset_html.tmpl | 26 +++++++++++ .../emails/password_reset_text.tmpl | 11 +++++ internal/usecase/interactor/user.go | 45 ++++++++++++++++++- 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 internal/usecase/interactor/emails/password_reset_html.tmpl create mode 100644 internal/usecase/interactor/emails/password_reset_text.tmpl diff --git a/internal/usecase/interactor/emails/password_reset_html.tmpl b/internal/usecase/interactor/emails/password_reset_html.tmpl new file mode 100644 index 00000000..c9c8dfdb --- /dev/null +++ b/internal/usecase/interactor/emails/password_reset_html.tmpl @@ -0,0 +1,26 @@ +Content-Transfer-Encoding: quoted-printable +Content-Type: text/html; charset=utf-8 +Mime-Version: 1.0 + + + + + + + + + +

ReEarth

+

+ You have submitted a password change request! If it was you, please confirm the password change. + To reset your password click on the following link: +

+ + {{ . }} + +

If you are having any issues with your account, please don't hesitate to contact us by replying to this mail. Thank you!

+ + + + \ No newline at end of file diff --git a/internal/usecase/interactor/emails/password_reset_text.tmpl b/internal/usecase/interactor/emails/password_reset_text.tmpl new file mode 100644 index 00000000..6abaf0e2 --- /dev/null +++ b/internal/usecase/interactor/emails/password_reset_text.tmpl @@ -0,0 +1,11 @@ +Content-Transfer-Encoding: quoted-printable +Content-Type: text/plain; charset=utf-8 +Mime-Version: 1.0 + +ReEarth +You have submitted a password change request! If it was you, please confirm the password change. +To reset your password click on the following link: + +{{ . }} + +If you are having any issues with your account, please don't hesitate to contact us by replying to this mail. Thank you! \ No newline at end of file diff --git a/internal/usecase/interactor/user.go b/internal/usecase/interactor/user.go index c13fa040..c8594600 100644 --- a/internal/usecase/interactor/user.go +++ b/internal/usecase/interactor/user.go @@ -1,9 +1,13 @@ package interactor import ( + "bytes" "context" + _ "embed" "errors" + htmlTmpl "html/template" "net/mail" + textTmpl "text/template" "github.com/reearth/reearth-backend/internal/usecase" "github.com/reearth/reearth-backend/internal/usecase/gateway" @@ -29,9 +33,17 @@ type User struct { transaction repo.Transaction file gateway.File authenticator gateway.Authenticator + mailer gateway.Mailer signupSecret string } +var ( + //go:embed emails/password_reset_html.tmpl + passwordResetHTMLTMPL string + //go:embed emails/password_reset_text.tmpl + passwordResetTextTMPL string +) + func NewUser(r *repo.Container, g *gateway.Container, signupSecret string) interfaces.User { return &User{ userRepo: r.User, @@ -47,6 +59,7 @@ func NewUser(r *repo.Container, g *gateway.Container, signupSecret string) inter file: g.File, authenticator: g.Authenticator, signupSecret: signupSecret, + mailer: g.Mailer, } } @@ -253,12 +266,42 @@ func (i *User) StartPasswordReset(ctx context.Context, email string) error { return err } - u.SetPasswordReset(user.NewPasswordReset()) + pr := user.NewPasswordReset() + u.SetPasswordReset(pr) if err := i.userRepo.Save(ctx, u); err != nil { return err } + t1, err := textTmpl.New("passwordReset").Parse(passwordResetTextTMPL) + if err != nil { + return err + } + t2, err := htmlTmpl.New("passwordReset").Parse(passwordResetHTMLTMPL) + if err != nil { + return err + } + var TextOut, HTMLOut bytes.Buffer + link := "localhost:3000/?pwd-reset-token=" + pr.Token + err = t1.Execute(&TextOut, link) + if err != nil { + return err + } + err = t2.Execute(&HTMLOut, link) + if err != nil { + return err + } + + err = i.mailer.SendMail([]gateway.Contact{ + { + Email: u.Email(), + Name: u.Name(), + }, + }, "Password reset", TextOut.String(), HTMLOut.String()) + if err != nil { + return err + } + tx.Commit() return nil } From e2e4c3e1e5ebbae601a58ec9808c8f76d5d3543b Mon Sep 17 00:00:00 2001 From: yk Date: Mon, 6 Dec 2021 12:09:32 +0300 Subject: [PATCH 2/3] enhancement --- .../emails/password_reset_html.tmpl | 4 --- .../emails/password_reset_text.tmpl | 4 --- internal/usecase/interactor/user.go | 32 ++++++++++++------- pkg/log/log.go | 4 +++ 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/internal/usecase/interactor/emails/password_reset_html.tmpl b/internal/usecase/interactor/emails/password_reset_html.tmpl index c9c8dfdb..43ee3058 100644 --- a/internal/usecase/interactor/emails/password_reset_html.tmpl +++ b/internal/usecase/interactor/emails/password_reset_html.tmpl @@ -1,7 +1,3 @@ -Content-Transfer-Encoding: quoted-printable -Content-Type: text/html; charset=utf-8 -Mime-Version: 1.0 - diff --git a/internal/usecase/interactor/emails/password_reset_text.tmpl b/internal/usecase/interactor/emails/password_reset_text.tmpl index 6abaf0e2..03d4fd2b 100644 --- a/internal/usecase/interactor/emails/password_reset_text.tmpl +++ b/internal/usecase/interactor/emails/password_reset_text.tmpl @@ -1,7 +1,3 @@ -Content-Transfer-Encoding: quoted-printable -Content-Type: text/plain; charset=utf-8 -Mime-Version: 1.0 - ReEarth You have submitted a password change request! If it was you, please confirm the password change. To reset your password click on the following link: diff --git a/internal/usecase/interactor/user.go b/internal/usecase/interactor/user.go index c8594600..a9a9ed66 100644 --- a/internal/usecase/interactor/user.go +++ b/internal/usecase/interactor/user.go @@ -14,6 +14,7 @@ import ( "github.com/reearth/reearth-backend/internal/usecase/interfaces" "github.com/reearth/reearth-backend/internal/usecase/repo" "github.com/reearth/reearth-backend/pkg/id" + "github.com/reearth/reearth-backend/pkg/log" "github.com/reearth/reearth-backend/pkg/project" "github.com/reearth/reearth-backend/pkg/rerror" "github.com/reearth/reearth-backend/pkg/user" @@ -39,11 +40,26 @@ type User struct { var ( //go:embed emails/password_reset_html.tmpl - passwordResetHTMLTMPL string + passwordResetHTMLTMPLStr string //go:embed emails/password_reset_text.tmpl - passwordResetTextTMPL string + passwordResetTextTMPLStr string + + passwordResetTextTMPL *textTmpl.Template + passwordResetHTMLTMPL *htmlTmpl.Template ) +func init() { + var err error + passwordResetTextTMPL, err = textTmpl.New("passwordReset").Parse(passwordResetTextTMPLStr) + if err != nil { + log.Panicf("password reset email template parse error: %s", err) + } + passwordResetHTMLTMPL, err = htmlTmpl.New("passwordReset").Parse(passwordResetHTMLTMPLStr) + if err != nil { + log.Panicf("password reset email template parse error: %s", err) + } +} + func NewUser(r *repo.Container, g *gateway.Container, signupSecret string) interfaces.User { return &User{ userRepo: r.User, @@ -273,21 +289,13 @@ func (i *User) StartPasswordReset(ctx context.Context, email string) error { return err } - t1, err := textTmpl.New("passwordReset").Parse(passwordResetTextTMPL) - if err != nil { - return err - } - t2, err := htmlTmpl.New("passwordReset").Parse(passwordResetHTMLTMPL) - if err != nil { - return err - } var TextOut, HTMLOut bytes.Buffer link := "localhost:3000/?pwd-reset-token=" + pr.Token - err = t1.Execute(&TextOut, link) + err = passwordResetTextTMPL.Execute(&TextOut, link) if err != nil { return err } - err = t2.Execute(&HTMLOut, link) + err = passwordResetHTMLTMPL.Execute(&HTMLOut, link) if err != nil { return err } diff --git a/pkg/log/log.go b/pkg/log/log.go index 23ed1c84..a42a6f00 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -102,3 +102,7 @@ func Errorln(args ...interface{}) { func Fatalln(args ...interface{}) { logrus.Fatalln(args...) } + +func Panicf(format string, args ...interface{}) { + logrus.Panicf(format, args...) +} From cd0f4b0ecd4c046c573f2d6ea5383f1d7ebb4b98 Mon Sep 17 00:00:00 2001 From: yk Date: Mon, 6 Dec 2021 12:31:05 +0300 Subject: [PATCH 3/3] fix log --- internal/usecase/interactor/user.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/usecase/interactor/user.go b/internal/usecase/interactor/user.go index a9a9ed66..8419e331 100644 --- a/internal/usecase/interactor/user.go +++ b/internal/usecase/interactor/user.go @@ -52,11 +52,11 @@ func init() { var err error passwordResetTextTMPL, err = textTmpl.New("passwordReset").Parse(passwordResetTextTMPLStr) if err != nil { - log.Panicf("password reset email template parse error: %s", err) + log.Panicf("password reset email template parse error: %s\n", err) } passwordResetHTMLTMPL, err = htmlTmpl.New("passwordReset").Parse(passwordResetHTMLTMPLStr) if err != nil { - log.Panicf("password reset email template parse error: %s", err) + log.Panicf("password reset email template parse error: %s\n", err) } }