feat: add Level filter to role and user queries for enhanced filtering capabilities
Deploy Application / deploy (push) Successful in 19s Details

This commit is contained in:
Habib Fatkhul Rohman 2025-11-24 15:34:15 +07:00
parent b77eab5ef3
commit 3197b693b3
4 changed files with 28 additions and 5 deletions

View File

@ -246,8 +246,13 @@ func (r *roleController) GetRoles(ctx *gin.Context) {
var filter = &query.RoleFilter{ var filter = &query.RoleFilter{
ClientID: ctx.Query("client_id"), ClientID: ctx.Query("client_id"),
Name: ctx.Query("name"), Name: ctx.Query("name"),
Level: ctx.Query("level"),
} }
// logrus.Info("Filter: ", filter)
filter.BindPagination(ctx)
ctx.ShouldBindQuery(filter)
if getAll == "true" { if getAll == "true" {
// Ambil semua data tanpa paginasi // Ambil semua data tanpa paginasi
roles, err := r.roleService.GetAll(ctx.Request.Context()) roles, err := r.roleService.GetAll(ctx.Request.Context())
@ -261,9 +266,6 @@ func (r *roleController) GetRoles(ctx *gin.Context) {
ctx.JSON(http.StatusOK, res) ctx.JSON(http.StatusOK, res)
return return
} }
// logrus.Info("Filter: ", filter)
filter.BindPagination(ctx)
ctx.ShouldBindQuery(filter)
roles, total, err := pagination.PaginatedQueryWithIncludable[query.M_Role](r.db, filter) roles, total, err := pagination.PaginatedQueryWithIncludable[query.M_Role](r.db, filter)
if err != nil { if err != nil {

View File

@ -2,6 +2,8 @@ package query
import ( import (
// "github.com/Caknoooo/go-gin-clean-starter/database/entities" // "github.com/Caknoooo/go-gin-clean-starter/database/entities"
"strconv"
"github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/Caknoooo/go-pagination" "github.com/Caknoooo/go-pagination"
"gorm.io/gorm" "gorm.io/gorm"
@ -24,6 +26,7 @@ type RoleFilter struct {
pagination.BaseFilter pagination.BaseFilter
Name string `form:"name"` // tambahkan ini Name string `form:"name"` // tambahkan ini
ClientID string `form:"client_id"` // tambahkan ini ClientID string `form:"client_id"` // tambahkan ini
Level string `form:"level"`
} }
func (f *RoleFilter) ApplyFilters(query *gorm.DB) *gorm.DB { 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 != "" { if f.ClientID != "" {
query = query.Where("client_id = ?", 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{}). query = query.Model(entities.M_Role{}).
Preload("Client", func(db *gorm.DB) *gorm.DB { Preload("Client", func(db *gorm.DB) *gorm.DB {

View File

@ -250,9 +250,13 @@ func (c *userController) GetAllUser(ctx *gin.Context) {
Name: ctx.Query("name"), Name: ctx.Query("name"),
GroupID: ctx.Query("group_id"), GroupID: ctx.Query("group_id"),
RoleID: ctx.Query("role_id"), RoleID: ctx.Query("role_id"),
Level: ctx.Query("level"),
Includes: []string{"Roles"}, Includes: []string{"Roles"},
} }
filter.BindPagination(ctx)
ctx.ShouldBindQuery(filter)
if getAll == "true" { if getAll == "true" {
// Ambil semua data tanpa paginasi // Ambil semua data tanpa paginasi
users, err := c.userService.GetAll(ctx.Request.Context()) users, err := c.userService.GetAll(ctx.Request.Context())
@ -267,8 +271,6 @@ func (c *userController) GetAllUser(ctx *gin.Context) {
return return
} }
filter.BindPagination(ctx)
ctx.ShouldBindQuery(filter)
users, total, err := pagination.PaginatedQueryWithIncludable[query.M_User](c.db, filter) users, total, err := pagination.PaginatedQueryWithIncludable[query.M_User](c.db, filter)
if err != nil { if err != nil {
res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_USER, err.Error(), nil) res := utils.BuildResponseFailed(dto.MESSAGE_FAILED_GET_USER, err.Error(), nil)

View File

@ -1,6 +1,8 @@
package query package query
import ( import (
"strconv"
"github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-gin-clean-starter/database/entities"
"github.com/Caknoooo/go-pagination" "github.com/Caknoooo/go-pagination"
"gorm.io/gorm" "gorm.io/gorm"
@ -29,6 +31,7 @@ type UserFilter struct {
GroupID string `form:"group_id"` // tambahkan ini GroupID string `form:"group_id"` // tambahkan ini
RoleID string `form:"role_id"` // tambahkan ini RoleID string `form:"role_id"` // tambahkan ini
Includes []string `form:"includes"` // tambahkan ini Includes []string `form:"includes"` // tambahkan ini
Level string `form:"level"`
} }
func (f *UserFilter) ApplyFilters(query *gorm.DB) *gorm.DB { 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) 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 // add preload clients
query = query.Model(&M_User{}).Preload("Client", func(db *gorm.DB) *gorm.DB { query = query.Model(&M_User{}).Preload("Client", func(db *gorm.DB) *gorm.DB {
return db.Select("id", "name") return db.Select("id", "name")