From 3197b693b35c7bcdc26b2349aafa2d0117947aa6 Mon Sep 17 00:00:00 2001 From: Habib Fatkhul Rohman Date: Mon, 24 Nov 2025 15:34:15 +0700 Subject: [PATCH] feat: add Level filter to role and user queries for enhanced filtering capabilities --- modules/role/controller/role_controller.go | 8 +++++--- modules/role/query/role_query.go | 8 ++++++++ modules/user/controller/user_controller.go | 6 ++++-- modules/user/query/user_query.go | 11 +++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/modules/role/controller/role_controller.go b/modules/role/controller/role_controller.go index 8c2e0e4..1218d83 100644 --- a/modules/role/controller/role_controller.go +++ b/modules/role/controller/role_controller.go @@ -246,8 +246,13 @@ func (r *roleController) GetRoles(ctx *gin.Context) { var filter = &query.RoleFilter{ ClientID: ctx.Query("client_id"), Name: ctx.Query("name"), + Level: ctx.Query("level"), } + // logrus.Info("Filter: ", filter) + filter.BindPagination(ctx) + ctx.ShouldBindQuery(filter) + if getAll == "true" { // Ambil semua data tanpa paginasi roles, err := r.roleService.GetAll(ctx.Request.Context()) @@ -261,9 +266,6 @@ func (r *roleController) GetRoles(ctx *gin.Context) { ctx.JSON(http.StatusOK, res) return } - // logrus.Info("Filter: ", filter) - filter.BindPagination(ctx) - ctx.ShouldBindQuery(filter) roles, total, err := pagination.PaginatedQueryWithIncludable[query.M_Role](r.db, filter) if err != nil { diff --git a/modules/role/query/role_query.go b/modules/role/query/role_query.go index a9f7749..b7e817d 100644 --- a/modules/role/query/role_query.go +++ b/modules/role/query/role_query.go @@ -2,6 +2,8 @@ package query import ( // "github.com/Caknoooo/go-gin-clean-starter/database/entities" + "strconv" + "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-pagination" "gorm.io/gorm" @@ -24,6 +26,7 @@ type RoleFilter struct { pagination.BaseFilter Name string `form:"name"` // tambahkan ini ClientID string `form:"client_id"` // tambahkan ini + Level string `form:"level"` } func (f *RoleFilter) ApplyFilters(query *gorm.DB) *gorm.DB { @@ -34,6 +37,11 @@ func (f *RoleFilter) ApplyFilters(query *gorm.DB) *gorm.DB { if f.ClientID != "" { query = query.Where("client_id = ?", f.ClientID) } + if f.Level != "" { + if levelInt, err := strconv.Atoi(f.Level); err == nil { + query = query.Where("level = ?", levelInt) + } + } query = query.Model(entities.M_Role{}). Preload("Client", func(db *gorm.DB) *gorm.DB { diff --git a/modules/user/controller/user_controller.go b/modules/user/controller/user_controller.go index 426397a..8036c56 100644 --- a/modules/user/controller/user_controller.go +++ b/modules/user/controller/user_controller.go @@ -250,9 +250,13 @@ func (c *userController) GetAllUser(ctx *gin.Context) { Name: ctx.Query("name"), GroupID: ctx.Query("group_id"), RoleID: ctx.Query("role_id"), + Level: ctx.Query("level"), Includes: []string{"Roles"}, } + filter.BindPagination(ctx) + ctx.ShouldBindQuery(filter) + if getAll == "true" { // Ambil semua data tanpa paginasi users, err := c.userService.GetAll(ctx.Request.Context()) @@ -267,8 +271,6 @@ func (c *userController) GetAllUser(ctx *gin.Context) { return } - 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) diff --git a/modules/user/query/user_query.go b/modules/user/query/user_query.go index 65f043e..c1ac2f7 100644 --- a/modules/user/query/user_query.go +++ b/modules/user/query/user_query.go @@ -1,6 +1,8 @@ package query import ( + "strconv" + "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-pagination" "gorm.io/gorm" @@ -29,6 +31,7 @@ type UserFilter struct { GroupID string `form:"group_id"` // tambahkan ini RoleID string `form:"role_id"` // tambahkan ini Includes []string `form:"includes"` // tambahkan ini + Level string `form:"level"` } func (f *UserFilter) ApplyFilters(query *gorm.DB) *gorm.DB { @@ -52,6 +55,14 @@ func (f *UserFilter) ApplyFilters(query *gorm.DB) *gorm.DB { Where("m_user_roles.role_id = ?", f.RoleID) } + if f.Level != "" { + if levelInt, err := strconv.Atoi(f.Level); err == nil { + query = query.Joins("JOIN m_user_roles ON m_user_roles.user_id = m_users.id"). + Joins("JOIN m_roles ON m_roles.id = m_user_roles.role_id"). + Where("m_roles.level = ?", levelInt) + } + } + // add preload clients query = query.Model(&M_User{}).Preload("Client", func(db *gorm.DB) *gorm.DB { return db.Select("id", "name")