118 lines
3.5 KiB
Go
118 lines
3.5 KiB
Go
package query
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"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
|
|
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 {
|
|
// Apply your filters here
|
|
if f.Name != "" {
|
|
query = query.Where("name ILIKE ?", "%"+f.Name+"%")
|
|
}
|
|
if f.ClientID != "" {
|
|
query = query.Where("client_id = ?", f.ClientID)
|
|
}
|
|
|
|
if f.GroupID != "" {
|
|
query = query.Joins("JOIN m_maintenance_group_role_users ON m_maintenance_group_role_users.user_id = m_users.id").
|
|
Joins("JOIN m_maintenance_group_roles ON m_maintenance_group_roles.id = m_maintenance_group_role_users.maintenance_group_role_id").
|
|
Where("m_maintenance_group_roles.maintenance_group_id = ?", f.GroupID).
|
|
Where("m_maintenance_group_roles.deleted_at IS NULL")
|
|
}
|
|
|
|
if f.RoleID != "" {
|
|
query = query.Joins("JOIN m_user_roles ON m_user_roles.user_id = m_users.id").
|
|
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")
|
|
})
|
|
|
|
// 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,
|
|
}
|
|
}
|