/
comic.go
66 lines (55 loc) · 1.7 KB
/
comic.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package resolver
import (
"context"
"github.com/bickyeric/arumba/resolver/comic"
"github.com/bickyeric/arumba/generated"
"github.com/bickyeric/arumba/model"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type comicResolver struct{ generated.ResolverRoot }
func (r *comicResolver) Episodes(ctx context.Context, comic *model.Comic, after *string, first *int) (*model.EpisodeConnection, error) {
return r.Query().Episodes(ctx, comic.ID, after, first)
}
type comicConnection struct {
generated.ResolverRoot
*mongo.Collection
}
func (r *comicConnection) Edges(ctx context.Context, c *model.ComicConnection) (edges []*model.ComicEdge, err error) {
edges = make([]*model.ComicEdge, 0)
opts := options.Find().SetLimit(int64(c.Limit)).SetSkip(int64(c.Skip))
cur, err := r.Find(ctx, c.BaseQuery, opts)
if err != nil {
return edges, err
}
var i int = c.Skip + 1
for cur.Next(ctx) {
edge := model.ComicEdge{
Cursor: comic.EncodeCursor(i),
Node: new(model.Comic),
}
if err := cur.Decode(edge.Node); err != nil {
return edges, err
}
edges = append(edges, &edge)
i++
}
return edges, err
}
func (r *comicConnection) PageInfo(ctx context.Context, c *model.ComicConnection) (pageInfo *model.PageInfo, err error) {
pageInfo = new(model.PageInfo)
opts := options.Find().SetLimit(2).SetSkip(int64(c.Skip + c.Limit - 1))
cur, err := r.Find(ctx, c.BaseQuery, opts)
if err != nil {
return pageInfo, err
}
var nextInfo []model.Comic
if err = cur.All(ctx, &nextInfo); err != nil {
return pageInfo, err
}
pageInfo.HasNextPage = len(nextInfo) == 2
if pageInfo.HasNextPage {
pageInfo.StartCursor = comic.EncodeCursor(c.Skip + c.Limit)
}
return pageInfo, err
}