From 795d8d05e3efa76f23c76158c27a0a4f2e830eab Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Mon, 3 Nov 2025 15:37:18 +0700 Subject: [PATCH] feat(user): Implement user creation functionality in UserController and UserService --- modules/user/controller/user_controller.go | 19 ++++++++ modules/user/routes.go | 2 +- modules/user/service/user_service.go | 50 ++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/modules/user/controller/user_controller.go b/modules/user/controller/user_controller.go index 08c260e..45e4ea8 100644 --- a/modules/user/controller/user_controller.go +++ b/modules/user/controller/user_controller.go @@ -28,6 +28,7 @@ type ( VerifyEmail(ctx *gin.Context) Update(ctx *gin.Context) Delete(ctx *gin.Context) + Create(ctx *gin.Context) } userController struct { @@ -36,6 +37,24 @@ type ( } ) +// Create implements UserController. +func (c *userController) Create(ctx *gin.Context) { + var req dto.UserCreateRequest + if err := ctx.ShouldBind(&req); err != nil { + res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_DATA_FROM_BODY, err.Error(), nil) + ctx.AbortWithStatusJSON(http.StatusBadRequest, res) + return + } + created, err := c.userService.Register(ctx.Request.Context(), req) + if err != nil { + res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_REGISTER_USER, err.Error(), nil) + ctx.JSON(http.StatusInternalServerError, res) + return + } + res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_REGISTER_USER, created) + ctx.JSON(http.StatusOK, res) +} + func NewUserController(injector *do.Injector, us service.UserService) UserController { db := do.MustInvokeNamed[*gorm.DB](injector, constants.DB) return &userController{ diff --git a/modules/user/routes.go b/modules/user/routes.go index 1550dec..4939377 100644 --- a/modules/user/routes.go +++ b/modules/user/routes.go @@ -15,7 +15,7 @@ func RegisterRoutes(server *gin.Engine, injector *do.Injector) { userRoutes := server.Group("/api/v1/users") { - // userRoutes.POST("", userController.Register) + userRoutes.POST("", middlewares.Authenticate(jwtService), userController.Create) // userRoutes.POST("/login", userController.Login) // userRoutes.POST("/verify-email", userController.VerifyEmail) userRoutes.GET("", middlewares.Authenticate(jwtService), userController.GetAllUser) diff --git a/modules/user/service/user_service.go b/modules/user/service/user_service.go index 42736c8..a8bf98a 100644 --- a/modules/user/service/user_service.go +++ b/modules/user/service/user_service.go @@ -19,6 +19,7 @@ import ( ) type UserService interface { + Create(ctx context.Context, req dto.UserCreateRequest) (dto.UserResponse, error) Register(ctx context.Context, req dto.UserCreateRequest) (dto.UserResponse, error) GetUserById(ctx context.Context, userId string) (dto.UserResponse, error) Verify(ctx context.Context, req dto.UserLoginRequest) (authDto.TokenResponse, error) @@ -37,6 +38,55 @@ type userService struct { db *gorm.DB } +// Create implements UserService. +// Create implements UserService. +func (s *userService) Create(ctx context.Context, req dto.UserCreateRequest) (dto.UserResponse, error) { + // Cek apakah email sudah terdaftar + // _, exists, err := s.userRepository.CheckEmail(ctx, s.db, req.Email) + // if err != nil && err != gorm.ErrRecordNotFound { + // return dto.UserResponse{}, err + // } + // if exists { + // return dto.UserResponse{}, dto.ErrEmailAlreadyExists + // } + + // Hash password + hashedPassword, err := utils.HashPassword(req.Password) + if err != nil { + return dto.UserResponse{}, err + } + + user := entities.M_User{ + Name: req.Name, + Username: req.Username, + Email: req.Email, + Password: hashedPassword, + Gender: req.Gender, + Address: req.Address, + Phone: req.Phone, + PhotoUrl: req.PhotoUrl, + ClientID: req.ClientID, + MaintenanceGroupUserID: req.MaintenanceGroupUserID, + LocationID: req.LocationID, + } + + createdUser, err := s.userRepository.Register(ctx, s.db, user) + if err != nil { + return dto.UserResponse{}, err + } + + return dto.UserResponse{ + ID: createdUser.ID.String(), + Name: createdUser.Name, + Username: createdUser.Username, + Email: createdUser.Email, + Phone: createdUser.Phone, + Gender: createdUser.Gender, + Address: createdUser.Address, + PhotoUrl: createdUser.PhotoUrl, + }, nil +} + func NewUserService( userRepo repository.UserRepository, refreshTokenRepo authRepo.RefreshTokenRepository,