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{
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 {

View File

@ -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 {

View File

@ -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)

View File

@ -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")