package query import ( "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-pagination" "gorm.io/gorm" ) type M_User struct { ID string `json:"id"` Name string `json:"name"` Username string `json:"username"` Password string `json:"password"` Gender string `json:"gender"` Address string `json:"address"` Phone string `json:"phone"` Email string `json:"email"` PhotoUrl string `json:"photo_url"` ClientID string `json:"client_id"` Client entities.M_Client `json:"client" gorm:"foreignKey:ClientID;references:ID"` // Roles []entities.M_Role `json:"roles" gorm:"many2many:m_user_roles;"` Roles []entities.M_Role `gorm:"many2many:m_user_roles;foreignKey:ID;joinForeignKey:UserID;References:ID;JoinReferences:RoleID" json:"roles"` } type UserFilter struct { pagination.BaseFilter Name string `form:"name"` // tambahkan ini ClientID string `form:"client_id"` // tambahkan ini Includes []string `form:"includes"` // tambahkan ini } func (f *UserFilter) ApplyFilters(query *gorm.DB) *gorm.DB { // Apply your filters here if f.Name != "" { query = query.Where("name ILIKE ?", "%"+f.Name+"%") } if f.ClientID != "" { query = query.Where("client_id = ?", f.ClientID) } // add preload clients query = query.Model(&M_User{}).Preload("Client", func(db *gorm.DB) *gorm.DB { return db.Select("id", "name") }) // Manual preload untuk roles dengan field terbatas // for _, include := range f.Includes { // if include == "Roles" { // query = query.Preload("Roles", func(db *gorm.DB) *gorm.DB { // return db.Select("id", "name") // Hanya ambil id dan name // }) // } // } return query } func (f *UserFilter) GetTableName() string { return "m_users" } func (f *UserFilter) GetSearchFields() []string { return []string{"name"} } func (f *UserFilter) GetDefaultSort() string { return "id asc" } func (f *UserFilter) GetIncludes() []string { return f.Includes } func (f *UserFilter) GetPagination() pagination.PaginationRequest { return f.Pagination } func (f *UserFilter) Validate() { var validIncludes []string allowedIncludes := f.GetAllowedIncludes() for _, include := range f.Includes { if allowedIncludes[include] { validIncludes = append(validIncludes, include) } } f.Includes = validIncludes } func (f *UserFilter) GetAllowedIncludes() map[string]bool { return map[string]bool{ "Roles": true, } }