package query import ( "github.com/Caknoooo/go-pagination" "gorm.io/gorm" ) type M_MaintenanceGroup struct { ID string `json:"id"` Name string `json:"name"` Code string `json:"code"` Description string `json:"description"` TotalMaintenanceGroupRole int `json:"total_maintenance_group_role"` } type MaintenanceGroupFilter struct { pagination.BaseFilter Name string `form:"name"` // tambahkan ini Code string `form:"code"` // tambahkan ini Description string `form:"description"` // tambahkan ini ClientID string `form:"client_id"` // tambahkan ini Includes []string `form:"includes"` // tambahkan ini } func (f *MaintenanceGroupFilter) 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) } // 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 // }) // } // } // Hitung total maintenance group role per group query = query.Select("m_maintenance_groups.*, " + "(SELECT COUNT(*) FROM m_maintenance_group_roles mgr WHERE mgr.maintenance_group_id = m_maintenance_groups.id AND mgr.deleted_at IS NULL) as total_maintenance_group_role") return query } func (f *MaintenanceGroupFilter) GetTableName() string { return "m_maintenance_groups" } func (f *MaintenanceGroupFilter) GetSearchFields() []string { return []string{"name"} } func (f *MaintenanceGroupFilter) GetDefaultSort() string { return "id asc" } func (f *MaintenanceGroupFilter) GetIncludes() []string { return f.Includes } func (f *MaintenanceGroupFilter) GetPagination() pagination.PaginationRequest { return f.Pagination } func (f *MaintenanceGroupFilter) Validate() { var validIncludes []string allowedIncludes := f.GetAllowedIncludes() for _, include := range f.Includes { if allowedIncludes[include] { validIncludes = append(validIncludes, include) } } f.Includes = validIncludes } func (f *MaintenanceGroupFilter) GetAllowedIncludes() map[string]bool { return map[string]bool{ "Client": true, } }