package repository import ( "fmt" "iris-test/app/models" "gorm.io/gorm" ) type UsersRepository struct { db *gorm.DB } type UserFilter struct { IsActive *bool } func CreateUsersRepository(db *gorm.DB) *UsersRepository { return &UsersRepository{db} } func applyFilter(db *gorm.DB, filter *UserFilter) *gorm.DB { query := db // if filter.State != "" { // query = query.Where("state = ?", filter.State) // } // if filter.SendAt_lt != nil { // query = query.Where("send_at < ?", filter.SendAt_lt) // } // if filter.SendAt_notNull != nil { // query = query.Not(map[string]interface{}{"send_at": nil}) // } return query } func applyPagination(db *gorm.DB, pagination *Pagination) *gorm.DB { query := db if pagination != nil { query.Limit(pagination.PageSize) query.Offset(pagination.PageSize * (pagination.Page - 1)) } return query } func applyOrdering(db *gorm.DB, ordering *[]Ordering) *gorm.DB { query := db if ordering != nil { for _, order := range *ordering { query.Order(fmt.Sprintf("%s %s", order.Field, order.Direction)) } } return query } func (repository *UsersRepository) List(filter *UserFilter, pagination *Pagination, ordering *[]Ordering) *[]models.User { var users []models.User query := repository.db.Model(&models.User{}) query = applyFilter(query, filter) query = applyOrdering(query, ordering) query = applyPagination(query, pagination) query.Find(&users) return &users }