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