Skip to content

Commit

Permalink
feat: add server-side pagination (#312)
Browse files Browse the repository at this point in the history
Signed-off-by: “seriouszyx” <seriouszyx@foxmail.com>
  • Loading branch information
seriouszyx committed Nov 6, 2021
1 parent 7520b71 commit b1db47b
Show file tree
Hide file tree
Showing 28 changed files with 444 additions and 103 deletions.
17 changes: 14 additions & 3 deletions controllers/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ package controllers

import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

// GetApplications
Expand All @@ -27,9 +30,17 @@ import (
// @router /get-applications [get]
func (c *ApiController) GetApplications() {
owner := c.Input().Get("owner")

c.Data["json"] = object.GetApplications(owner)
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(applications, paginator.Nums())
}
}

// GetApplication
Expand Down
16 changes: 13 additions & 3 deletions controllers/organization.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ package controllers
import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

// GetOrganizations ...
Expand All @@ -28,9 +30,17 @@ import (
// @router /get-organizations [get]
func (c *ApiController) GetOrganizations() {
owner := c.Input().Get("owner")

c.Data["json"] = object.GetOrganizations(owner)
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
if limit == "" || page == "" {
c.Data["json"] = object.GetOrganizations(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetOrganizationCount(owner)))
organizations := object.GetPaginationOrganizations(owner, paginator.Offset(), limit)
c.ResponseOk(organizations, paginator.Nums())
}
}

// GetOrganization ...
Expand Down
16 changes: 13 additions & 3 deletions controllers/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ package controllers
import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

// GetProviders
Expand All @@ -28,9 +30,17 @@ import (
// @router /get-providers [get]
func (c *ApiController) GetProviders() {
owner := c.Input().Get("owner")

c.Data["json"] = object.GetProviders(owner)
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
if limit == "" || page == "" {
c.Data["json"] = object.GetProviders(owner)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetProviderCount(owner)))
providers := object.GetPaginationProviders(owner, paginator.Offset(), limit)
c.ResponseOk(providers, paginator.Nums())
}
}

// @Title GetProvider
Expand Down
17 changes: 15 additions & 2 deletions controllers/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,30 @@ package controllers
import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

// GetRecords
// @Title GetRecords
// @Description get all records
// @Param pageSize query string true "The size of each page"
// @Param p query string true "The number of the page"
// @Success 200 {array} object.Records The Response object
// @router /get-records [get]
func (c *ApiController) GetRecords() {
c.Data["json"] = object.GetRecords()
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(records, paginator.Nums())
}
}

// GetRecordsByFilter
Expand Down
15 changes: 12 additions & 3 deletions controllers/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,25 @@ import (
"mime"
"path/filepath"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

func (c *ApiController) GetResources() {
owner := c.Input().Get("owner")
user := c.Input().Get("user")

c.Data["json"] = object.GetResources(owner, user)
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(resources, paginator.Nums())
}
}

func (c *ApiController) GetResource() {
Expand Down
18 changes: 15 additions & 3 deletions controllers/token.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,20 +17,32 @@ package controllers
import (
"encoding/json"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/util"
)

// GetTokens
// @Title GetTokens
// @Description get tokens
// @Param owner query string true "The owner of tokens"
// @Param pageSize query string true "The size of each page"
// @Param p query string true "The number of the page"
// @Success 200 {array} object.Token The Response object
// @router /get-tokens [get]
func (c *ApiController) GetTokens() {
owner := c.Input().Get("owner")

c.Data["json"] = object.GetTokens(owner)
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(tokens, paginator.Nums())
}
}

// GetToken
Expand Down
29 changes: 24 additions & 5 deletions controllers/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ import (
"fmt"
"strings"

"github.com/astaxie/beego/utils/pagination"
"github.com/casbin/casdoor/object"
"github.com/casbin/casdoor/original"
"github.com/casbin/casdoor/util"
)

// GetGlobalUsers
Expand All @@ -29,8 +31,17 @@ import (
// @Success 200 {array} object.User The Response object
// @router /get-global-users [get]
func (c *ApiController) GetGlobalUsers() {
c.Data["json"] = object.GetMaskedUsers(object.GetGlobalUsers())
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(users, paginator.Nums())
}
}

// GetUsers
Expand All @@ -41,9 +52,17 @@ func (c *ApiController) GetGlobalUsers() {
// @router /get-users [get]
func (c *ApiController) GetUsers() {
owner := c.Input().Get("owner")

c.Data["json"] = object.GetMaskedUsers(object.GetUsers(owner))
c.ServeJSON()
limit := c.Input().Get("pageSize")
page := c.Input().Get("p")
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)
c.ResponseOk(users, paginator.Nums())
}
}

// GetUser
Expand Down
19 changes: 19 additions & 0 deletions object/application.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ type Application struct {
SigninHtml string `xorm:"mediumtext" json:"signinHtml"`
}

func GetApplicationCount(owner string) int {
count, err := adapter.Engine.Count(&Application{Owner: owner})
if err != nil {
panic(err)
}

return int(count)
}

func GetApplications(owner string) []*Application {
applications := []*Application{}
err := adapter.Engine.Desc("created_time").Find(&applications, &Application{Owner: owner})
Expand All @@ -58,6 +67,16 @@ func GetApplications(owner string) []*Application {
return applications
}

func GetPaginationApplications(owner string, offset, limit int) []*Application {
applications := []*Application{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&applications, &Application{Owner: owner})
if err != nil {
panic(err)
}

return applications
}

func getProviderMap(owner string) map[string]*Provider {
providers := GetProviders(owner)
m := map[string]*Provider{}
Expand Down
21 changes: 20 additions & 1 deletion object/organization.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ type Organization struct {
DefaultAvatar string `xorm:"varchar(100)" json:"defaultAvatar"`
}

func GetOrganizationCount(owner string) int {
count, err := adapter.Engine.Count(&Organization{Owner: owner})
if err != nil {
panic(err)
}

return int(count)
}

func GetOrganizations(owner string) []*Organization {
organizations := []*Organization{}
err := adapter.Engine.Desc("created_time").Find(&organizations, &Organization{Owner: owner})
Expand All @@ -43,6 +52,16 @@ func GetOrganizations(owner string) []*Organization {
return organizations
}

func GetPaginationOrganizations(owner string, offset, limit int) []*Organization {
organizations := []*Organization{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&organizations, &Provider{Owner: owner})
if err != nil {
panic(err)
}

return organizations
}

func getOrganization(owner string, name string) *Organization {
if owner == "" || name == "" {
return nil
Expand All @@ -57,7 +76,7 @@ func getOrganization(owner string, name string) *Organization {
if existed {
return &organization
}

return nil
}

Expand Down
19 changes: 19 additions & 0 deletions object/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,15 @@ func getMaskedProvider(provider *Provider) *Provider {
return p
}

func GetProviderCount(owner string) int {
count, err := adapter.Engine.Count(&Provider{Owner: owner})
if err != nil {
panic(err)
}

return int(count)
}

func GetProviders(owner string) []*Provider {
providers := []*Provider{}
err := adapter.Engine.Desc("created_time").Find(&providers, &Provider{Owner: owner})
Expand All @@ -74,6 +83,16 @@ func GetProviders(owner string) []*Provider {
return providers
}

func GetPaginationProviders(owner string, offset, limit int) []*Provider {
providers := []*Provider{}
err := adapter.Engine.Desc("created_time").Limit(limit, offset).Find(&providers, &Provider{Owner: owner})
if err != nil {
panic(err)
}

return providers
}

func getProvider(owner string, name string) *Provider {
if owner == "" || name == "" {
return nil
Expand Down
10 changes: 10 additions & 0 deletions object/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,16 @@ func GetRecords() []*Records {
return records
}

func GetPaginationRecords(offset, limit int) []*Records {
records := []*Records{}
err := adapter.Engine.Desc("id").Limit(limit, offset).Find(&records)
if err != nil {
panic(err)
}

return records
}

func GetRecordsByField(record *Records) []*Records {
records := []*Records{}
err := adapter.Engine.Find(&records, record)
Expand Down
Loading

0 comments on commit b1db47b

Please sign in to comment.