fizzy-cli 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/cmd/board_create.go +15 -16
- package/cmd/board_create_test.go +0 -17
- package/cmd/card_create.go +24 -25
- package/cmd/card_create_test.go +20 -40
- package/cmd/card_update.go +30 -21
- package/cmd/card_update_test.go +28 -24
- package/cmd/column_create.go +11 -12
- package/cmd/column_create_test.go +3 -21
- package/cmd/comment.go +14 -0
- package/cmd/comment_create.go +51 -0
- package/cmd/comment_create_test.go +129 -0
- package/cmd/comment_delete.go +46 -0
- package/cmd/comment_delete_test.go +92 -0
- package/cmd/comment_list.go +51 -0
- package/cmd/comment_list_test.go +132 -0
- package/cmd/comment_show.go +46 -0
- package/cmd/comment_show_test.go +104 -0
- package/cmd/comment_update.go +51 -0
- package/cmd/comment_update_test.go +130 -0
- package/cmd/reaction.go +13 -0
- package/cmd/reaction_create.go +46 -0
- package/cmd/reaction_create_test.go +113 -0
- package/cmd/reaction_delete.go +46 -0
- package/cmd/reaction_delete_test.go +92 -0
- package/cmd/reaction_list.go +51 -0
- package/cmd/reaction_list_test.go +125 -0
- package/cmd/step.go +14 -0
- package/cmd/step_create.go +53 -0
- package/cmd/step_create_test.go +171 -0
- package/cmd/step_delete.go +46 -0
- package/cmd/step_delete_test.go +92 -0
- package/cmd/step_update.go +66 -0
- package/cmd/step_update_test.go +190 -0
- package/internal/api/boards.go +59 -0
- package/internal/api/cards.go +288 -0
- package/internal/api/client.go +5 -644
- package/internal/api/columns.go +50 -0
- package/internal/api/comments.go +99 -0
- package/internal/api/identity.go +24 -0
- package/internal/api/notifications.go +89 -0
- package/internal/api/reactions.go +61 -0
- package/internal/api/steps.go +93 -0
- package/internal/api/tags.go +24 -0
- package/internal/api/types.go +178 -0
- package/internal/ui/comment_list.go +25 -0
- package/internal/ui/reaction_list.go +14 -0
- package/package.json +1 -1
- package/IMPLEMENTATION_PLAN.md +0 -338
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
package api
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"context"
|
|
5
|
+
"fmt"
|
|
6
|
+
"net/http"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
func (c *Client) GetCards(ctx context.Context, filters CardFilters) ([]Card, error) {
|
|
10
|
+
endpointURL := c.AccountBaseURL + "/cards"
|
|
11
|
+
|
|
12
|
+
req, err := c.newRequest(ctx, http.MethodGet, endpointURL, nil)
|
|
13
|
+
if err != nil {
|
|
14
|
+
return nil, fmt.Errorf("failed to create get cards request: %w", err)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if len(filters.BoardIDs) > 0 {
|
|
18
|
+
q := req.URL.Query()
|
|
19
|
+
for _, boardID := range filters.BoardIDs {
|
|
20
|
+
q.Add("board_ids[]", boardID)
|
|
21
|
+
}
|
|
22
|
+
req.URL.RawQuery = q.Encode()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var response []Card
|
|
26
|
+
_, err = c.decodeResponse(req, &response)
|
|
27
|
+
if err != nil {
|
|
28
|
+
return nil, err
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return response, nil
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func (c *Client) GetCard(ctx context.Context, cardNumber int) (*Card, error) {
|
|
35
|
+
endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
|
|
36
|
+
|
|
37
|
+
req, err := c.newRequest(ctx, http.MethodGet, endpointURL, nil)
|
|
38
|
+
if err != nil {
|
|
39
|
+
return nil, fmt.Errorf("failed to create get card by id request: %w", err)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
var response Card
|
|
43
|
+
_, err = c.decodeResponse(req, &response)
|
|
44
|
+
if err != nil {
|
|
45
|
+
return nil, err
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return &response, nil
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
func (c *Client) PostCards(ctx context.Context, payload CreateCardPayload) (bool, error) {
|
|
52
|
+
if c.BoardBaseURL == "" {
|
|
53
|
+
return false, fmt.Errorf("please select a board first with 'fizzy use --board <board_name>'")
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
endpointURL := c.BoardBaseURL + "/cards"
|
|
57
|
+
|
|
58
|
+
body := map[string]CreateCardPayload{"card": payload}
|
|
59
|
+
|
|
60
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
|
|
61
|
+
if err != nil {
|
|
62
|
+
return false, fmt.Errorf("failed to create card request: %w", err)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
_, err = c.decodeResponse(req, nil, http.StatusCreated)
|
|
66
|
+
if err != nil {
|
|
67
|
+
return false, err
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return true, nil
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
func (c *Client) PutCard(ctx context.Context, cardNumber int, payload UpdateCardPayload) (*Card, error) {
|
|
74
|
+
endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
|
|
75
|
+
|
|
76
|
+
body := map[string]UpdateCardPayload{"card": payload}
|
|
77
|
+
|
|
78
|
+
req, err := c.newRequest(ctx, http.MethodPut, endpointURL, body)
|
|
79
|
+
if err != nil {
|
|
80
|
+
return nil, fmt.Errorf("failed to create update card request: %w", err)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
var response Card
|
|
84
|
+
_, err = c.decodeResponse(req, &response, http.StatusOK)
|
|
85
|
+
if err != nil {
|
|
86
|
+
return nil, err
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return &response, nil
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
func (c *Client) DeleteCard(ctx context.Context, cardNumber int) (bool, error) {
|
|
93
|
+
endpointURL := fmt.Sprintf("%s/cards/%d", c.AccountBaseURL, cardNumber)
|
|
94
|
+
|
|
95
|
+
req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
|
|
96
|
+
if err != nil {
|
|
97
|
+
return false, fmt.Errorf("failed to create delete card request: %w", err)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
101
|
+
if err != nil {
|
|
102
|
+
return false, err
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return true, nil
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func (c *Client) PostCardsClosure(ctx context.Context, cardNumber int) (bool, error) {
|
|
109
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/closure", c.AccountBaseURL, cardNumber)
|
|
110
|
+
|
|
111
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
|
|
112
|
+
if err != nil {
|
|
113
|
+
return false, fmt.Errorf("failed to create closure card request: %w", err)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
117
|
+
if err != nil {
|
|
118
|
+
return false, err
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return true, nil
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
func (c *Client) PostCardNotNow(ctx context.Context, cardNumber int) (bool, error) {
|
|
125
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/not_now", c.AccountBaseURL, cardNumber)
|
|
126
|
+
|
|
127
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
|
|
128
|
+
if err != nil {
|
|
129
|
+
return false, fmt.Errorf("failed to create post not now request: %w", err)
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
133
|
+
if err != nil {
|
|
134
|
+
return false, err
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
return true, nil
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
func (c *Client) PostCardTriage(ctx context.Context, cardNumber int, columnID string) (bool, error) {
|
|
141
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/triage", c.AccountBaseURL, cardNumber)
|
|
142
|
+
|
|
143
|
+
body := map[string]any{"column_id": columnID}
|
|
144
|
+
|
|
145
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
|
|
146
|
+
if err != nil {
|
|
147
|
+
return false, fmt.Errorf("failed to create post triage request: %w", err)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
151
|
+
if err != nil {
|
|
152
|
+
return false, err
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return true, nil
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
func (c *Client) DeleteCardTriage(ctx context.Context, cardNumber int) (bool, error) {
|
|
159
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/triage", c.AccountBaseURL, cardNumber)
|
|
160
|
+
|
|
161
|
+
req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
|
|
162
|
+
if err != nil {
|
|
163
|
+
return false, fmt.Errorf("failed to create delete triage request: %w", err)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
167
|
+
if err != nil {
|
|
168
|
+
return false, err
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return true, nil
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
func (c *Client) PostCardWatch(ctx context.Context, cardNumber int) (bool, error) {
|
|
175
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/watch", c.AccountBaseURL, cardNumber)
|
|
176
|
+
|
|
177
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
|
|
178
|
+
if err != nil {
|
|
179
|
+
return false, fmt.Errorf("failed to create post watch request: %w", err)
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
183
|
+
if err != nil {
|
|
184
|
+
return false, err
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return true, nil
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
func (c *Client) DeleteCardWatch(ctx context.Context, cardNumber int) (bool, error) {
|
|
191
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/watch", c.AccountBaseURL, cardNumber)
|
|
192
|
+
|
|
193
|
+
req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
|
|
194
|
+
if err != nil {
|
|
195
|
+
return false, fmt.Errorf("failed to create delete watch request: %w", err)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
199
|
+
if err != nil {
|
|
200
|
+
return false, err
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return true, nil
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
func (c *Client) PostCardGoldenness(ctx context.Context, cardNumber int) (bool, error) {
|
|
207
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/goldness", c.AccountBaseURL, cardNumber)
|
|
208
|
+
|
|
209
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, nil)
|
|
210
|
+
if err != nil {
|
|
211
|
+
return false, fmt.Errorf("failed to create post goldness request: %w", err)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
215
|
+
if err != nil {
|
|
216
|
+
return false, err
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return true, nil
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
func (c *Client) DeleteCardGoldenness(ctx context.Context, cardNumber int) (bool, error) {
|
|
223
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/goldness", c.AccountBaseURL, cardNumber)
|
|
224
|
+
|
|
225
|
+
req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
|
|
226
|
+
if err != nil {
|
|
227
|
+
return false, fmt.Errorf("failed to create delete goldness request: %w", err)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
231
|
+
if err != nil {
|
|
232
|
+
return false, err
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return true, nil
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
func (c *Client) DeleteCardsClosure(ctx context.Context, cardNumber int) (bool, error) {
|
|
239
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/closure", c.AccountBaseURL, cardNumber)
|
|
240
|
+
|
|
241
|
+
req, err := c.newRequest(ctx, http.MethodDelete, endpointURL, nil)
|
|
242
|
+
if err != nil {
|
|
243
|
+
return false, fmt.Errorf("failed to create delete closure card request: %w", err)
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
247
|
+
if err != nil {
|
|
248
|
+
return false, err
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return true, nil
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
func (c *Client) PostCardAssignments(ctx context.Context, cardNumber int, userID string) (bool, error) {
|
|
255
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/assignments", c.AccountBaseURL, cardNumber)
|
|
256
|
+
|
|
257
|
+
body := map[string]string{"assignee_id": userID}
|
|
258
|
+
|
|
259
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
|
|
260
|
+
if err != nil {
|
|
261
|
+
return false, fmt.Errorf("failed to create assignment request: %w", err)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
265
|
+
if err != nil {
|
|
266
|
+
return false, err
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return true, nil
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
func (c *Client) PostCardTagging(ctx context.Context, cardNumber int, tagTitle string) (bool, error) {
|
|
273
|
+
endpointURL := fmt.Sprintf("%s/cards/%d/taggings", c.AccountBaseURL, cardNumber)
|
|
274
|
+
|
|
275
|
+
body := map[string]string{"tag_title": tagTitle}
|
|
276
|
+
|
|
277
|
+
req, err := c.newRequest(ctx, http.MethodPost, endpointURL, body)
|
|
278
|
+
if err != nil {
|
|
279
|
+
return false, fmt.Errorf("failed to create tagging request: %w", err)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
_, err = c.decodeResponse(req, nil, http.StatusNoContent)
|
|
283
|
+
if err != nil {
|
|
284
|
+
return false, err
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return true, nil
|
|
288
|
+
}
|