Skip to content

Commit 0049e13

Browse files
authored
Merge pull request #108 from authorizerdev/feat/pagination
feat: add pagination for users & verification_requests
2 parents 82bc389 + 9bd185a commit 0049e13

File tree

19 files changed

+984
-122
lines changed

19 files changed

+984
-122
lines changed

server/constants/pagination.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package constants
2+
3+
// DefaultLimit is the default limit for pagination
4+
var DefaultLimit = 10

server/db/models/verification_requests.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package models
22

3+
import "github.com/authorizerdev/authorizer/server/graph/model"
4+
35
// VerificationRequest model for db
46
type VerificationRequest struct {
57
Key string `json:"_key,omitempty" bson:"_key"` // for arangodb
@@ -11,3 +13,15 @@ type VerificationRequest struct {
1113
UpdatedAt int64 `gorm:"autoUpdateTime" json:"updated_at" bson:"updated_at"`
1214
Email string `gorm:"uniqueIndex:idx_email_identifier" json:"email" bson:"email"`
1315
}
16+
17+
func (v *VerificationRequest) AsAPIVerificationRequest() *model.VerificationRequest {
18+
return &model.VerificationRequest{
19+
ID: v.ID,
20+
Token: &v.Token,
21+
Identifier: &v.Identifier,
22+
Expires: &v.ExpiresAt,
23+
CreatedAt: &v.CreatedAt,
24+
UpdatedAt: &v.UpdatedAt,
25+
Email: &v.Email,
26+
}
27+
}

server/db/providers/arangodb/user.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package arangodb
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"strings"
@@ -11,6 +12,7 @@ import (
1112
"github.com/authorizerdev/authorizer/server/constants"
1213
"github.com/authorizerdev/authorizer/server/db/models"
1314
"github.com/authorizerdev/authorizer/server/envstore"
15+
"github.com/authorizerdev/authorizer/server/graph/model"
1416
"github.com/google/uuid"
1517
)
1618

@@ -66,32 +68,40 @@ func (p *provider) DeleteUser(user models.User) error {
6668
}
6769

6870
// ListUsers to get list of users from database
69-
func (p *provider) ListUsers() ([]models.User, error) {
70-
var users []models.User
71-
query := fmt.Sprintf("FOR d in %s RETURN d", models.Collections.User)
71+
func (p *provider) ListUsers(pagination model.Pagination) (*model.Users, error) {
72+
var users []*model.User
73+
ctx := driver.WithQueryFullCount(context.Background())
7274

73-
cursor, err := p.db.Query(nil, query, nil)
75+
query := fmt.Sprintf("FOR d in %s SORT d.created_at DESC LIMIT %d, %d RETURN d", models.Collections.User, pagination.Offset, pagination.Limit)
76+
77+
cursor, err := p.db.Query(ctx, query, nil)
7478
if err != nil {
75-
return users, err
79+
return nil, err
7680
}
7781
defer cursor.Close()
7882

83+
paginationClone := pagination
84+
paginationClone.Total = cursor.Statistics().FullCount()
85+
7986
for {
8087
var user models.User
8188
meta, err := cursor.ReadDocument(nil, &user)
8289

83-
if driver.IsNoMoreDocuments(err) {
90+
if arangoDriver.IsNoMoreDocuments(err) {
8491
break
8592
} else if err != nil {
86-
return users, err
93+
return nil, err
8794
}
8895

8996
if meta.Key != "" {
90-
users = append(users, user)
97+
users = append(users, user.AsAPIUser())
9198
}
9299
}
93100

94-
return users, nil
101+
return &model.Users{
102+
Pagination: &paginationClone,
103+
Users: users,
104+
}, nil
95105
}
96106

97107
// GetUserByEmail to get user information from database using email address

server/db/providers/arangodb/verification_requests.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package arangodb
22

33
import (
4+
"context"
45
"fmt"
56
"log"
67
"time"
78

89
"github.com/arangodb/go-driver"
910
"github.com/authorizerdev/authorizer/server/db/models"
11+
"github.com/authorizerdev/authorizer/server/graph/model"
1012
"github.com/google/uuid"
1113
)
1214

@@ -93,34 +95,40 @@ func (p *provider) GetVerificationRequestByEmail(email string, identifier string
9395
}
9496

9597
// ListVerificationRequests to get list of verification requests from database
96-
func (p *provider) ListVerificationRequests() ([]models.VerificationRequest, error) {
97-
var verificationRequests []models.VerificationRequest
98+
func (p *provider) ListVerificationRequests(pagination model.Pagination) (*model.VerificationRequests, error) {
99+
var verificationRequests []*model.VerificationRequest
100+
ctx := driver.WithQueryFullCount(context.Background())
101+
query := fmt.Sprintf("FOR d in %s SORT d.created_at DESC LIMIT %d, %d RETURN d", models.Collections.VerificationRequest, pagination.Offset, pagination.Limit)
98102

99-
query := fmt.Sprintf("FOR d in %s RETURN d", models.Collections.VerificationRequest)
100-
101-
cursor, err := p.db.Query(nil, query, nil)
103+
cursor, err := p.db.Query(ctx, query, nil)
102104
if err != nil {
103-
return verificationRequests, err
105+
return nil, err
104106
}
105107
defer cursor.Close()
106108

109+
paginationClone := pagination
110+
paginationClone.Total = cursor.Statistics().FullCount()
111+
107112
for {
108113
var verificationRequest models.VerificationRequest
109114
meta, err := cursor.ReadDocument(nil, &verificationRequest)
110115

111116
if driver.IsNoMoreDocuments(err) {
112117
break
113118
} else if err != nil {
114-
return verificationRequests, err
119+
return nil, err
115120
}
116121

117122
if meta.Key != "" {
118-
verificationRequests = append(verificationRequests, verificationRequest)
123+
verificationRequests = append(verificationRequests, verificationRequest.AsAPIVerificationRequest())
119124
}
120125

121126
}
122127

123-
return verificationRequests, nil
128+
return &model.VerificationRequests{
129+
VerificationRequests: verificationRequests,
130+
Pagination: &paginationClone,
131+
}, nil
124132
}
125133

126134
// DeleteVerificationRequest to delete verification request from database

server/db/providers/mongodb/user.go

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/authorizerdev/authorizer/server/constants"
99
"github.com/authorizerdev/authorizer/server/db/models"
1010
"github.com/authorizerdev/authorizer/server/envstore"
11+
"github.com/authorizerdev/authorizer/server/graph/model"
1112
"github.com/google/uuid"
1213
"go.mongodb.org/mongo-driver/bson"
1314
"go.mongodb.org/mongo-driver/mongo/options"
@@ -60,26 +61,45 @@ func (p *provider) DeleteUser(user models.User) error {
6061
}
6162

6263
// ListUsers to get list of users from database
63-
func (p *provider) ListUsers() ([]models.User, error) {
64-
var users []models.User
64+
func (p *provider) ListUsers(pagination model.Pagination) (*model.Users, error) {
65+
var users []*model.User
66+
opts := options.Find()
67+
opts.SetLimit(pagination.Limit)
68+
opts.SetSkip(pagination.Offset)
69+
opts.SetSort(bson.M{"created_at": -1})
70+
71+
paginationClone := pagination
72+
// TODO add pagination total
73+
6574
userCollection := p.db.Collection(models.Collections.User, options.Collection())
66-
cursor, err := userCollection.Find(nil, bson.M{}, options.Find())
75+
count, err := userCollection.CountDocuments(nil, bson.M{}, options.Count())
76+
if err != nil {
77+
log.Println("error getting total users:", err)
78+
return nil, err
79+
}
80+
81+
paginationClone.Total = count
82+
83+
cursor, err := userCollection.Find(nil, bson.M{}, opts)
6784
if err != nil {
6885
log.Println("error getting users:", err)
69-
return users, err
86+
return nil, err
7087
}
7188
defer cursor.Close(nil)
7289

7390
for cursor.Next(nil) {
7491
var user models.User
7592
err := cursor.Decode(&user)
7693
if err != nil {
77-
return users, err
94+
return nil, err
7895
}
79-
users = append(users, user)
96+
users = append(users, user.AsAPIUser())
8097
}
8198

82-
return users, nil
99+
return &model.Users{
100+
Pagination: &paginationClone,
101+
Users: users,
102+
}, nil
83103
}
84104

85105
// GetUserByEmail to get user information from database using email address

server/db/providers/mongodb/verification_requests.go

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"time"
66

77
"github.com/authorizerdev/authorizer/server/db/models"
8+
"github.com/authorizerdev/authorizer/server/graph/model"
89
"github.com/google/uuid"
910
"go.mongodb.org/mongo-driver/bson"
1011
"go.mongodb.org/mongo-driver/mongo/options"
@@ -56,26 +57,40 @@ func (p *provider) GetVerificationRequestByEmail(email string, identifier string
5657
}
5758

5859
// ListVerificationRequests to get list of verification requests from database
59-
func (p *provider) ListVerificationRequests() ([]models.VerificationRequest, error) {
60-
var verificationRequests []models.VerificationRequest
60+
func (p *provider) ListVerificationRequests(pagination model.Pagination) (*model.VerificationRequests, error) {
61+
var verificationRequests []*model.VerificationRequest
62+
63+
opts := options.Find()
64+
opts.SetLimit(pagination.Limit)
65+
opts.SetSkip(pagination.Offset)
66+
opts.SetSort(bson.M{"created_at": -1})
67+
6168
verificationRequestCollection := p.db.Collection(models.Collections.VerificationRequest, options.Collection())
62-
cursor, err := verificationRequestCollection.Find(nil, bson.M{}, options.Find())
69+
70+
verificationRequestCollectionCount, err := verificationRequestCollection.CountDocuments(nil, bson.M{})
71+
paginationClone := pagination
72+
paginationClone.Total = verificationRequestCollectionCount
73+
74+
cursor, err := verificationRequestCollection.Find(nil, bson.M{}, opts)
6375
if err != nil {
6476
log.Println("error getting verification requests:", err)
65-
return verificationRequests, err
77+
return nil, err
6678
}
6779
defer cursor.Close(nil)
6880

6981
for cursor.Next(nil) {
7082
var verificationRequest models.VerificationRequest
7183
err := cursor.Decode(&verificationRequest)
7284
if err != nil {
73-
return verificationRequests, err
85+
return nil, err
7486
}
75-
verificationRequests = append(verificationRequests, verificationRequest)
87+
verificationRequests = append(verificationRequests, verificationRequest.AsAPIVerificationRequest())
7688
}
7789

78-
return verificationRequests, nil
90+
return &model.VerificationRequests{
91+
VerificationRequests: verificationRequests,
92+
Pagination: &paginationClone,
93+
}, nil
7994
}
8095

8196
// DeleteVerificationRequest to delete verification request from database

server/db/providers/providers.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package providers
22

3-
import "github.com/authorizerdev/authorizer/server/db/models"
3+
import (
4+
"github.com/authorizerdev/authorizer/server/db/models"
5+
"github.com/authorizerdev/authorizer/server/graph/model"
6+
)
47

58
type Provider interface {
69
// AddUser to save user information in database
@@ -10,7 +13,7 @@ type Provider interface {
1013
// DeleteUser to delete user information from database
1114
DeleteUser(user models.User) error
1215
// ListUsers to get list of users from database
13-
ListUsers() ([]models.User, error)
16+
ListUsers(pagination model.Pagination) (*model.Users, error)
1417
// GetUserByEmail to get user information from database using email address
1518
GetUserByEmail(email string) (models.User, error)
1619
// GetUserByID to get user information from database using user ID
@@ -23,7 +26,7 @@ type Provider interface {
2326
// GetVerificationRequestByEmail to get verification request by email from database
2427
GetVerificationRequestByEmail(email string, identifier string) (models.VerificationRequest, error)
2528
// ListVerificationRequests to get list of verification requests from database
26-
ListVerificationRequests() ([]models.VerificationRequest, error)
29+
ListVerificationRequests(pagination model.Pagination) (*model.VerificationRequests, error)
2730
// DeleteVerificationRequest to delete verification request from database
2831
DeleteVerificationRequest(verificationRequest models.VerificationRequest) error
2932

server/db/providers/sql/user.go

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"github.com/authorizerdev/authorizer/server/constants"
99
"github.com/authorizerdev/authorizer/server/db/models"
1010
"github.com/authorizerdev/authorizer/server/envstore"
11+
"github.com/authorizerdev/authorizer/server/graph/model"
1112
"github.com/google/uuid"
1213
"gorm.io/gorm/clause"
1314
)
@@ -64,15 +65,32 @@ func (p *provider) DeleteUser(user models.User) error {
6465
}
6566

6667
// ListUsers to get list of users from database
67-
func (p *provider) ListUsers() ([]models.User, error) {
68+
func (p *provider) ListUsers(pagination model.Pagination) (*model.Users, error) {
6869
var users []models.User
69-
result := p.db.Find(&users)
70+
result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&users)
7071
if result.Error != nil {
7172
log.Println("error getting users:", result.Error)
72-
return users, result.Error
73+
return nil, result.Error
7374
}
7475

75-
return users, nil
76+
responseUsers := []*model.User{}
77+
for _, user := range users {
78+
responseUsers = append(responseUsers, user.AsAPIUser())
79+
}
80+
81+
var total int64
82+
totalRes := p.db.Model(&models.User{}).Count(&total)
83+
if totalRes.Error != nil {
84+
return nil, totalRes.Error
85+
}
86+
87+
paginationClone := pagination
88+
paginationClone.Total = total
89+
90+
return &model.Users{
91+
Pagination: &paginationClone,
92+
Users: responseUsers,
93+
}, nil
7694
}
7795

7896
// GetUserByEmail to get user information from database using email address

server/db/providers/sql/verification_requests.go

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"log"
55

66
"github.com/authorizerdev/authorizer/server/db/models"
7+
"github.com/authorizerdev/authorizer/server/graph/model"
78
"github.com/google/uuid"
89
"gorm.io/gorm/clause"
910
)
@@ -56,15 +57,33 @@ func (p *provider) GetVerificationRequestByEmail(email string, identifier string
5657
}
5758

5859
// ListVerificationRequests to get list of verification requests from database
59-
func (p *provider) ListVerificationRequests() ([]models.VerificationRequest, error) {
60+
func (p *provider) ListVerificationRequests(pagination model.Pagination) (*model.VerificationRequests, error) {
6061
var verificationRequests []models.VerificationRequest
6162

62-
result := p.db.Find(&verificationRequests)
63+
result := p.db.Limit(int(pagination.Limit)).Offset(int(pagination.Offset)).Order("created_at DESC").Find(&verificationRequests)
6364
if result.Error != nil {
6465
log.Println("error getting verification requests:", result.Error)
65-
return verificationRequests, result.Error
66+
return nil, result.Error
6667
}
67-
return verificationRequests, nil
68+
69+
responseVerificationRequests := []*model.VerificationRequest{}
70+
for _, v := range verificationRequests {
71+
responseVerificationRequests = append(responseVerificationRequests, v.AsAPIVerificationRequest())
72+
}
73+
74+
var total int64
75+
totalRes := p.db.Model(&models.VerificationRequest{}).Count(&total)
76+
if totalRes.Error != nil {
77+
return nil, totalRes.Error
78+
}
79+
80+
paginationClone := pagination
81+
paginationClone.Total = total
82+
83+
return &model.VerificationRequests{
84+
VerificationRequests: responseVerificationRequests,
85+
Pagination: &paginationClone,
86+
}, nil
6887
}
6988

7089
// DeleteVerificationRequest to delete verification request from database

0 commit comments

Comments
 (0)