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