query.go

 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}