From 8f16fe84f2da8e42e31aa32623f551204ee0c1d4 Mon Sep 17 00:00:00 2001 From: Sergey Chubaryan Date: Mon, 17 Feb 2025 11:12:31 +0300 Subject: [PATCH] add password restore handler --- .../handlers/{dummy_handler.go => dummy.go} | 0 ...{user_create_handler.go => user_create.go} | 0 .../{user_login_handler.go => user_login.go} | 0 .../server/handlers/user_restore_password.go | 27 +++++++++++++++++++ .../handlers/user_send_restore_password.go | 23 ++++++++++++++++ .../server/handlers/user_send_verify.go | 23 ++++++++++++++++ ...{user_verify_handler.go => user_verify.go} | 15 ----------- internal/core/services/user_service.go | 19 +++++++------ internal/http_server/wrapper.go | 2 +- 9 files changed, 85 insertions(+), 24 deletions(-) rename cmd/backend/server/handlers/{dummy_handler.go => dummy.go} (100%) rename cmd/backend/server/handlers/{user_create_handler.go => user_create.go} (100%) rename cmd/backend/server/handlers/{user_login_handler.go => user_login.go} (100%) create mode 100644 cmd/backend/server/handlers/user_restore_password.go create mode 100644 cmd/backend/server/handlers/user_send_restore_password.go create mode 100644 cmd/backend/server/handlers/user_send_verify.go rename cmd/backend/server/handlers/{user_verify_handler.go => user_verify.go} (74%) diff --git a/cmd/backend/server/handlers/dummy_handler.go b/cmd/backend/server/handlers/dummy.go similarity index 100% rename from cmd/backend/server/handlers/dummy_handler.go rename to cmd/backend/server/handlers/dummy.go diff --git a/cmd/backend/server/handlers/user_create_handler.go b/cmd/backend/server/handlers/user_create.go similarity index 100% rename from cmd/backend/server/handlers/user_create_handler.go rename to cmd/backend/server/handlers/user_create.go diff --git a/cmd/backend/server/handlers/user_login_handler.go b/cmd/backend/server/handlers/user_login.go similarity index 100% rename from cmd/backend/server/handlers/user_login_handler.go rename to cmd/backend/server/handlers/user_login.go diff --git a/cmd/backend/server/handlers/user_restore_password.go b/cmd/backend/server/handlers/user_restore_password.go new file mode 100644 index 0000000..076ef19 --- /dev/null +++ b/cmd/backend/server/handlers/user_restore_password.go @@ -0,0 +1,27 @@ +package handlers + +import ( + "backend/internal/core/services" + httpserver "backend/internal/http_server" + "backend/pkg/logger" + "context" + + "github.com/gin-gonic/gin" +) + +type inputRestorePassword struct { + Token string `json:"token"` + NewPassword string `json:"password"` +} + +func NewUserRestorePasswordHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc { + return httpserver.WrapGin(log, + func(ctx context.Context, input inputRestorePassword) (interface{}, error) { + err := userService.ChangePasswordWithToken(ctx, input.Token, input.NewPassword) + if err != nil { + return nil, err + } + return nil, nil + }, + ) +} diff --git a/cmd/backend/server/handlers/user_send_restore_password.go b/cmd/backend/server/handlers/user_send_restore_password.go new file mode 100644 index 0000000..00725f8 --- /dev/null +++ b/cmd/backend/server/handlers/user_send_restore_password.go @@ -0,0 +1,23 @@ +package handlers + +import ( + "backend/internal/core/services" + httpserver "backend/internal/http_server" + "backend/pkg/logger" + "context" + + "github.com/gin-gonic/gin" +) + +type inputSendRestorePassword struct { + Email string `json:"email" validate:"required,email"` +} + +func NewUserSendRestorePasswordHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc { + return httpserver.WrapGin(log, + func(ctx context.Context, input inputSendRestorePassword) (interface{}, error) { + err := userService.SendEmailForgotPassword(ctx, input.Email) + return nil, err + }, + ) +} diff --git a/cmd/backend/server/handlers/user_send_verify.go b/cmd/backend/server/handlers/user_send_verify.go new file mode 100644 index 0000000..cb0bec1 --- /dev/null +++ b/cmd/backend/server/handlers/user_send_verify.go @@ -0,0 +1,23 @@ +package handlers + +import ( + "backend/internal/core/services" + httpserver "backend/internal/http_server" + "backend/pkg/logger" + "context" + + "github.com/gin-gonic/gin" +) + +type inputSendVerify struct { + Email string `json:"email" validate:"required,email"` +} + +func NewUserSendVerifyEmailHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc { + return httpserver.WrapGin(log, + func(ctx context.Context, input inputSendVerify) (interface{}, error) { + err := userService.SendEmailVerifyEmail(ctx, input.Email) + return nil, err + }, + ) +} diff --git a/cmd/backend/server/handlers/user_verify_handler.go b/cmd/backend/server/handlers/user_verify.go similarity index 74% rename from cmd/backend/server/handlers/user_verify_handler.go rename to cmd/backend/server/handlers/user_verify.go index baff1c4..b6a6163 100644 --- a/cmd/backend/server/handlers/user_verify_handler.go +++ b/cmd/backend/server/handlers/user_verify.go @@ -2,9 +2,7 @@ package handlers import ( "backend/internal/core/services" - httpserver "backend/internal/http_server" "backend/pkg/logger" - "context" "html/template" @@ -71,16 +69,3 @@ func NewUserVerifyEmailHandler(log logger.Logger, userService services.UserServi c.Status(200) } } - -type inputSendVerify struct { - Email string `json:"email" validate:"required,email"` -} - -func NewUserSendVerifyEmailHandler(log logger.Logger, userService services.UserService) gin.HandlerFunc { - return httpserver.WrapGin(log, - func(ctx context.Context, input inputSendVerify) (interface{}, error) { - err := userService.SendEmailVerifyEmail(ctx, input.Email) - return nil, err - }, - ) -} diff --git a/internal/core/services/user_service.go b/internal/core/services/user_service.go index 308db2a..2d91add 100644 --- a/internal/core/services/user_service.go +++ b/internal/core/services/user_service.go @@ -37,7 +37,7 @@ type UserService interface { SendEmailVerifyEmail(ctx context.Context, email string) error ChangePassword(ctx context.Context, userId, oldPassword, newPassword string) error - ChangePasswordWithToken(ctx context.Context, userId, actionToken, newPassword string) error + ChangePasswordWithToken(ctx context.Context, actionToken, newPassword string) error } func NewUserService(deps UserServiceDeps) UserService { @@ -141,7 +141,7 @@ func (u *userService) VerifyEmail(ctx context.Context, actionToken string) error } if err := u.deps.UserRepo.SetUserEmailVerified(ctx, token.UserId); err != nil { - return nil + return err } //TODO: log warnings somehow @@ -205,12 +205,7 @@ func (u *userService) SendEmailVerifyEmail(ctx context.Context, email string) er return u.sendEmailVerifyEmail(ctx, user.Id, user.Email) } -func (u *userService) ChangePasswordWithToken(ctx context.Context, userId, actionToken, newPassword string) error { - user, err := u.getUserById(ctx, userId) - if err != nil { - return err - } - +func (u *userService) ChangePasswordWithToken(ctx context.Context, actionToken, newPassword string) error { token, err := u.deps.ActionTokenRepo.GetActionToken(ctx, actionToken, models.ActionTokenTargetForgotPassword) if err != nil { return err @@ -219,6 +214,14 @@ func (u *userService) ChangePasswordWithToken(ctx context.Context, userId, actio return fmt.Errorf("wrong action token") } + user, err := u.getUserById(ctx, token.UserId) + if err != nil { + return err + } + if user == nil { + return fmt.Errorf("no such user") + } + if err := u.updatePassword(ctx, *user, newPassword); err != nil { return err } diff --git a/internal/http_server/wrapper.go b/internal/http_server/wrapper.go index f96d6a4..efb54c2 100644 --- a/internal/http_server/wrapper.go +++ b/internal/http_server/wrapper.go @@ -12,7 +12,7 @@ type Handler[Input, Output interface{}] func(ctx context.Context, input Input) ( type ResponseOk struct { Status string `json:"status"` - Result interface{} `json:"result"` + Result interface{} `json:"result,omitempty"` } type ResponseError struct {