mutation.go

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