Skip to content

Commit

Permalink
feat: add server-side search, filter and sorter for all pages (#388)
Browse files Browse the repository at this point in the history
Signed-off-by: Yixiang Zhao <seriouszyx@foxmail.com>

Co-authored-by: Yang Luo <hsluoyz@qq.com>
  • Loading branch information
seriouszyx and hsluoyz committed Dec 25, 2021
1 parent 0d13512 commit 10a85f2
Show file tree
Hide file tree
Showing 43 changed files with 929 additions and 610 deletions.
8 changes: 6 additions & 2 deletions controllers/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ func (c *ApiController) GetApplications() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetApplications(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetApplicationCount(owner)))
applications := object.GetPaginationApplications(owner, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetApplicationCount(owner, field, value)))
applications := object.GetPaginationApplications(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(applications, paginator.Nums())
}
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/organization.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ func (c *ApiController) GetOrganizations() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetMaskedOrganizations(object.GetOrganizations(owner))
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetOrganizationCount(owner)))
organizations := object.GetMaskedOrganizations(object.GetPaginationOrganizations(owner, paginator.Offset(), limit))
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetOrganizationCount(owner, field, value)))
organizations := object.GetMaskedOrganizations(object.GetPaginationOrganizations(owner, paginator.Offset(), limit, field, value, sortField, sortOrder))
c.ResponseOk(organizations, paginator.Nums())
}
}
Expand Down
9 changes: 6 additions & 3 deletions controllers/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ package controllers

import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
Expand All @@ -33,13 +32,17 @@ func (c *ApiController) GetProviders() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetMaskedProviders(object.GetProviders(owner))
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetProviderCount(owner)))
providers := object.GetMaskedProviders(object.GetPaginationProviders(owner, paginator.Offset(), limit))
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetProviderCount(owner, field, value)))
providers := object.GetMaskedProviders(object.GetPaginationProviders(owner, paginator.Offset(), limit, field, value, sortField, sortOrder))
c.ResponseOk(providers, paginator.Nums())
}
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,13 +31,17 @@ import (
func (c *ApiController) GetRecords() {
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetRecords()
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetRecordCount()))
records := object.GetPaginationRecords(paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetRecordCount(field, value)))
records := object.GetPaginationRecords(paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(records, paginator.Nums())
}
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@ func (c *ApiController) GetResources() {
user := c.Input().Get("user")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetResources(owner, user)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetResourceCount(owner, user)))
resources := object.GetPaginationResources(owner, user, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetResourceCount(owner, user, field, value)))
resources := object.GetPaginationResources(owner, user, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(resources, paginator.Nums())
}
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/syncer.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ func (c *ApiController) GetSyncers() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetSyncers(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetSyncerCount(owner)))
syncers := object.GetPaginationSyncers(owner, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetSyncerCount(owner, field, value)))
syncers := object.GetPaginationSyncers(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(syncers, paginator.Nums())
}
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,17 @@ func (c *ApiController) GetTokens() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetTokens(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetTokenCount(owner)))
tokens := object.GetPaginationTokens(owner, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetTokenCount(owner, field, value)))
tokens := object.GetPaginationTokens(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(tokens, paginator.Nums())
}
}
Expand Down
18 changes: 13 additions & 5 deletions controllers/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ import (
func (c *ApiController) GetGlobalUsers() {
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetMaskedUsers(object.GetGlobalUsers())
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetGlobalUserCount()))
users := object.GetPaginationGlobalUsers(paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetGlobalUserCount(field, value)))
users := object.GetPaginationGlobalUsers(paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(users, paginator.Nums())
}
}
Expand All @@ -55,13 +59,17 @@ func (c *ApiController) GetUsers() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetMaskedUsers(object.GetUsers(owner))
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetUserCount(owner)))
users := object.GetPaginationUsers(owner, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetUserCount(owner, field, value)))
users := object.GetPaginationUsers(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(users, paginator.Nums())
}
}
Expand Down Expand Up @@ -322,7 +330,7 @@ func (c *ApiController) GetUserCount() {

count := 0
if isOnline == "" {
count = object.GetUserCount(owner)
count = object.GetUserCount(owner, "", "")
} else {
count = object.GetOnlineUserCount(owner, util.ParseInt(isOnline))
}
Expand Down
8 changes: 6 additions & 2 deletions controllers/webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,17 @@ func (c *ApiController) GetWebhooks() {
owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
field := c.Input().Get("field")
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" {
c.Data["json"] = object.GetWebhooks(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetWebhookCount(owner)))
webhooks := object.GetPaginationWebhooks(owner, paginator.Offset(), limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetWebhookCount(owner, field, value)))
webhooks := object.GetPaginationWebhooks(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(webhooks, paginator.Nums())
}
}
Expand Down
20 changes: 20 additions & 0 deletions object/adapter.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package object

import (
"fmt"
"github.com/casbin/casdoor/util"
"runtime"

"github.com/astaxie/beego"
Expand Down Expand Up @@ -166,3 +167,22 @@ func (a *Adapter) createTable() {
panic(err)
}
}

func GetSession(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session {
session := adapter.Engine.Limit(limit, offset).Where("1=1")
if owner != "" {
session = session.And("owner=?", owner)
}
if field != "" && value != "" {
session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value))
}
if sortField == "" || sortOrder == "" {
sortField = "created_time"
}
if sortOrder == "ascend" {
session = session.Asc(util.SnakeString(sortField))
} else {
session = session.Desc(util.SnakeString(sortField))
}
return session
}
13 changes: 9 additions & 4 deletions object/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,12 @@ type Application struct {
SigninHtml string `xorm:"mediumtext" json:"signinHtml"`
}

func GetApplicationCount(owner string) int {
count, err := adapter.Engine.Count(&Application{Owner: owner})
func GetApplicationCount(owner, field, value string) int {
session := adapter.Engine.Where("owner=?", owner)
if field != "" && value != "" {
session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value))
}
count, err := session.Count(&Application{})
if err != nil {
panic(err)
}
Expand All @@ -72,9 +76,10 @@ func GetApplications(owner string) []*Application {
return applications
}

func GetPaginationApplications(owner string, offset, limit int) []*Application {
func GetPaginationApplications(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Application {
applications := []*Application{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&applications, &Application{Owner: owner})
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&applications)
if err != nil {
panic(err)
}
Expand Down
15 changes: 11 additions & 4 deletions object/organization.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
package object

import (
"fmt"

"github.com/casbin/casdoor/cred"
"github.com/casbin/casdoor/util"
"xorm.io/core"
Expand All @@ -36,8 +38,12 @@ type Organization struct {
EnableSoftDeletion bool `json:"enableSoftDeletion"`
}

func GetOrganizationCount(owner string) int {
count, err := adapter.Engine.Count(&Organization{Owner: owner})
func GetOrganizationCount(owner, field, value string) int {
session := adapter.Engine.Where("owner=?", owner)
if field != "" && value != "" {
session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value))
}
count, err := session.Count(&Organization{})
if err != nil {
panic(err)
}
Expand All @@ -55,9 +61,10 @@ func GetOrganizations(owner string) []*Organization {
return organizations
}

func GetPaginationOrganizations(owner string, offset, limit int) []*Organization {
func GetPaginationOrganizations(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Organization {
organizations := []*Organization{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&organizations, &Provider{Owner: owner})
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&organizations)
if err != nil {
panic(err)
}
Expand Down
13 changes: 9 additions & 4 deletions object/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,8 +80,12 @@ func GetMaskedProviders(providers []*Provider) []*Provider {
return providers
}

func GetProviderCount(owner string) int {
count, err := adapter.Engine.Count(&Provider{Owner: owner})
func GetProviderCount(owner, field, value string) int {
session := adapter.Engine.Where("owner=?", owner)
if field != "" && value != "" {
session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value))
}
count, err := session.Count(&Provider{})
if err != nil {
panic(err)
}
Expand All @@ -99,9 +103,10 @@ func GetProviders(owner string) []*Provider {
return providers
}

func GetPaginationProviders(owner string, offset, limit int) []*Provider {
func GetPaginationProviders(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Provider {
providers := []*Provider{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&providers, &Provider{Owner: owner})
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&providers)
if err != nil {
panic(err)
}
Expand Down
13 changes: 9 additions & 4 deletions object/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,12 @@ func AddRecord(record *Record) bool {
return affected != 0
}

func GetRecordCount() int {
count, err := adapter.Engine.Count(&Record{})
func GetRecordCount(field, value string) int {
session := adapter.Engine.Where("1=1")
if field != "" && value != "" {
session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value))
}
count, err := session.Count(&Record{})
if err != nil {
panic(err)
}
Expand All @@ -118,9 +122,10 @@ func GetRecords() []*Record {
return records
}

func GetPaginationRecords(offset, limit int) []*Record {
func GetPaginationRecords(offset, limit int, field, value, sortField, sortOrder string) []*Record {
records := []*Record{}
err := adapter.Engine.Desc("id").Limit(limit, offset).Find(&records)
session := GetSession("", offset, limit, field, value, sortField, sortOrder)
err := session.Find(&records)
if err != nil {
panic(err)
}
Expand Down
Loading

0 comments on commit 10a85f2

Please sign in to comment.