Skip to content

Commit

Permalink
Refactor handler validator
Browse files Browse the repository at this point in the history
  • Loading branch information
voltgizerz committed Jun 27, 2024
1 parent 0392ffd commit b407bec
Show file tree
Hide file tree
Showing 9 changed files with 71 additions and 53 deletions.
13 changes: 7 additions & 6 deletions internal/app/api/handler/auth_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/voltgizerz/POS-restaurant/internal/app/entity"
"github.com/voltgizerz/POS-restaurant/internal/app/interactor"
"github.com/voltgizerz/POS-restaurant/internal/app/ports"
"github.com/voltgizerz/POS-restaurant/internal/utils"
)

type AuthHandler struct {
Expand All @@ -27,7 +28,7 @@ func (h *AuthHandler) Login(c fiber.Ctx) error {
span, ctx := opentracing.StartSpanFromContext(c.UserContext(), "handler.AuthHandler.Login")
defer span.Finish()

req := &loginRequest{}
req := &entity.LoginRequest{}

err := c.Bind().Body(req)
if err != nil {
Expand All @@ -36,9 +37,9 @@ func (h *AuthHandler) Login(c fiber.Ctx) error {

err = validator.New().StructCtx(ctx, req)
if err != nil {
validationErrors := err.(validator.ValidationErrors)
err = utils.GetFirstValidatorError(err)

return SendErrorResp(c, fiber.StatusBadRequest, validationErrors.Error())
return SendErrorResp(c, fiber.StatusBadRequest, err.Error())
}

userLoginData, err := h.userService.Login(ctx, req.Username, req.Password)
Expand All @@ -57,7 +58,7 @@ func (h *AuthHandler) Register(c fiber.Ctx) error {
span, ctx := opentracing.StartSpanFromContext(c.UserContext(), "handler.AuthHandler.Register")
defer span.Finish()

req := &registerRequest{}
req := &entity.RegisterRequest{}

err := c.Bind().Body(req)
if err != nil {
Expand All @@ -66,9 +67,9 @@ func (h *AuthHandler) Register(c fiber.Ctx) error {

err = validator.New().StructCtx(ctx, req)
if err != nil {
validationErrors := err.(validator.ValidationErrors)
err = utils.GetFirstValidatorError(err)

return SendErrorResp(c, fiber.StatusBadRequest, validationErrors.Error())
return SendErrorResp(c, fiber.StatusBadRequest, err.Error())
}

if req.Password != req.ConfirmPassword {
Expand Down
16 changes: 0 additions & 16 deletions internal/app/api/handler/auth_request.go

This file was deleted.

41 changes: 29 additions & 12 deletions internal/app/entity/auth_entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,33 @@ package entity

import "time"

type CreateTokenResponse struct {
Token string `json:"token"`
TokenType string `json:"token_type"`
ExpiredAt time.Time `json:"expired_at"`
}
type (
LoginRequest struct {
Username string `json:"username" validate:"required,alphanum"`
Password string `json:"password" validate:"required,alphanumunicode"`
}

type LoginResponse struct {
UserID int64 `json:"user_id"`
RoleID int64 `json:"role_id"`
Token string `json:"token"`
TokenType string `json:"token_type"`
ExpiredAt time.Time `json:"expired_at"`
}
RegisterRequest struct {
Name string `json:"name" validate:"required,alphanum"`
Username string `json:"username" validate:"required,alphanum"`
Email string `json:"email" validate:"required,email"`
Password string `json:"password" validate:"required,alphanumunicode"`
ConfirmPassword string `json:"confirm_password" validate:"required,alphanumunicode"`
}
)

type (
LoginResponse struct {
UserID int64 `json:"user_id"`
RoleID int64 `json:"role_id"`
Token string `json:"token"`
TokenType string `json:"token_type"`
ExpiredAt time.Time `json:"expired_at"`
}

CreateTokenResponse struct {
Token string `json:"token"`
TokenType string `json:"token_type"`
ExpiredAt time.Time `json:"expired_at"`
}
)
20 changes: 10 additions & 10 deletions internal/app/entity/user_entity.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@ type User struct {
Name string `json:"name"`
Username string `json:"username"`
Email string `json:"email"`
Password string `json:"password_hashed"`
Password string `json:"password"`
IsActive bool `json:"is_active"`
CreatedAt time.Time `json:"created_at"`
}

type UserORM struct {
ID int64 `db:"id"`
Name string `db:"name"`
Username string `db:"username"`
Email string `db:"email"`
Password string `db:"password_hashed"`
IsActive bool `db:"is_active"`
RoleID int64 `db:"role_id"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID int64 `db:"id"`
Name string `db:"name"`
Username string `db:"username"`
Email string `db:"email"`
PasswordHashed string `db:"password_hashed"`
IsActive bool `db:"is_active"`
RoleID int64 `db:"role_id"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}

type RegisterResponse struct {
Expand Down
2 changes: 1 addition & 1 deletion internal/app/repository/user_repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func (r *UserRepository) RegisterUser(ctx context.Context, userData entity.UserO
span, ctx := opentracing.StartSpanFromContext(ctx, "repo.UserRepository.RegisterUser")
defer span.Finish()

result, err := r.MasterDB.ExecContext(ctx, queryInsertDataUser, userData.Name, userData.Username, userData.Email, userData.Password, 1, 1)
result, err := r.MasterDB.ExecContext(ctx, queryInsertDataUser, userData.Name, userData.Username, userData.Email, userData.PasswordHashed, 1, 1)
if err != nil {
return 0, err
}
Expand Down
10 changes: 5 additions & 5 deletions internal/app/service/user_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (s *UserService) Login(ctx context.Context, username string, password strin
return nil, err
}

err = utils.VerifyPassword(password, user.Password)
err = utils.VerifyPassword(password, user.PasswordHashed)
if err != nil {
logger.LogStdErr.WithFields(logrus.Fields{
"username": username,
Expand Down Expand Up @@ -101,10 +101,10 @@ func (s *UserService) Register(ctx context.Context, userData entity.User) (int64
}

userDataProceed := entity.UserORM{
Username: userData.Username,
Password: passwordHashed,
Name: userData.Name,
Email: userData.Email,
Username: userData.Username,
PasswordHashed: passwordHashed,
Name: userData.Name,
Email: userData.Email,
}

result, err := s.userRepository.RegisterUser(ctx, userDataProceed)
Expand Down
4 changes: 2 additions & 2 deletions internal/app/service/user_service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
)

func TestUserService_Login(t *testing.T) {
mockUserORM := &entity.UserORM{ID: 1, Password: "$2a$14$aRI5bAYlMR7jvM2XH/EB1u9cHMpbuNX6FUsLGPnkdWNeN96OCbw0q"}
mockUserORM := &entity.UserORM{ID: 1, PasswordHashed: "$2a$14$aRI5bAYlMR7jvM2XH/EB1u9cHMpbuNX6FUsLGPnkdWNeN96OCbw0q"}

type args struct {
ctx context.Context
Expand Down Expand Up @@ -72,7 +72,7 @@ func TestUserService_Login(t *testing.T) {
wantErr: true,
setup: func(mockObj *MockObject) {
mockObj.MockUserRepo.EXPECT().GetUserByUsername(gomock.Any(), gomock.Any()).
Return(&entity.UserORM{ID: 1, Password: "aasd"}, nil).Times(1)
Return(&entity.UserORM{ID: 1, PasswordHashed: "aasd"}, nil).Times(1)
},
},
{
Expand Down
2 changes: 1 addition & 1 deletion internal/utils/crypto.go → internal/utils/bcrypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ func HashPassword(password string) (string, error) {
// VerifyPassword verifies if the given password matches the stored hash.
func VerifyPassword(password, hash string) error {
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
return err
return err
}
16 changes: 16 additions & 0 deletions internal/utils/validator.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package utils

import (
"fmt"

"github.com/go-playground/validator/v10"
)

func GetFirstValidatorError(valErr error) (err error) {
for _, valErr := range valErr.(validator.ValidationErrors) {
err = fmt.Errorf("field %s %s", valErr.Field(), valErr.Tag())
continue
}

return err
}

0 comments on commit b407bec

Please sign in to comment.