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) getBug(repoRef *string, bugPrefix string) (*cache.BugCache, error) {
27 repo, err := r.getRepo(repoRef)
28 if err != nil {
29 return nil, err
30 }
31
32 return repo.ResolveBugPrefix(bugPrefix)
33}
34
35func (r mutationResolver) NewBug(_ context.Context, input models.NewBugInput) (*models.NewBugPayload, error) {
36 repo, err := r.getRepo(input.RepoRef)
37 if err != nil {
38 return nil, err
39 }
40
41 b, op, err := repo.NewBugWithFiles(input.Title, input.Message, input.Files)
42 if err != nil {
43 return nil, err
44 }
45
46 return &models.NewBugPayload{
47 ClientMutationID: input.ClientMutationID,
48 Bug: models.NewLoadedBug(b.Snapshot()),
49 Operation: op,
50 }, nil
51}
52
53func (r mutationResolver) AddComment(_ context.Context, input models.AddCommentInput) (*models.AddCommentPayload, error) {
54 b, err := r.getBug(input.RepoRef, input.Prefix)
55 if err != nil {
56 return nil, err
57 }
58
59 op, err := b.AddCommentWithFiles(input.Message, input.Files)
60 if err != nil {
61 return nil, err
62 }
63
64 err = b.Commit()
65 if err != nil {
66 return nil, err
67 }
68
69 return &models.AddCommentPayload{
70 ClientMutationID: input.ClientMutationID,
71 Bug: models.NewLoadedBug(b.Snapshot()),
72 Operation: op,
73 }, nil
74}
75
76func (r mutationResolver) ChangeLabels(_ context.Context, input *models.ChangeLabelInput) (*models.ChangeLabelPayload, error) {
77 b, err := r.getBug(input.RepoRef, input.Prefix)
78 if err != nil {
79 return nil, err
80 }
81
82 results, op, err := b.ChangeLabels(input.Added, input.Removed)
83 if err != nil {
84 return nil, err
85 }
86
87 err = b.Commit()
88 if err != nil {
89 return nil, err
90 }
91
92 resultsPtr := make([]*bug.LabelChangeResult, len(results))
93 for i, result := range results {
94 resultsPtr[i] = &result
95 }
96
97 return &models.ChangeLabelPayload{
98 ClientMutationID: input.ClientMutationID,
99 Bug: models.NewLoadedBug(b.Snapshot()),
100 Operation: op,
101 Results: resultsPtr,
102 }, nil
103}
104
105func (r mutationResolver) OpenBug(_ context.Context, input models.OpenBugInput) (*models.OpenBugPayload, error) {
106 b, err := r.getBug(input.RepoRef, input.Prefix)
107 if err != nil {
108 return nil, err
109 }
110
111 op, err := b.Open()
112 if err != nil {
113 return nil, err
114 }
115
116 err = b.Commit()
117 if err != nil {
118 return nil, err
119 }
120
121 return &models.OpenBugPayload{
122 ClientMutationID: input.ClientMutationID,
123 Bug: models.NewLoadedBug(b.Snapshot()),
124 Operation: op,
125 }, nil
126}
127
128func (r mutationResolver) CloseBug(_ context.Context, input models.CloseBugInput) (*models.CloseBugPayload, error) {
129 b, err := r.getBug(input.RepoRef, input.Prefix)
130 if err != nil {
131 return nil, err
132 }
133
134 op, err := b.Close()
135 if err != nil {
136 return nil, err
137 }
138
139 err = b.Commit()
140 if err != nil {
141 return nil, err
142 }
143
144 return &models.CloseBugPayload{
145 ClientMutationID: input.ClientMutationID,
146 Bug: models.NewLoadedBug(b.Snapshot()),
147 Operation: op,
148 }, nil
149}
150
151func (r mutationResolver) SetTitle(_ context.Context, input models.SetTitleInput) (*models.SetTitlePayload, error) {
152 b, err := r.getBug(input.RepoRef, input.Prefix)
153 if err != nil {
154 return nil, err
155 }
156
157 op, err := b.SetTitle(input.Title)
158 if err != nil {
159 return nil, err
160 }
161
162 err = b.Commit()
163 if err != nil {
164 return nil, err
165 }
166
167 return &models.SetTitlePayload{
168 ClientMutationID: input.ClientMutationID,
169 Bug: models.NewLoadedBug(b.Snapshot()),
170 Operation: op,
171 }, nil
172}