package query import ( "github.com/Caknoooo/go-gin-clean-starter/database/entities" "github.com/Caknoooo/go-pagination" "github.com/sirupsen/logrus" "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"` ClientID string `json:"client_id"` // <-- Add this line Client entities.M_Client `gorm:"foreignKey:ClientID;references:ID" json:"client"` MaintenanceGroupRoles []entities.M_MaintenanceGroupRole `gorm:"foreignKey:MaintenanceGroupID;references:ID" json:"maintenance_group_roles"` } 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 { // ...existing code... if f.Name != "" { query = query.Where("name ILIKE ?", "%"+f.Name+"%") } if f.ClientID != "" { query = query.Where("client_id = ?", f.ClientID) logrus.Infof("Filtering by ClientID: %s", f.ClientID) } // Ganti ini: // query = query.Model(entities.M_MaintenanceGroup{}).Preload("Client") // Jadi: query = query.Model(&M_MaintenanceGroup{}). Preload("Client"). Preload("MaintenanceGroupRoles"). Preload("MaintenanceGroupRoles.Role") 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, } }