mutation.go

  1package resolvers
  2
  3import (
  4	"context"
  5
  6	"github.com/MichaelMure/git-bug/bug"
  7	"github.com/MichaelMure/git-bug/cache"
  8	"github.com/MichaelMure/git-bug/graphql/graph"
  9	"github.com/MichaelMure/git-bug/graphql/models"
 10)
 11
 12var _ graph.MutationResolver = &mutationResolver{}
 13
 14type mutationResolver struct {
 15	cache *cache.MultiRepoCache
 16}
 17
 18func (r mutationResolver) getRepo(ref *string) (*cache.RepoCache, error) {
 19	if ref != nil {
 20		return r.cache.ResolveRepo(*ref)
 21	}
 22
 23	return r.cache.DefaultRepo()
 24}
 25
 26func (r mutationResolver) getBug(repoRef *string, bugPrefix string) (*cache.BugCache, error) {
 27	repo, err := r.getRepo(repoRef)
 28	if err != nil {
 29		return nil, err
 30	}
 31
 32	return repo.ResolveBugPrefix(bugPrefix)
 33}
 34
 35func (r mutationResolver) NewBug(_ context.Context, input models.NewBugInput) (*models.NewBugPayload, error) {
 36	repo, err := r.getRepo(input.RepoRef)
 37	if err != nil {
 38		return nil, err
 39	}
 40
 41	b, op, err := repo.NewBugWithFiles(input.Title, input.Message, input.Files)
 42	if err != nil {
 43		return nil, err
 44	}
 45
 46	return &models.NewBugPayload{
 47		ClientMutationID: input.ClientMutationID,
 48		Bug:              models.NewLoadedBug(b.Snapshot()),
 49		Operation:        op,
 50	}, nil
 51}
 52
 53func (r mutationResolver) AddComment(_ context.Context, input models.AddCommentInput) (*models.AddCommentPayload, error) {
 54	b, err := r.getBug(input.RepoRef, input.Prefix)
 55	if err != nil {
 56		return nil, err
 57	}
 58
 59	op, err := b.AddCommentWithFiles(input.Message, input.Files)
 60	if err != nil {
 61		return nil, err
 62	}
 63
 64	err = b.Commit()
 65	if err != nil {
 66		return nil, err
 67	}
 68
 69	return &models.AddCommentPayload{
 70		ClientMutationID: input.ClientMutationID,
 71		Bug:              models.NewLoadedBug(b.Snapshot()),
 72		Operation:        op,
 73	}, nil
 74}
 75
 76func (r mutationResolver) ChangeLabels(_ context.Context, input *models.ChangeLabelInput) (*models.ChangeLabelPayload, error) {
 77	b, err := r.getBug(input.RepoRef, input.Prefix)
 78	if err != nil {
 79		return nil, err
 80	}
 81
 82	results, op, err := b.ChangeLabels(input.Added, input.Removed)
 83	if err != nil {
 84		return nil, err
 85	}
 86
 87	err = b.Commit()
 88	if err != nil {
 89		return nil, err
 90	}
 91
 92	resultsPtr := make([]*bug.LabelChangeResult, len(results))
 93	for i, result := range results {
 94		resultsPtr[i] = &result
 95	}
 96
 97	return &models.ChangeLabelPayload{
 98		ClientMutationID: input.ClientMutationID,
 99		Bug:              models.NewLoadedBug(b.Snapshot()),
100		Operation:        op,
101		Results:          resultsPtr,
102	}, nil
103}
104
105func (r mutationResolver) OpenBug(_ context.Context, input models.OpenBugInput) (*models.OpenBugPayload, error) {
106	b, err := r.getBug(input.RepoRef, input.Prefix)
107	if err != nil {
108		return nil, err
109	}
110
111	op, err := b.Open()
112	if err != nil {
113		return nil, err
114	}
115
116	err = b.Commit()
117	if err != nil {
118		return nil, err
119	}
120
121	return &models.OpenBugPayload{
122		ClientMutationID: input.ClientMutationID,
123		Bug:              models.NewLoadedBug(b.Snapshot()),
124		Operation:        op,
125	}, nil
126}
127
128func (r mutationResolver) CloseBug(_ context.Context, input models.CloseBugInput) (*models.CloseBugPayload, error) {
129	b, err := r.getBug(input.RepoRef, input.Prefix)
130	if err != nil {
131		return nil, err
132	}
133
134	op, err := b.Close()
135	if err != nil {
136		return nil, err
137	}
138
139	err = b.Commit()
140	if err != nil {
141		return nil, err
142	}
143
144	return &models.CloseBugPayload{
145		ClientMutationID: input.ClientMutationID,
146		Bug:              models.NewLoadedBug(b.Snapshot()),
147		Operation:        op,
148	}, nil
149}
150
151func (r mutationResolver) SetTitle(_ context.Context, input models.SetTitleInput) (*models.SetTitlePayload, error) {
152	b, err := r.getBug(input.RepoRef, input.Prefix)
153	if err != nil {
154		return nil, err
155	}
156
157	op, err := b.SetTitle(input.Title)
158	if err != nil {
159		return nil, err
160	}
161
162	err = b.Commit()
163	if err != nil {
164		return nil, err
165	}
166
167	return &models.SetTitlePayload{
168		ClientMutationID: input.ClientMutationID,
169		Bug:              models.NewLoadedBug(b.Snapshot()),
170		Operation:        op,
171	}, nil
172}