diff options
author | Michael Muré <batolettre@gmail.com> | 2020-06-27 23:09:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-27 23:09:22 +0200 |
commit | c0dbc149d5c0c3610476ba14a800c9ba803a2c2c (patch) | |
tree | c07587da30eae7a37c2597d110ef1e66be3b4b8f /api/graphql/resolvers/repo.go | |
parent | 23228101a2a38a139f6fc2cafc18e9f08d911089 (diff) | |
parent | 3aaf775857d186ad416133935e73ed1b063938c6 (diff) | |
download | git-bug-c0dbc149d5c0c3610476ba14a800c9ba803a2c2c.tar.gz |
Merge pull request #407 from lukegb/fix-402
Add support for read-only mode for web UI.
Diffstat (limited to 'api/graphql/resolvers/repo.go')
-rw-r--r-- | api/graphql/resolvers/repo.go | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/api/graphql/resolvers/repo.go b/api/graphql/resolvers/repo.go new file mode 100644 index 00000000..5d96428e --- /dev/null +++ b/api/graphql/resolvers/repo.go @@ -0,0 +1,188 @@ +package resolvers + +import ( + "context" + + "github.com/MichaelMure/git-bug/api/auth" + "github.com/MichaelMure/git-bug/api/graphql/connections" + "github.com/MichaelMure/git-bug/api/graphql/graph" + "github.com/MichaelMure/git-bug/api/graphql/models" + "github.com/MichaelMure/git-bug/bug" + "github.com/MichaelMure/git-bug/entity" + "github.com/MichaelMure/git-bug/query" +) + +var _ graph.RepositoryResolver = &repoResolver{} + +type repoResolver struct{} + +func (repoResolver) Name(_ context.Context, obj *models.Repository) (*string, error) { + name := obj.Repo.Name() + return &name, nil +} + +func (repoResolver) AllBugs(_ context.Context, obj *models.Repository, after *string, before *string, first *int, last *int, queryStr *string) (*models.BugConnection, error) { + input := models.ConnectionInput{ + Before: before, + After: after, + First: first, + Last: last, + } + + var q *query.Query + if queryStr != nil { + query2, err := query.Parse(*queryStr) + if err != nil { + return nil, err + } + q = query2 + } else { + q = query.NewQuery() + } + + // Simply pass a []string with the ids to the pagination algorithm + source := obj.Repo.QueryBugs(q) + + // The edger create a custom edge holding just the id + edger := func(id entity.Id, offset int) connections.Edge { + return connections.LazyBugEdge{ + Id: id, + Cursor: connections.OffsetToCursor(offset), + } + } + + // The conMaker will finally load and compile bugs from git to replace the selected edges + conMaker := func(lazyBugEdges []*connections.LazyBugEdge, lazyNode []entity.Id, info *models.PageInfo, totalCount int) (*models.BugConnection, error) { + edges := make([]*models.BugEdge, len(lazyBugEdges)) + nodes := make([]models.BugWrapper, len(lazyBugEdges)) + + for i, lazyBugEdge := range lazyBugEdges { + excerpt, err := obj.Repo.ResolveBugExcerpt(lazyBugEdge.Id) + if err != nil { + return nil, err + } + + b := models.NewLazyBug(obj.Repo, excerpt) + + edges[i] = &models.BugEdge{ + Cursor: lazyBugEdge.Cursor, + Node: b, + } + nodes[i] = b + } + + return &models.BugConnection{ + Edges: edges, + Nodes: nodes, + PageInfo: info, + TotalCount: totalCount, + }, nil + } + + return connections.LazyBugCon(source, edger, conMaker, input) +} + +func (repoResolver) Bug(_ context.Context, obj *models.Repository, prefix string) (models.BugWrapper, error) { + excerpt, err := obj.Repo.ResolveBugExcerptPrefix(prefix) + if err != nil { + return nil, err + } + + return models.NewLazyBug(obj.Repo, excerpt), nil +} + +func (repoResolver) AllIdentities(_ context.Context, obj *models.Repository, after *string, before *string, first *int, last *int) (*models.IdentityConnection, error) { + input := models.ConnectionInput{ + Before: before, + After: after, + First: first, + Last: last, + } + + // Simply pass a []string with the ids to the pagination algorithm + source := obj.Repo.AllIdentityIds() + + // The edger create a custom edge holding just the id + edger := func(id entity.Id, offset int) connections.Edge { + return connections.LazyIdentityEdge{ + Id: id, + Cursor: connections.OffsetToCursor(offset), + } + } + + // The conMaker will finally load and compile identities from git to replace the selected edges + conMaker := func(lazyIdentityEdges []*connections.LazyIdentityEdge, lazyNode []entity.Id, info *models.PageInfo, totalCount int) (*models.IdentityConnection, error) { + edges := make([]*models.IdentityEdge, len(lazyIdentityEdges)) + nodes := make([]models.IdentityWrapper, len(lazyIdentityEdges)) + + for k, lazyIdentityEdge := range lazyIdentityEdges { + excerpt, err := obj.Repo.ResolveIdentityExcerpt(lazyIdentityEdge.Id) + if err != nil { + return nil, err + } + + i := models.NewLazyIdentity(obj.Repo, excerpt) + + edges[k] = &models.IdentityEdge{ + Cursor: lazyIdentityEdge.Cursor, + Node: i, + } + nodes[k] = i + } + + return &models.IdentityConnection{ + Edges: edges, + Nodes: nodes, + PageInfo: info, + TotalCount: totalCount, + }, nil + } + + return connections.LazyIdentityCon(source, edger, conMaker, input) +} + +func (repoResolver) Identity(_ context.Context, obj *models.Repository, prefix string) (models.IdentityWrapper, error) { + excerpt, err := obj.Repo.ResolveIdentityExcerptPrefix(prefix) + if err != nil { + return nil, err + } + + return models.NewLazyIdentity(obj.Repo, excerpt), nil +} + +func (repoResolver) UserIdentity(ctx context.Context, obj *models.Repository) (models.IdentityWrapper, error) { + id, err := auth.UserFromCtx(ctx, obj.Repo) + if err == auth.ErrNotAuthenticated { + return nil, nil + } else if err != nil { + return nil, err + } + return models.NewLoadedIdentity(id.Identity), nil +} + +func (repoResolver) ValidLabels(_ context.Context, obj *models.Repository, after *string, before *string, first *int, last *int) (*models.LabelConnection, error) { + input := models.ConnectionInput{ + Before: before, + After: after, + First: first, + Last: last, + } + + edger := func(label bug.Label, offset int) connections.Edge { + return models.LabelEdge{ + Node: label, + Cursor: connections.OffsetToCursor(offset), + } + } + + conMaker := func(edges []*models.LabelEdge, nodes []bug.Label, info *models.PageInfo, totalCount int) (*models.LabelConnection, error) { + return &models.LabelConnection{ + Edges: edges, + Nodes: nodes, + PageInfo: info, + TotalCount: totalCount, + }, nil + } + + return connections.LabelCon(obj.Repo.ValidLabels(), edger, conMaker, input) +} |