package controller import ( "net/http" authDto "github.com/Caknoooo/go-gin-clean-starter/modules/auth/dto" "github.com/Caknoooo/go-gin-clean-starter/modules/user/dto" "github.com/Caknoooo/go-gin-clean-starter/modules/user/query" "github.com/Caknoooo/go-gin-clean-starter/modules/user/service" "github.com/Caknoooo/go-gin-clean-starter/pkg/constants" "github.com/Caknoooo/go-gin-clean-starter/pkg/utils" "github.com/Caknoooo/go-pagination" "github.com/gin-gonic/gin" "github.com/samber/do" "gorm.io/gorm" ) type ( UserController interface { Register(ctx *gin.Context) Login(ctx *gin.Context) Me(ctx *gin.Context) Refresh(ctx *gin.Context) GetAllUser(ctx *gin.Context) SendVerificationEmail(ctx *gin.Context) VerifyEmail(ctx *gin.Context) Update(ctx *gin.Context) Delete(ctx *gin.Context) } userController struct { userService service.UserService db *gorm.DB } ) func NewUserController(injector *do.Injector, us service.UserService) UserController { db := do.MustInvokeNamed[*gorm.DB](injector, constants.DB) return &userController{ userService: us, db: db, } } func (c *userController) Register(ctx *gin.Context) { var user dto.UserCreateRequest if err := ctx.ShouldBind(&user); err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_DATA_FROM_BODY, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusBadRequest, res) return } result, err := c.userService.Register(ctx.Request.Context(), user) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_REGISTER_USER, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_REGISTER_USER, result) ctx.JSON(http.StatusOK, res) } func (c *userController) GetAllUser(ctx *gin.Context) { tenantId := ctx.MustGet("tenant_id").(string) var filter = &query.UserFilter{ TenantID: tenantId, Name: ctx.Query("name"), // ambil parameter name dari query string } filter.BindPagination(ctx) ctx.ShouldBindQuery(filter) users, total, err := pagination.PaginatedQueryWithIncludable[query.User](c.db, filter) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_USER, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) return } paginationResponse := pagination.CalculatePagination(filter.Pagination, total) response := pagination.NewPaginatedResponse(http.StatusOK, dto.MESSAGE_SUCCESS_GET_LIST_USER, users, paginationResponse) ctx.JSON(http.StatusOK, response) } func (c *userController) Me(ctx *gin.Context) { userId := ctx.MustGet("user_id").(string) result, err := c.userService.GetUserById(ctx.Request.Context(), userId) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_USER, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_GET_USER, result) ctx.JSON(http.StatusOK, res) } func (c *userController) Login(ctx *gin.Context) { var req dto.UserLoginRequest if err := ctx.ShouldBind(&req); err != nil { response := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_DATA_FROM_BODY, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusBadRequest, response) return } result, err := c.userService.Verify(ctx.Request.Context(), req) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_LOGIN, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_LOGIN, result) ctx.JSON(http.StatusOK, res) } func (c *userController) SendVerificationEmail(ctx *gin.Context) { var req dto.SendVerificationEmailRequest 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 } err := c.userService.SendVerificationEmail(ctx.Request.Context(), req) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_PROSES_REQUEST, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SEND_VERIFICATION_EMAIL_SUCCESS, nil) ctx.JSON(http.StatusOK, res) } func (c *userController) VerifyEmail(ctx *gin.Context) { var req dto.VerifyEmailRequest 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 } result, err := c.userService.VerifyEmail(ctx.Request.Context(), req) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_VERIFY_EMAIL, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_VERIFY_EMAIL, result) ctx.JSON(http.StatusOK, res) } func (c *userController) Update(ctx *gin.Context) { var req dto.UserUpdateRequest 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 } userId := ctx.MustGet("user_id").(string) result, err := c.userService.Update(ctx.Request.Context(), req, userId) if err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_UPDATE_USER, err.Error(), nil) ctx.JSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_UPDATE_USER, result) ctx.JSON(http.StatusOK, res) } func (c *userController) Delete(ctx *gin.Context) { userId := ctx.MustGet("user_id").(string) if err := c.userService.Delete(ctx.Request.Context(), userId); err != nil { res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_DELETE_USER, err.Error(), nil) ctx.AbortWithStatusJSON(http.StatusBadRequest, res) return } res := utils.BuildResponseSuccess(dto.MESSAGE_SUCCESS_DELETE_USER, nil) ctx.JSON(http.StatusOK, res) } func (c *userController) Refresh(ctx *gin.Context) { var req authDto.RefreshTokenRequest 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 } result, err := c.userService.RefreshToken(ctx.Request.Context(), req) if err != nil { res := utils.BuildResponseFailed(authDto.MESSAGE_FAILED_REFRESH_TOKEN, err.Error(), nil) ctx.JSON(http.StatusUnauthorized, res) return } res := utils.BuildResponseSuccess(authDto.MESSAGE_SUCCESS_REFRESH_TOKEN, result) ctx.JSON(http.StatusOK, res) }