Skip to content

Commit e252b49

Browse files
committed
feat: Implement pagination in GetUsers()
1 parent 7b2a8e6 commit e252b49

File tree

8 files changed

+117
-41
lines changed

8 files changed

+117
-41
lines changed

handler/rpc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (handler *Handler) GetUser(_ context.Context, request *api.GetUserRequest)
5656
}
5757

5858
func (handler *Handler) GetUsers(_ context.Context, request *api.GetUsersRequest) (*api.GetUsersResponse, error) {
59-
users, err := handler.UserService.GetUsersByNickname(request.Nickname)
59+
users, err := handler.UserService.GetUsersByNickname(request.Nickname, request.Page, request.Size, request.Sort)
6060
if err != nil {
6161
return nil, err
6262
}

proto/user.pb.go

Lines changed: 53 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

proto/user.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,9 @@ message GetUserResponse {
5555

5656
message GetUsersRequest {
5757
string nickname = 1;
58+
int64 page = 2;
59+
int64 size = 3;
60+
string sort = 4;
5861
}
5962

6063
message GetUsersResponse {

server/grpc-server.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,13 @@ func NewGRPCServer(h *handler.Handler) (*GRPCServer, error) {
2121
server := grpc.NewServer(
2222
grpc.KeepaliveParams(
2323
keepalive.ServerParameters{
24-
MaxConnectionIdle: 15 * time.Second,
25-
MaxConnectionAge: 30 * time.Second,
26-
MaxConnectionAgeGrace: 15 * time.Second,
24+
MaxConnectionIdle: 10 * time.Second,
25+
MaxConnectionAge: 20 * time.Second,
26+
MaxConnectionAgeGrace: 10 * time.Second,
2727
Time: 15 * time.Second,
2828
Timeout: 10 * time.Second,
2929
},
3030
),
31-
grpc.KeepaliveEnforcementPolicy(
32-
keepalive.EnforcementPolicy{
33-
MinTime: 3 * time.Second,
34-
PermitWithoutStream: true,
35-
},
36-
),
3731
grpcmiddleware.WithUnaryServerChain(
3832
grpcrecovery.UnaryServerInterceptor(
3933
grpcrecovery.WithRecoveryHandler(handleRecoveryGRPC),

service/service.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,15 @@ func (service *Service) GetUserByID(userId string) (*model.User, error) {
5555
return user, nil
5656
}
5757

58-
func (service *Service) GetUsersByNickname(name string) ([]*model.User, error) {
58+
func (service *Service) GetUsersByNickname(name string, page int64, size int64, sort string) ([]*model.User, error) {
5959
if strings.Trim(name, " ") == "" {
6060
return nil, errors.New("empty name")
6161
}
62-
users, err := service.DB.GetUsersByNickname(name)
62+
users, err := service.DB.GetUsersByNickname(name, sort, page, size)
6363
if err != nil {
64+
if errors.Is(err, userdb.ErrWrongSortValue) {
65+
return nil, status.Errorf(codes.InvalidArgument, "invalid sort value %s", sort)
66+
}
6467
return nil, status.Errorf(codes.Internal, "Error occurred in while processing GetUsers(), %v", err)
6568
}
6669
return users, nil

userdb/db.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,42 @@ func (db *DB) GetUserByID(userId string) (*model.User, error) {
8484
return &user, nil
8585
}
8686

87-
func (db *DB) GetUsersByNickname(nickname string) ([]*model.User, error) {
87+
func (db *DB) GetUsersByNickname(nickname string, sort string, page int64, size int64) ([]*model.User, error) {
8888
var users []*model.User
89-
if err := db.User.Get("nickname", nickname).Index("nickname_idx").All(&users); err != nil {
89+
90+
dynamoDBSort, err := db.dynamoDBSort(sort)
91+
if err != nil {
9092
return nil, err
9193
}
94+
95+
query := db.User.Get("nickname", nickname).Index(NicknameIndex.String()).Order(dynamoDBSort)
96+
var lastKey dynamo.PagingKey
97+
98+
for i := int64(0); i <= page; i++ {
99+
if i != 0 {
100+
users = nil
101+
}
102+
lastKey, err = query.StartFrom(lastKey).Limit(size).AllWithLastEvaluatedKey(&users)
103+
if err != nil {
104+
return nil, err
105+
}
106+
if lastKey == nil {
107+
if i < page {
108+
users = nil
109+
}
110+
break
111+
}
112+
}
92113
return users, nil
93114
}
115+
116+
func (db *DB) dynamoDBSort(sort string) (dynamo.Order, error) {
117+
switch sort {
118+
case "asc":
119+
return dynamo.Ascending, nil
120+
case "desc":
121+
return dynamo.Descending, nil
122+
default:
123+
return dynamo.Ascending, ErrWrongSortValue
124+
}
125+
}

userdb/error.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package userdb
2+
3+
import "github.com/pkg/errors"
4+
5+
var (
6+
ErrWrongSortValue = errors.New("wrong sort value")
7+
)

userdb/index.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package userdb
2+
3+
type Index string
4+
5+
const (
6+
NicknameIndex Index = "nickname_idx"
7+
)
8+
9+
func (index Index) String() string {
10+
return string(index)
11+
}

0 commit comments

Comments
 (0)