diff --git a/app/repository/ordering.go b/app/repository/ordering.go new file mode 100644 index 0000000..3ec3c7f --- /dev/null +++ b/app/repository/ordering.go @@ -0,0 +1,16 @@ +package repository + +const ORDERING_ASC = "asc" +const ORDERING_DESC = "desc" + +type Ordering struct { + Field string + Direction string +} + +func NewOrdering(field string, direction string) Ordering { + return Ordering{ + Field: field, + Direction: direction, + } +} diff --git a/app/repository/pagination.go b/app/repository/pagination.go index 3b1c3eb..4af1e44 100644 --- a/app/repository/pagination.go +++ b/app/repository/pagination.go @@ -5,8 +5,9 @@ type Pagination struct { Page int } -func (p *Pagination) New() *Pagination { - p.PageSize = 50 - p.Page = 1 - return p +func NewPagination() Pagination { + return Pagination{ + PageSize: 50, + Page: 1, + } } diff --git a/app/repository/users.go b/app/repository/users.go index 5515f73..71e31b6 100644 --- a/app/repository/users.go +++ b/app/repository/users.go @@ -1,6 +1,7 @@ package repository import ( + "fmt" "iris-test/app/models" "gorm.io/gorm" @@ -34,11 +35,36 @@ func applyFilter(db *gorm.DB, filter *UserFilter) *gorm.DB { return query } -func (repository *UsersRepository) List(filter *UserFilter) *[]models.User { +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 diff --git a/app/views/users.go b/app/views/users.go index ed34041..5c51439 100644 --- a/app/views/users.go +++ b/app/views/users.go @@ -12,7 +12,13 @@ func GetUsersPage(ctx iris.Context) { userRepository := repository.Dao.UsersRepository - users := userRepository.List(&repository.UserFilter{}) + pagination := repository.NewPagination() + ordering := []repository.Ordering{ + repository.NewOrdering("first_name", repository.ORDERING_ASC), + repository.NewOrdering("last_name", repository.ORDERING_ASC), + } + + users := userRepository.List(&repository.UserFilter{}, &pagination, &ordering) ctx.ViewData("users", users)