Skip to content
This repository was archived by the owner on Feb 4, 2021. It is now read-only.

Commit cd924bb

Browse files
committed
Fix paging
1 parent b7ce9a9 commit cd924bb

File tree

3 files changed

+30
-6
lines changed

3 files changed

+30
-6
lines changed

app/server/entries_server.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package server
33
import (
44
"context"
55
"database/sql"
6+
"math"
67
"time"
78

89
"github.com/golang/protobuf/ptypes/timestamp"
@@ -35,8 +36,17 @@ type entryServiceServerImpl struct {
3536
}
3637

3738
func (s *entryServiceServerImpl) ListEntries(ctx context.Context, req *api_pb.ListEntriesRequest) (*api_pb.ListEntriesResponse, error) {
39+
size := req.GetPageSize()
40+
if size == 0 {
41+
size = 50
42+
}
43+
maxID := req.GetPageToken()
44+
if maxID == 0 {
45+
maxID = math.MaxUint32
46+
}
47+
3848
es := s.EntryStore(ctx)
39-
entries, err := es.ListPublicEntries()
49+
entries, next, err := es.ListPublicEntries(int64(maxID), int(size))
4050
if err != nil {
4151
if errors.Cause(err) == sql.ErrNoRows {
4252
return &api_pb.ListEntriesResponse{}, nil
@@ -46,7 +56,8 @@ func (s *entryServiceServerImpl) ListEntries(ctx context.Context, req *api_pb.Li
4656

4757
resp := entriesToResponse(entries, false, s.cfg)
4858
return &api_pb.ListEntriesResponse{
49-
Entries: resp,
59+
Entries: resp,
60+
NextPageToken: uint32(next),
5061
}, nil
5162
}
5263

infra/store/entry/entry_store.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,36 @@ func NewEntryStore(ctx context.Context, db *sql.DB) store.EntryStore {
3232
}
3333
}
3434

35-
func (s *entryStoreImpl) ListPublicEntries() ([]*record.Entry, error) {
35+
func (s *entryStoreImpl) ListPublicEntries(maxEntryID int64, limit int) ([]*record.Entry, int64, error) {
3636
mods := []qm.QueryMod{
3737
qm.Load(record.EntryRels.Author),
3838
qm.Load(record.EntryRels.Blog),
3939
qm.InnerJoin("users on users.id = entries.author_id"),
4040
qm.InnerJoin("profiles on profiles.id = users.profile_id"),
4141
qm.Where("profiles.profile_scope = ?", model.Public),
42+
qm.Where("entries.id <= ?", maxEntryID),
43+
qm.Limit(limit + 1),
44+
qm.OrderBy("entries.id desc"),
4245
}
4346

4447
e, err := record.Entries(mods...).All(s.ctx, s.db)
4548
if err != nil {
46-
return nil, errors.WithStack(err)
49+
return nil, 0, errors.WithStack(err)
4750
}
48-
return e, nil
51+
52+
if len(e) <= limit {
53+
return e, 0, nil
54+
}
55+
return e[:limit], e[limit].ID, nil
4956
}
5057

5158
func (s *entryStoreImpl) CreateEntries(blog *record.Blog, feed *gofeed.Feed) (n int64, err error) {
59+
rev := make([]*gofeed.Item, len(feed.Items))
60+
for i, item := range feed.Items {
61+
rev[len(rev)-1-i] = item
62+
}
63+
feed.Items = rev
64+
5265
tx, err := s.db.Begin()
5366
if err != nil {
5467
return 0, errors.WithStack(err)

infra/store/entry_store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ import (
77

88
// EntryStore accesses entry data
99
type EntryStore interface {
10-
ListPublicEntries() ([]*record.Entry, error)
10+
ListPublicEntries(maxEntryID int64, limit int) ([]*record.Entry, int64, error)
1111
CreateEntries(blog *record.Blog, feed *gofeed.Feed) (int64, error)
1212
}

0 commit comments

Comments
 (0)