wms-be/modules/user/controller/user_controller.go

226 lines
7.0 KiB
Go

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"
"github.com/sirupsen/logrus"
"gorm.io/gorm"
)
type (
UserController interface {
Register(ctx *gin.Context)
Login(ctx *gin.Context)
Me(ctx *gin.Context)
GetUserById(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) {
clientId := ctx.MustGet("client_id").(string)
logrus.Info("Client ID: ", clientId)
var filter = &query.UserFilter{
ClientID: clientId,
Name: ctx.Query("name"), // example additional filter
}
logrus.Info("Filter: ", filter)
filter.BindPagination(ctx)
ctx.ShouldBindQuery(filter)
users, total, err := pagination.PaginatedQueryWithIncludable[query.M_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) GetUserById(ctx *gin.Context) {
userId := ctx.Param("id")
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)
}