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}