1package resolvers
2
3import (
4 "context"
5
6 "github.com/MichaelMure/git-bug/bug"
7 "github.com/MichaelMure/git-bug/cache"
8 "github.com/MichaelMure/git-bug/graphql/graph"
9 "github.com/MichaelMure/git-bug/graphql/models"
10)
11
12var _ graph.MutationResolver = &mutationResolver{}
13
14type mutationResolver struct {
15 cache *cache.MultiRepoCache
16}
17
18func (r mutationResolver) getRepo(ref *string) (*cache.RepoCache, error) {
19 if ref != nil {
20 return r.cache.ResolveRepo(*ref)
21 }
22
23 return r.cache.DefaultRepo()
24}
25
26func (r mutationResolver) NewBug(ctx context.Context, input models.NewBugInput) (*models.NewBugPayload, error) {
27 repo, err := r.getRepo(input.RepoRef)
28 if err != nil {
29 return nil, err
30 }
31
32 b, op, err := repo.NewBugWithFiles(input.Title, input.Message, input.Files)
33 if err != nil {
34 return nil, err
35 }
36
37 return &models.NewBugPayload{
38 ClientMutationID: input.ClientMutationID,
39 Bug: b.Snapshot(),
40 Operation: op,
41 }, nil
42}
43
44func (r mutationResolver) AddComment(ctx context.Context, input models.AddCommentInput) (*models.AddCommentPayload, error) {
45 repo, err := r.getRepo(input.RepoRef)
46 if err != nil {
47 return nil, err
48 }
49
50 b, err := repo.ResolveBugPrefix(input.Prefix)
51 if err != nil {
52 return nil, err
53 }
54
55 op, err := b.AddCommentWithFiles(input.Message, input.Files)
56 if err != nil {
57 return nil, err
58 }
59
60 return &models.AddCommentPayload{
61 ClientMutationID: input.ClientMutationID,
62 Bug: b.Snapshot(),
63 Operation: op,
64 }, nil
65}
66
67func (r mutationResolver) ChangeLabels(ctx context.Context, input *models.ChangeLabelInput) (*models.ChangeLabelPayload, error) {
68 repo, err := r.getRepo(input.RepoRef)
69 if err != nil {
70 return nil, err
71 }
72
73 b, err := repo.ResolveBugPrefix(input.Prefix)
74 if err != nil {
75 return nil, err
76 }
77
78 results, op, err := b.ChangeLabels(input.Added, input.Removed)
79 if err != nil {
80 return nil, err
81 }
82
83 resultsPtr := make([]*bug.LabelChangeResult, len(results))
84 for i, result := range results {
85 resultsPtr[i] = &result
86 }
87
88 return &models.ChangeLabelPayload{
89 ClientMutationID: input.ClientMutationID,
90 Bug: b.Snapshot(),
91 Operation: op,
92 Results: resultsPtr,
93 }, nil
94}
95
96func (r mutationResolver) OpenBug(ctx context.Context, input models.OpenBugInput) (*models.OpenBugPayload, error) {
97 repo, err := r.getRepo(input.RepoRef)
98 if err != nil {
99 return nil, err
100 }
101
102 b, err := repo.ResolveBugPrefix(input.Prefix)
103 if err != nil {
104 return nil, err
105 }
106
107 op, err := b.Open()
108 if err != nil {
109 return nil, err
110 }
111
112 return &models.OpenBugPayload{
113 ClientMutationID: input.ClientMutationID,
114 Bug: b.Snapshot(),
115 Operation: op,
116 }, nil
117}
118
119func (r mutationResolver) CloseBug(ctx context.Context, input models.CloseBugInput) (*models.CloseBugPayload, error) {
120 repo, err := r.getRepo(input.RepoRef)
121 if err != nil {
122 return nil, err
123 }
124
125 b, err := repo.ResolveBugPrefix(input.Prefix)
126 if err != nil {
127 return nil, err
128 }
129
130 op, err := b.Close()
131 if err != nil {
132 return nil, err
133 }
134
135 return &models.CloseBugPayload{
136 ClientMutationID: input.ClientMutationID,
137 Bug: b.Snapshot(),
138 Operation: op,
139 }, nil
140}
141
142func (r mutationResolver) SetTitle(ctx context.Context, input models.SetTitleInput) (*models.SetTitlePayload, error) {
143 repo, err := r.getRepo(input.RepoRef)
144 if err != nil {
145 return nil, err
146 }
147
148 b, err := repo.ResolveBugPrefix(input.Prefix)
149 if err != nil {
150 return nil, err
151 }
152
153 op, err := b.SetTitle(input.Title)
154 if err != nil {
155 return nil, err
156 }
157
158 return &models.SetTitlePayload{
159 ClientMutationID: input.ClientMutationID,
160 Bug: b.Snapshot(),
161 Operation: op,
162 }, nil
163}
164
165func (r mutationResolver) Commit(ctx context.Context, input models.CommitInput) (*models.CommitPayload, error) {
166 repo, err := r.getRepo(input.RepoRef)
167 if err != nil {
168 return nil, err
169 }
170
171 b, err := repo.ResolveBugPrefix(input.Prefix)
172 if err != nil {
173 return nil, err
174 }
175
176 err = b.Commit()
177 if err != nil {
178 return nil, err
179 }
180
181 return &models.CommitPayload{
182 ClientMutationID: input.ClientMutationID,
183 Bug: b.Snapshot(),
184 }, nil
185}
186
187func (r mutationResolver) CommitAsNeeded(ctx context.Context, input models.CommitAsNeededInput) (*models.CommitAsNeededPayload, error) {
188 repo, err := r.getRepo(input.RepoRef)
189 if err != nil {
190 return nil, err
191 }
192
193 b, err := repo.ResolveBugPrefix(input.Prefix)
194 if err != nil {
195 return nil, err
196 }
197
198 err = b.CommitAsNeeded()
199 if err != nil {
200 return nil, err
201 }
202
203 return &models.CommitAsNeededPayload{
204 ClientMutationID: input.ClientMutationID,
205 Bug: b.Snapshot(),
206 }, nil
207}