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}