From a3bda37e347a4cb9791e942518786de53bcd16eb Mon Sep 17 00:00:00 2001 From: Felix Fernando Wijaya Date: Sun, 9 Jun 2024 18:23:32 +0700 Subject: [PATCH] Refactor code --- cmd/main.go | 6 +++-- database/database.go | 2 +- internal/app/api/auth/auth.go | 2 +- internal/app/api/handler/user_handler.go | 10 ++------ internal/app/api/server.go | 2 +- internal/app/entity/auth_entity.go | 10 +++++++- internal/app/interactor/interactor.go | 6 ++++- internal/app/ports/auth_ports.go | 2 +- internal/app/ports/user_ports.go | 2 +- internal/app/service/user_service.go | 29 +++++++++++++++++++----- 10 files changed, 48 insertions(+), 23 deletions(-) diff --git a/cmd/main.go b/cmd/main.go index aede454..336572e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -47,11 +47,13 @@ func main() { userRepo := repository.NewUserRepository(repoOpts) // Initialize Services - userService := service.NewUserService(userRepo) + userService := service.NewUserService(interactor.UserService{ + AuthService: authJWT, + UserRepository: userRepo, + }) // Initialize Handlers userHandler := handler.NewUserHandler(interactor.UserHandler{ - Auth: authJWT, UserService: userService, }) diff --git a/database/database.go b/database/database.go index cd07d04..3805f3b 100644 --- a/database/database.go +++ b/database/database.go @@ -34,7 +34,7 @@ func connectMySQL(ctx context.Context, dsn string, maxOpenConns, maxIdleConns in db, err := sqlx.Connect("mysql", dsn) if err != nil { - logger.LogStdErr.Errorf("Failed to connect to MySQL: %s", err) + logger.LogStdErr.Fatalf("Failed to connect to MySQL: %s", err) } db.SetMaxOpenConns(maxOpenConns) diff --git a/internal/app/api/auth/auth.go b/internal/app/api/auth/auth.go index 5b33f40..366e998 100644 --- a/internal/app/api/auth/auth.go +++ b/internal/app/api/auth/auth.go @@ -25,7 +25,7 @@ func NewAuthJWT(secretKey string) ports.IAuth { } } -func (a *AuthJWT) CreateToken(user *entity.User) (*entity.CreateTokenResponse, error) { +func (a *AuthJWT) CreateToken(user *entity.UserORM) (*entity.CreateTokenResponse, error) { expiredAt := time.Now().Add(time.Hour * time.Duration(a.ExpireDurationInHour)) token := jwt.NewWithClaims(jwt.SigningMethodHS256, diff --git a/internal/app/api/handler/user_handler.go b/internal/app/api/handler/user_handler.go index 5866a83..d9d96bb 100644 --- a/internal/app/api/handler/user_handler.go +++ b/internal/app/api/handler/user_handler.go @@ -17,7 +17,6 @@ type UserHandler struct { func NewUserHandler(i interactor.UserHandler) *UserHandler { return &UserHandler{ - authService: i.Auth, userService: i.UserService, } } @@ -37,7 +36,7 @@ func (h *UserHandler) Login(c fiber.Ctx) error { return sendErrorResp(c, fiber.StatusBadRequest, constants.ErrMsgUsernameOrPasswordRequired) } - dataUser, err := h.userService.Login(ctx, req.Username, req.Password) + userLoginData, err := h.userService.Login(ctx, req.Username, req.Password) if err != nil { if err == sql.ErrNoRows { return sendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgUsernameNotFound) @@ -46,12 +45,7 @@ func (h *UserHandler) Login(c fiber.Ctx) error { return sendErrorResp(c, fiber.StatusUnauthorized, constants.ErrMsgInvalidUsernameOrPassword) } - token, err := h.authService.CreateToken(dataUser) - if err != nil { - return sendErrorResp(c, fiber.StatusInternalServerError, constants.ErrMsgInternalServerError) - } - - return sendSuccessResp(c, fiber.StatusOK, "Success", token) + return sendSuccessResp(c, fiber.StatusOK, "Success", userLoginData) } func (h *UserHandler) Register(c fiber.Ctx) error { diff --git a/internal/app/api/server.go b/internal/app/api/server.go index ac3c547..0fe4f78 100644 --- a/internal/app/api/server.go +++ b/internal/app/api/server.go @@ -14,7 +14,7 @@ type Server struct { func NewServer(interactor interactor.APInteractor) *Server { return &Server{ - cfgAPI: interactor.CfgAPI, + cfgAPI: interactor.CfgAPI, userHandler: interactor.UserHandler, } } diff --git a/internal/app/entity/auth_entity.go b/internal/app/entity/auth_entity.go index 4b5d52f..ce34a0e 100644 --- a/internal/app/entity/auth_entity.go +++ b/internal/app/entity/auth_entity.go @@ -6,4 +6,12 @@ type CreateTokenResponse struct { Token string `json:"token"` TokenType string `json:"token_type"` ExpiredAt time.Time `json:"expired_at"` -} \ No newline at end of file +} + +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"` +} diff --git a/internal/app/interactor/interactor.go b/internal/app/interactor/interactor.go index a752d0b..5dcbaee 100644 --- a/internal/app/interactor/interactor.go +++ b/internal/app/interactor/interactor.go @@ -11,6 +11,10 @@ type APInteractor struct { } type UserHandler struct { - Auth ports.IAuth UserService ports.IUserService } + +type UserService struct { + AuthService ports.IAuth + UserRepository ports.IUserRepository +} diff --git a/internal/app/ports/auth_ports.go b/internal/app/ports/auth_ports.go index 9712da4..3a63183 100644 --- a/internal/app/ports/auth_ports.go +++ b/internal/app/ports/auth_ports.go @@ -5,6 +5,6 @@ import ( ) type IAuth interface { - CreateToken(user *entity.User) (*entity.CreateTokenResponse, error) + CreateToken(user *entity.UserORM) (*entity.CreateTokenResponse, error) VerifyToken(tokenString string) error } diff --git a/internal/app/ports/user_ports.go b/internal/app/ports/user_ports.go index 5bfc73f..6b5863f 100644 --- a/internal/app/ports/user_ports.go +++ b/internal/app/ports/user_ports.go @@ -12,7 +12,7 @@ type IUserRepository interface { } type IUserService interface { - Login(ctx context.Context, username string, password string) (*entity.User, error) + Login(ctx context.Context, username string, password string) (*entity.LoginResponse, error) } type IUserHandler interface { diff --git a/internal/app/service/user_service.go b/internal/app/service/user_service.go index a4c59dc..f46f588 100644 --- a/internal/app/service/user_service.go +++ b/internal/app/service/user_service.go @@ -6,22 +6,25 @@ import ( "github.com/opentracing/opentracing-go" "github.com/sirupsen/logrus" "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" "github.com/voltgizerz/POS-restaurant/pkg/logger" ) type UserService struct { + authService ports.IAuth userRepository ports.IUserRepository } -func NewUserService(userRepository ports.IUserRepository) *UserService { +func NewUserService(i interactor.UserService) *UserService { return &UserService{ - userRepository: userRepository, + authService: i.AuthService, + userRepository: i.UserRepository, } } -func (s *UserService) Login(ctx context.Context, username string, password string) (*entity.User, error) { +func (s *UserService) Login(ctx context.Context, username string, password string) (*entity.LoginResponse, error) { span, ctx := opentracing.StartSpanFromContext(ctx, "service.UserService.Login") defer span.Finish() @@ -45,11 +48,25 @@ func (s *UserService) Login(ctx context.Context, username string, password strin return nil, err } - userData := &entity.User{ - ID: user.ID, + tokenData, err := s.authService.CreateToken(user) + if err != nil { + logger.LogStdErr.WithFields(logrus.Fields{ + "username": username, + "error": err, + }).Error("[UserService] error on CreateToken") + + return nil, err + } + + resp := &entity.LoginResponse{ + UserID: user.ID, + RoleID: 1, // TODO + Token: tokenData.Token, + TokenType: tokenData.TokenType, + ExpiredAt: tokenData.ExpiredAt, } - return userData, nil + return resp, nil } func (s *UserService) Register(email string, password string, confirmPass string) error {