1package resolvers
2
3import (
4 "context"
5
6 "github.com/git-bug/git-bug/api/graphql/connections"
7 "github.com/git-bug/git-bug/api/graphql/graph"
8 "github.com/git-bug/git-bug/api/graphql/models"
9 "github.com/git-bug/git-bug/cache"
10)
11
12var _ graph.QueryResolver = &rootQueryResolver{}
13
14type rootQueryResolver struct {
15 cache *cache.MultiRepoCache
16}
17
18func (r rootQueryResolver) Repository(_ context.Context, ref *string) (*models.Repository, error) {
19 var repo *cache.RepoCache
20 var err error
21
22 if ref == nil {
23 repo, err = r.cache.DefaultRepo()
24 } else {
25 repo, err = r.cache.ResolveRepo(*ref)
26 }
27
28 if err != nil {
29 return nil, err
30 }
31
32 return &models.Repository{
33 Cache: r.cache,
34 Repo: repo,
35 }, nil
36}
37
38// Repositories returns all registered repositories as a relay connection.
39func (r rootQueryResolver) Repositories(_ context.Context, after *string, before *string, first *int, last *int) (*models.RepositoryConnection, error) {
40 input := models.ConnectionInput{
41 After: after,
42 Before: before,
43 First: first,
44 Last: last,
45 }
46
47 source := r.cache.AllRepos()
48
49 edger := func(repo *cache.RepoCache, offset int) connections.Edge {
50 return models.RepositoryEdge{
51 Node: &models.Repository{Cache: r.cache, Repo: repo},
52 Cursor: connections.OffsetToCursor(offset),
53 }
54 }
55
56 // NodeType is *cache.RepoCache (the source slice element), but the connection
57 // nodes field wants []*models.Repository. Extract them from the edges, which
58 // already hold the wrapped Repository built by the edger above.
59 conMaker := func(edges []*models.RepositoryEdge, _ []*cache.RepoCache, info *models.PageInfo, totalCount int) (*models.RepositoryConnection, error) {
60 nodes := make([]*models.Repository, len(edges))
61 for i, e := range edges {
62 nodes[i] = e.Node
63 }
64 return &models.RepositoryConnection{
65 Edges: edges,
66 Nodes: nodes,
67 PageInfo: info,
68 TotalCount: totalCount,
69 }, nil
70 }
71
72 return connections.Connection(source, edger, conMaker, input)
73}