Skip to content

Commit ca30e81

Browse files
refactor: consolidate http logic into client
2 parents 487b880 + f3b5e31 commit ca30e81

File tree

8 files changed

+182
-229
lines changed

8 files changed

+182
-229
lines changed

stackoverflow/client/answers.go

Lines changed: 21 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,82 @@
11
package client
22

33
import (
4-
"encoding/json"
54
"fmt"
6-
"io"
75
"log"
8-
"net/http"
96
"net/url"
10-
"strconv"
11-
"strings"
127
)
138

149
func (c *Client) GetAnswers(answerIDs *[]int, filter *string) (*[]Answer, error) {
15-
ids := make([]string, len(*answerIDs))
16-
for i, answerID := range *answerIDs {
17-
ids[i] = strconv.Itoa(answerID)
18-
}
19-
log.Printf("%s/%s?team=%s&order=desc&sort=creation&filter=%s", "answers", strings.Join(ids, ";"), c.TeamName, *filter)
20-
route := fmt.Sprintf("%s/%s?team=%s&order=desc&sort=creation&filter=%s", "answers", strings.Join(ids, ";"), c.TeamName, *filter)
21-
req, err := http.NewRequest("GET", fmt.Sprintf("%s%s", c.BaseURL, route), nil)
22-
if err != nil {
23-
return nil, err
24-
}
25-
26-
body, err := c.doRequest(req)
10+
response, err := c.get("answers", answerIDs, filter)
2711
if err != nil {
2812
return nil, err
2913
}
3014

31-
responseWrapper := Wrapper[Answer]{}
32-
err = json.Unmarshal(body, &responseWrapper)
15+
answers, err := UnwrapResponseItems[Answer](response)
3316
if err != nil {
3417
return nil, err
3518
}
3619

37-
answers := responseWrapper.Items
38-
39-
return &answers, nil
20+
return answers, nil
4021
}
4122

4223
func (c *Client) CreateAnswer(answer *Answer) (*Answer, error) {
43-
formData := GenerateAnswerFormData(answer, true)
44-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s", c.BaseURL, "questions/", strconv.Itoa(answer.QuestionID), "/answers/add", c.TeamName), strings.NewReader(formData))
45-
if err != nil {
46-
return nil, err
47-
}
48-
49-
body, err := c.doRequest(req)
24+
response, err := c.create(fmt.Sprintf("%s%d%s", "questions/", answer.QuestionID, "/answers/add"), GenerateAnswerFormData(answer, true))
5025
if err != nil {
5126
return nil, err
5227
}
5328

54-
buf := new(strings.Builder)
55-
io.Copy(buf, strings.NewReader((string(body))))
56-
log.Printf("Response body: %s", buf.String())
57-
58-
responseWrapper := Wrapper[Answer]{}
59-
err = json.Unmarshal(body, &responseWrapper)
29+
answers, err := UnwrapResponseItems[Answer](response)
6030
if err != nil {
6131
return nil, err
6232
}
6333

64-
if len(responseWrapper.Items) != 1 {
65-
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(responseWrapper.Items))
34+
if len(*answers) != 1 {
35+
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(*answers))
6636
}
6737

68-
newAnswer := responseWrapper.Items[0]
38+
newAnswer := (*answers)[0]
6939

7040
return &newAnswer, nil
7141
}
7242

7343
func (c *Client) UpdateAnswer(answer *Answer) (*Answer, error) {
74-
formData := GenerateAnswerFormData(answer, false)
75-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s", c.BaseURL, "answers/", strconv.Itoa(answer.ID), "/edit", c.TeamName), strings.NewReader(formData))
44+
response, err := c.update(fmt.Sprintf("%s%d%s", "answers/", answer.ID, "/edit"), GenerateAnswerFormData(answer, false))
7645
if err != nil {
7746
return nil, err
7847
}
7948

80-
body, err := c.doRequest(req)
49+
answers, err := UnwrapResponseItems[Answer](response)
8150
if err != nil {
8251
return nil, err
8352
}
8453

85-
responseWrapper := Wrapper[Answer]{}
86-
err = json.Unmarshal(body, &responseWrapper)
87-
if err != nil {
88-
return nil, err
54+
if len(*answers) != 1 {
55+
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(*answers))
8956
}
9057

91-
if len(responseWrapper.Items) != 1 {
92-
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(responseWrapper.Items))
93-
}
94-
95-
newAnswer := responseWrapper.Items[0]
58+
newAnswer := (*answers)[0]
9659

9760
return &newAnswer, nil
9861
}
9962

100-
func (c *Client) DeleteAnswer(answerId int, filter *string) error {
101-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s&filter=%s", c.BaseURL, "answers/", strconv.Itoa(answerId), "/delete", c.TeamName, *filter), nil)
63+
func (c *Client) DeleteAnswer(answerId int) error {
64+
err := c.delete(fmt.Sprintf("%s%d%s", "answers/", answerId, "/delete"))
10265
if err != nil {
10366
return err
10467
}
10568

106-
_, err2 := c.doRequest(req)
107-
if err2 != nil {
108-
return err
109-
}
110-
11169
return nil
11270
}
11371

114-
func GenerateAnswerFormData(answer *Answer, isCreate bool) string {
72+
func GenerateAnswerFormData(answer *Answer, isCreate bool) *string {
73+
formData := ""
11574
if isCreate {
116-
formData := fmt.Sprintf("id=%d&body=%s&preview=%t&filter=%s", answer.QuestionID, url.QueryEscape(answer.BodyMarkdown), answer.Preview, answer.Filter)
117-
log.Printf("Form data: %s", formData)
118-
return formData
75+
formData = fmt.Sprintf("id=%d&body=%s&preview=%t&filter=%s", answer.QuestionID, url.QueryEscape(answer.BodyMarkdown), answer.Preview, answer.Filter)
76+
} else {
77+
formData = fmt.Sprintf("id=%d&body=%s&preview=%t&filter=%s", answer.ID, url.QueryEscape(answer.BodyMarkdown), answer.Preview, answer.Filter)
11978
}
12079

121-
formData := fmt.Sprintf("id=%d&body=%s&preview=%t&filter=%s", answer.ID, url.QueryEscape(answer.BodyMarkdown), answer.Preview, answer.Filter)
12280
log.Printf("Form data: %s", formData)
123-
return formData
81+
return &formData
12482
}

stackoverflow/client/articles.go

Lines changed: 17 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,133 +1,77 @@
11
package client
22

33
import (
4-
"encoding/json"
54
"fmt"
6-
"io"
75
"log"
8-
"net/http"
96
"net/url"
10-
"strconv"
117
"strings"
128
)
139

1410
func (c *Client) GetArticles(articleIDs *[]int, filter *string) (*[]Article, error) {
15-
ids := make([]string, len(*articleIDs))
16-
for i, articleID := range *articleIDs {
17-
ids[i] = strconv.Itoa(articleID)
18-
}
19-
log.Printf("%s/%s?team=%s&order=desc&sort=creation&filter=%s", "articles", strings.Join(ids, ";"), c.TeamName, *filter)
20-
route := fmt.Sprintf("%s/%s?team=%s&order=desc&sort=creation&filter=%s", "articles", strings.Join(ids, ";"), c.TeamName, *filter)
21-
req, err := http.NewRequest("GET", fmt.Sprintf("%s%s", c.BaseURL, route), nil)
22-
if err != nil {
23-
return nil, err
24-
}
25-
26-
body, err := c.doRequest(req)
11+
response, err := c.get("articles", articleIDs, filter)
2712
if err != nil {
2813
return nil, err
2914
}
3015

31-
responseWrapper := Wrapper[Article]{}
32-
err = json.Unmarshal(body, &responseWrapper)
16+
articles, err := UnwrapResponseItems[Article](response)
3317
if err != nil {
3418
return nil, err
3519
}
3620

37-
articles := responseWrapper.Items
38-
39-
return &articles, nil
21+
return articles, nil
4022
}
4123

4224
func (c *Client) CreateArticle(article *Article) (*Article, error) {
43-
//rb, err := json.Marshal(&article)
44-
//if err != nil {
45-
// return nil, err
46-
//}
47-
//buf := new(strings.Builder)
48-
//io.Copy(buf, strings.NewReader((string(rb))))
49-
//log.Printf("Deserialized JSON bytes: %s", buf.String())
50-
//req, err := http.NewRequest("POST", fmt.Sprintf("%s%s?team=%s", c.BaseURL, "articles/add", c.TeamName), bytes.NewReader(rb))
51-
52-
formData := GenerateArticleFormData(article)
53-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s?team=%s", c.BaseURL, "articles/add", c.TeamName), strings.NewReader(formData))
54-
if err != nil {
55-
return nil, err
56-
}
57-
58-
body, err := c.doRequest(req)
25+
response, err := c.create("articles/add", GenerateArticleFormData(article))
5926
if err != nil {
6027
return nil, err
6128
}
6229

63-
buf := new(strings.Builder)
64-
io.Copy(buf, strings.NewReader((string(body))))
65-
log.Printf("Response body: %s", buf.String())
66-
67-
responseWrapper := Wrapper[Article]{}
68-
err = json.Unmarshal(body, &responseWrapper)
30+
articles, err := UnwrapResponseItems[Article](response)
6931
if err != nil {
7032
return nil, err
7133
}
7234

73-
if len(responseWrapper.Items) != 1 {
74-
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(responseWrapper.Items))
35+
if len(*articles) != 1 {
36+
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(*articles))
7537
}
7638

77-
newArticle := responseWrapper.Items[0]
39+
newArticle := (*articles)[0]
7840

7941
return &newArticle, nil
8042
}
8143

8244
func (c *Client) UpdateArticle(article *Article) (*Article, error) {
83-
//rb, err := json.Marshal(&article)
84-
//if err != nil {
85-
// return nil, err
86-
//}
87-
//req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s", c.BaseURL, "articles/", strconv.Itoa(article.ID), "/edit", c.TeamName), strings.NewReader(string(rb)))
88-
89-
formData := GenerateArticleFormData(article)
90-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s", c.BaseURL, "articles/", strconv.Itoa(article.ID), "/edit", c.TeamName), strings.NewReader(formData))
45+
response, err := c.update(fmt.Sprintf("%s%d%s", "articles/", article.ID, "/edit"), GenerateArticleFormData(article))
9146
if err != nil {
9247
return nil, err
9348
}
9449

95-
body, err := c.doRequest(req)
50+
articles, err := UnwrapResponseItems[Article](response)
9651
if err != nil {
9752
return nil, err
9853
}
9954

100-
responseWrapper := Wrapper[Article]{}
101-
err = json.Unmarshal(body, &responseWrapper)
102-
if err != nil {
103-
return nil, err
55+
if len(*articles) != 1 {
56+
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(*articles))
10457
}
10558

106-
if len(responseWrapper.Items) != 1 {
107-
return nil, fmt.Errorf("response wrapper does not contain expected number of items (1); item length is %d", len(responseWrapper.Items))
108-
}
109-
110-
newArticle := responseWrapper.Items[0]
59+
newArticle := (*articles)[0]
11160

11261
return &newArticle, nil
11362
}
11463

115-
func (c *Client) DeleteArticle(articleId int, filter *string) error {
116-
req, err := http.NewRequest("POST", fmt.Sprintf("%s%s%s%s?team=%s&filter=%s", c.BaseURL, "articles/", strconv.Itoa(articleId), "/delete", c.TeamName, *filter), nil)
64+
func (c *Client) DeleteArticle(articleId int) error {
65+
err := c.delete(fmt.Sprintf("%s%d%s", "articles/", articleId, "/delete"))
11766
if err != nil {
11867
return err
11968
}
12069

121-
_, err2 := c.doRequest(req)
122-
if err2 != nil {
123-
return err
124-
}
125-
12670
return nil
12771
}
12872

129-
func GenerateArticleFormData(article *Article) string {
73+
func GenerateArticleFormData(article *Article) *string {
13074
formData := fmt.Sprintf("title=%s&body=%s&tags=%s&article_type=%s&filter=%s", url.QueryEscape(article.Title), url.QueryEscape(article.BodyMarkdown), strings.Join(article.Tags, ","), article.ArticleType, article.Filter)
13175
log.Printf("Form data: %s", formData)
132-
return formData
76+
return &formData
13377
}

0 commit comments

Comments
 (0)