mutation.go

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