Skip to content

Commit 64d5955

Browse files
committed
feat: default relationship pages to the maxPage if too large
1 parent 35b8ae6 commit 64d5955

File tree

5 files changed

+134
-58
lines changed

5 files changed

+134
-58
lines changed

services/player-service/api/v2/intnl/server_relationships.go

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"fmt"
7+
"math"
78

89
"github.com/hollow-cube/hc-services/libraries/common/pkg/util"
910
"github.com/hollow-cube/hc-services/services/player-service/internal/db"
@@ -12,8 +13,21 @@ import (
1213
)
1314

1415
func (s *server) GetBlockedPlayers(ctx context.Context, request GetBlockedPlayersRequestObject) (GetBlockedPlayersResponseObject, error) {
16+
page := request.Params.Page
1517
pageSize := request.Params.PageSize
16-
offset := (request.Params.Page - 1) * pageSize
18+
19+
totalItems, err := s.store.CountBlockedPlayers(ctx, request.PlayerId)
20+
if err != nil {
21+
return nil, fmt.Errorf("failed to count blocked players: %w", err)
22+
}
23+
24+
if totalItems == 0 {
25+
return GetBlockedPlayers200JSONResponse{Page: 1, TotalItems: 0, Items: make([]BlockedPlayer, 0)}, nil
26+
}
27+
28+
maxPage := int32(math.Ceil(float64(totalItems) / float64(pageSize)))
29+
page = int32(math.Min(float64(page), float64(maxPage)))
30+
offset := (page - 1) * pageSize
1731

1832
rows, err := s.store.GetBlockedPlayers(ctx, request.PlayerId, pageSize, offset)
1933
if err != nil {
@@ -53,8 +67,8 @@ func (s *server) GetBlockedPlayers(ctx context.Context, request GetBlockedPlayer
5367

5468
return GetBlockedPlayers200JSONResponse{
5569
Items: blocks,
56-
Page: request.Params.Page,
57-
TotalItems: rows[0].Total,
70+
Page: page,
71+
TotalItems: totalItems,
5872
}, nil
5973
}
6074

@@ -141,17 +155,29 @@ func (s *server) GetBlocksBetweenPlayers(ctx context.Context, request GetBlocksB
141155
}
142156

143157
func (s *server) GetPlayerFriends(ctx context.Context, request GetPlayerFriendsRequestObject) (GetPlayerFriendsResponseObject, error) {
158+
page := request.Params.Page
144159
pageSize := request.Params.PageSize
145-
offset := (request.Params.Page - 1) * pageSize
160+
161+
totalItems, err := s.store.CountPlayerFriends(ctx, request.PlayerId)
162+
if err != nil {
163+
return nil, fmt.Errorf("failed to count friends: %w", err)
164+
}
165+
166+
if totalItems == 0 {
167+
return GetPlayerFriends200JSONResponse{Page: 1, TotalItems: 0, Items: make([]PlayerFriend, 0)}, nil
168+
}
169+
170+
maxPage := int32(math.Ceil(float64(totalItems) / float64(pageSize)))
171+
page = int32(math.Min(float64(page), float64(maxPage)))
172+
offset := (page - 1) * pageSize
146173

147174
rows, err := s.store.GetPlayerFriends(ctx, request.PlayerId, pageSize, offset)
148175
if err != nil {
149176
return nil, fmt.Errorf("failed to get friends: %w", err)
150177
}
151178

152-
totalItems := int64(0)
153-
if len(rows) > 0 {
154-
totalItems = rows[0].TotalCount
179+
if len(rows) == 0 {
180+
return GetPlayerFriends200JSONResponse{Page: 1, TotalItems: 0, Items: make([]PlayerFriend, 0)}, nil
155181
}
156182

157183
friends := make([]PlayerFriend, len(rows))
@@ -166,27 +192,44 @@ func (s *server) GetPlayerFriends(ctx context.Context, request GetPlayerFriendsR
166192
}
167193

168194
return GetPlayerFriends200JSONResponse{
169-
Page: request.Params.Page,
195+
Page: page,
170196
TotalItems: totalItems,
171197
Items: friends,
172198
}, nil
173199
}
174200

175201
func (s *server) GetFriendRequests(ctx context.Context, request GetFriendRequestsRequestObject) (GetFriendRequestsResponseObject, error) {
176202
outgoing := request.Params.Direction == Outgoing
203+
page := request.Params.Page
177204
pageSize := request.Params.PageSize
178-
offset := (request.Params.Page - 1) * pageSize
179205

180-
totalItems := int64(0)
206+
var totalItems int64
207+
var err error
208+
if outgoing {
209+
totalItems, err = s.store.CountFriendRequests(ctx, &request.PlayerId, nil)
210+
} else {
211+
totalItems, err = s.store.CountFriendRequests(ctx, nil, &request.PlayerId)
212+
}
213+
if err != nil {
214+
return nil, fmt.Errorf("failed to count friend requests: %w", err)
215+
}
216+
217+
if totalItems == 0 {
218+
return GetFriendRequests200JSONResponse{Page: 1, TotalItems: 0, Items: make([]FriendRequest, 0)}, nil
219+
}
220+
221+
maxPage := int32(math.Ceil(float64(totalItems) / float64(pageSize)))
222+
if page > maxPage && maxPage > 0 {
223+
page = maxPage
224+
}
225+
offset := (page - 1) * pageSize
226+
181227
var friendRequests []FriendRequest
182228
if outgoing {
183229
rows, err := s.store.GetOutgoingFriendRequests(ctx, request.PlayerId, pageSize, offset)
184230
if err != nil {
185231
return nil, fmt.Errorf("failed to get friend requests: %w", err)
186232
}
187-
if len(rows) > 0 {
188-
totalItems = rows[0].TotalCount
189-
}
190233

191234
friendRequests = make([]FriendRequest, len(rows))
192235
for i, row := range rows {
@@ -201,9 +244,6 @@ func (s *server) GetFriendRequests(ctx context.Context, request GetFriendRequest
201244
if err != nil {
202245
return nil, fmt.Errorf("failed to get friend requests: %w", err)
203246
}
204-
if len(rows) > 0 {
205-
totalItems = rows[0].TotalCount
206-
}
207247

208248
friendRequests = make([]FriendRequest, len(rows))
209249
for i, row := range rows {
@@ -216,7 +256,7 @@ func (s *server) GetFriendRequests(ctx context.Context, request GetFriendRequest
216256
}
217257

218258
return GetFriendRequests200JSONResponse{
219-
Page: request.Params.Page,
259+
Page: page,
220260
TotalItems: totalItems,
221261
Items: friendRequests,
222262
}, nil

services/player-service/internal/db/blocks.sql.go

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

services/player-service/internal/db/friends.sql.go

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

services/player-service/internal/db/queries/blocks.sql

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1+
-- name: CountBlockedPlayers :one
2+
select count(*)
3+
from player_blocks
4+
where player_id = $1;
5+
16
-- name: GetBlockedPlayers :many
2-
select pb.target_id, pd.username, pb.created_at, count(*) over () as total
7+
select pb.target_id, pd.username, pb.created_at
38
from player_blocks pb
49
join player_data pd on pd.id = pb.target_id
510
where pb.player_id = $1

services/player-service/internal/db/queries/friends.sql

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
11
-- Friends
22

3+
-- name: CountPlayerFriends :one
4+
select count(*) as total
5+
from player_friends
6+
where player_id = $1;
7+
38
-- name: GetPlayerFriends :many
4-
select pf.target_id, pd.username, pd.online, pd.last_online, pf.created_at, count(*) over () as total_count
9+
select pf.target_id, pd.username, pd.online, pd.last_online, pf.created_at
510
from player_friends pf
611
join player_data pd on pd.id = pf.target_id
712
where pf.player_id = $1
@@ -39,15 +44,21 @@ where (player_id = $1 and target_id = $2)
3944

4045
-- Friend Requests
4146

47+
-- name: CountFriendRequests :one
48+
select count(*) as total
49+
from player_friend_requests
50+
where (player_id = sqlc.narg(player_id) or sqlc.narg(player_id) is null)
51+
and (target_id = sqlc.narg(target_id) or sqlc.narg(target_id) is null);
52+
4253
-- name: GetIncomingFriendRequests :many
43-
select pfr.player_id, pd.username, pfr.created_at, count(*) over () as total_count
54+
select pfr.player_id, pd.username, pfr.created_at
4455
from player_friend_requests pfr
4556
join player_data pd on pd.id = pfr.player_id
4657
where pfr.target_id = $1
4758
limit $2 offset $3;
4859

4960
-- name: GetOutgoingFriendRequests :many
50-
select pfr.target_id, pd.username, pfr.created_at, count(*) over () as total_count
61+
select pfr.target_id, pd.username, pfr.created_at
5162
from player_friend_requests pfr
5263
join player_data pd on pd.id = pfr.target_id
5364
where pfr.player_id = $1

0 commit comments

Comments
 (0)