72 lines
1.4 KiB
Go
72 lines
1.4 KiB
Go
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
|
|
}
|