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