From d429d26bb2cc70f9f6c209b38b80e748a1dbe7fd Mon Sep 17 00:00:00 2001 From: Rijal Asepnugroho Date: Sun, 17 Jan 2021 15:33:36 +0700 Subject: [PATCH] [FIX][#4] Send email forgot password using sendgrid --- .env.example | 22 ++++++++++++++++++---- client/main.go | 8 ++++---- internal/model/request_password.go | 4 ++-- internal/pkg/email/email.go | 23 +++++++++++++++++++++++ internal/service/auth.go | 22 +++++++++++++++++++++- server.go | 2 +- 6 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 internal/pkg/email/email.go diff --git a/.env.example b/.env.example index aee3598..5cd221d 100644 --- a/.env.example +++ b/.env.example @@ -2,13 +2,27 @@ SERVICE_NAME=user-service SERVICE_VERSION=1+0a ENV=debug -PORT=9002 +APP_NAME= +APP_HOST= +PORT=8000 -POSTGRES_HOST='localhost' +POSTGRES_HOST=localhost POSTGRES_PORT=5432 POSTGRES_USER=postgres POSTGRES_PASSWORD=1234 -POSTGRES_DB=user_services +POSTGRES_DB=users REDIS_ADDRESS=localhost:6379 -REDIS_PASSWORD= \ No newline at end of file +REDIS_PASSWORD= + +TOKEN_SALT= + +CUSTOMERSERVICE_EMAIL= +CUSTOMERSERVICE_PHONE= + +SENDGRID_FROM_NAME= +SENDGRID_FROM_EMAIL= +SENDGRID_TEMPLATE_FORGOT_PASSWORD= +SENDGRID_TEMPLATE_REGISTRATION= +SENDGRID_TEMPLATE_NEW_USER= +SENDGRID_API_KEY= \ No newline at end of file diff --git a/client/main.go b/client/main.go index 27241e2..1ebf5ab 100644 --- a/client/main.go +++ b/client/main.go @@ -25,15 +25,15 @@ func main() { // user := users.NewUserServiceClient(conn) // company := users.NewCompanyServiceClient(conn) // region := users.NewRegionServiceClient(conn) - branch := users.NewBranchServiceClient(conn) + // branch := users.NewBranchServiceClient(conn) // employee := users.NewEmployeeServiceClient(conn) // feature := users.NewFeatureServiceClient(conn) // packageFeature := users.NewPackageFeatureServiceClient(conn) // access := users.NewAccessServiceClient(conn) // group := users.NewGroupServiceClient(conn) - ctx = service.Login(ctx, auth) - // service.ForgotPassword(ctx, auth) + // ctx = service.Login(ctx, auth) + service.ForgotPassword(ctx, auth) // service.ResetPassword(ctx, auth) // service.ChangePassword(ctx, auth) // service.IsAuth(ctx, auth) @@ -51,7 +51,7 @@ func main() { // service.ViewRegion(ctx, region) // service.DeleteRegion(ctx, region) // service.ListRegion(ctx, region) - service.CreateBranch(ctx, branch) + // service.CreateBranch(ctx, branch) // service.UpdateBranch(ctx, branch) // service.ViewBranch(ctx, branch) // service.DeleteBranch(ctx, branch) diff --git a/internal/model/request_password.go b/internal/model/request_password.go index c1e53a1..df96db0 100644 --- a/internal/model/request_password.go +++ b/internal/model/request_password.go @@ -20,14 +20,14 @@ type RequestPassword struct { // Create func func (u *RequestPassword) Create(ctx context.Context, db *sql.DB) error { - + u.Pb.Id = uuid.New().String() stmt, err := db.PrepareContext(ctx, `INSERT INTO request_passwords (id, user_id, created_at) VALUES ($1, $2, $3)`) if err != nil { return status.Errorf(codes.Internal, "prepare insert: %v", err) } defer stmt.Close() - _, err = stmt.ExecContext(ctx, uuid.New().String(), u.Pb.GetUserId(), time.Now().UTC()) + _, err = stmt.ExecContext(ctx, u.Pb.GetId(), u.Pb.GetUserId(), time.Now().UTC()) if err != nil { return status.Errorf(codes.Internal, "exec insert: %v", err) } diff --git a/internal/pkg/email/email.go b/internal/pkg/email/email.go new file mode 100644 index 0000000..0a0c7e7 --- /dev/null +++ b/internal/pkg/email/email.go @@ -0,0 +1,23 @@ +package email + +import ( + "os" + + "github.com/sendgrid/sendgrid-go" + "github.com/sendgrid/sendgrid-go/helpers/mail" +) + +// SendMailV3 for send mail from sendgrid +func SendMailV3(from *mail.Email, p *mail.Personalization, templateID string) error { + m := mail.NewV3Mail() + m.SetFrom(from) + m.SetTemplateID(templateID) + m.AddPersonalizations(p) + + request := sendgrid.GetRequest(os.Getenv("SENDGRID_API_KEY"), "/v3/mail/send", "https://api.sendgrid.com") + request.Method = "POST" + request.Body = mail.GetRequestBody(m) + _, err := sendgrid.API(request) + + return err +} diff --git a/internal/service/auth.go b/internal/service/auth.go index 12ae044..97c7a19 100644 --- a/internal/service/auth.go +++ b/internal/service/auth.go @@ -3,15 +3,18 @@ package service import ( "context" "database/sql" + "os" "time" "github.com/golang/protobuf/ptypes" + "github.com/sendgrid/sendgrid-go/helpers/mail" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "user-service/internal/model" "user-service/internal/pkg/app" "user-service/internal/pkg/db/redis" + "user-service/internal/pkg/email" "user-service/internal/pkg/token" users "user-service/pb" ) @@ -72,7 +75,24 @@ func (u *Auth) ForgotPassword(ctx context.Context, in *users.ForgotPasswordReque return &output, err } - // TODO : send email change password + // send email link forgot password + from := mail.NewEmail(os.Getenv("SENDGRID_FROM_NAME"), os.Getenv("SENDGRID_FROM_EMAIL")) + p := mail.NewPersonalization() + tos := []*mail.Email{ + mail.NewEmail(userModel.Pb.GetName(), userModel.Pb.GetEmail()), + } + p.AddTos(tos...) + + p.SetDynamicTemplateData("name", userModel.Pb.GetName()) + p.SetDynamicTemplateData("url", os.Getenv("APP_HOST")+"/change-password/"+requestPasswordModel.Pb.GetId()) + p.SetDynamicTemplateData("app_name", os.Getenv("APP_NAME")) + p.SetDynamicTemplateData("cs_email", os.Getenv("CUSTOMERSERVICE_EMAIL")) + p.SetDynamicTemplateData("cs_phone", os.Getenv("CUSTOMERSERVICE_PHONE")) + + err = email.SendMailV3(from, p, os.Getenv("SENDGRID_TEMPLATE_FORGOT_PASSWORD")) + if err != nil { + return &output, status.Errorf(codes.Internal, "send link forgot password: %v", err) + } output.Message = "Success" return &output, nil diff --git a/server.go b/server.go index 8a78983..fa5afde 100644 --- a/server.go +++ b/server.go @@ -16,7 +16,7 @@ import ( "user-service/internal/route" ) -const defaultPort = "9001" +const defaultPort = "8000" func main() { // lookup and setup env