diff --git a/.air.toml b/.air.toml index d7f3686..9bd51d9 100644 --- a/.air.toml +++ b/.air.toml @@ -4,8 +4,8 @@ tmp_dir = "tmp" [build] args_bin = [] - bin = "./tmp/main" - cmd = "go build -o ./tmp/main ./cmd/main.go" + bin = "./tmp/main.exe" + cmd = "go build -o ./tmp/main.exe ./cmd/main.go" delay = 1000 exclude_dir = ["assets", "tmp", "vendor", "testdata"] exclude_file = [] diff --git a/cmd/server/fiber_server.go b/cmd/server/fiber_server.go index 0da7621..ff558a3 100644 --- a/cmd/server/fiber_server.go +++ b/cmd/server/fiber_server.go @@ -119,6 +119,7 @@ func (s *FiberHttpServer) initUserRouter(router fiber.Router, httpHandler handle userRouter := router.Group("/users") userRouter.Get("/", httpHandler.User().GetAllUsers) + userRouter.Get("/:user_id", httpHandler.Middleware().IsLogin, httpHandler.Middleware().SuperAdmin, httpHandler.User().GetUserByID) userRouter.Post("/", httpHandler.Middleware().IsLogin, httpHandler.Middleware().SuperAdmin, httpHandler.User().CreateUser) userRouter.Patch("/", httpHandler.Middleware().IsLogin, httpHandler.User().UpdateProfile) userRouter.Put("/:user_id", httpHandler.Middleware().IsLogin, httpHandler.Middleware().SuperAdmin, httpHandler.User().UpdateUserByID) diff --git a/internal/domain/usecases/user_usecase.go b/internal/domain/usecases/user_usecase.go index b354031..7757abd 100644 --- a/internal/domain/usecases/user_usecase.go +++ b/internal/domain/usecases/user_usecase.go @@ -36,7 +36,30 @@ func (u *userUsecase) GetAllUsers(req *dtos.UserDTO) (*[]dtos.UserDTO, *apperror } func (u *userUsecase) GetUserByID(req *dtos.UserDTO, userID string) (*dtos.UserDTO, *apperror.AppError) { - return nil, nil + role, err := utils.GetRole(req.Role) + if err != nil { + u.logger.Named("GetUserByID").Error(constant.ErrInvalidRole, zap.String("role", req.Role), zap.Error(err)) + return nil, apperror.BadRequestError(constant.ErrInvalidRole) + } + res, err := u.userRepository.FindUserByID(userID) + if err != nil { + u.logger.Named("GetUserByID").Error(constant.ErrFindUserByID, zap.String("userID", req.ID), zap.Error(err)) + return nil, apperror.NotFoundError(constant.ErrFindUserByID) + } + if res.RoleID != role { + u.logger.Named("GetUserByID").Error(constant.ErrInvalidRole, zap.String("role", req.Role), zap.Error(err)) + return nil, apperror.ForbiddenError(constant.ErrInvalidRole) + } + res_return := dtos.UserDTO{ + ID: res.ID, + FirstName: res.FirstName, + LastName: res.LastName, + Role: res.RoleID, + CreatedAt: res.CreatedAt, + UpdatedAt: res.UpdatedAt, + } + return &res_return, nil + } func (u *userUsecase) CreateUser(req *dtos.UserDTO, createUserDTO *dtos.CreateUserDTO) *apperror.AppError { diff --git a/internal/interface/handlers/user_handler.go b/internal/interface/handlers/user_handler.go index 7e84d5d..edc1dda 100644 --- a/internal/interface/handlers/user_handler.go +++ b/internal/interface/handlers/user_handler.go @@ -43,7 +43,13 @@ func (h *UserHandler) GetAllUsers(c *fiber.Ctx) error { // @Failure 500 {object} response.Response // @Router /users/{user_id} [get] func (h *UserHandler) GetUserByID(c *fiber.Ctx) error { - return nil + userID := c.Params("user_id") // how to get this? + req := c.Locals("user").(*dtos.UserDTO) + res, err := h.userUsecase.GetUserByID(req, userID) + if err != nil { + return err + } + return c.JSON(res) } // CreateUser godoc diff --git a/utils/constant/error_constant.go b/utils/constant/error_constant.go index 19e1148..f4c4bc6 100644 --- a/utils/constant/error_constant.go +++ b/utils/constant/error_constant.go @@ -4,6 +4,7 @@ var ( // user error ErrUserAlreadyExists = "user already exists" ErrUserNotFound = "user not found" + ErrRoleNotFound = "role not found" ErrHashPasswordFailed = "failed to hash password" ErrInsertUserFailed = "failed to insert user" ErrFindUserByID = "failed to find user by ID"