From f5dd9263aa43716fe8689a41f8d08a5189a17f77 Mon Sep 17 00:00:00 2001 From: muiscript Date: Tue, 2 Apr 2019 00:07:04 +0900 Subject: [PATCH] implement GetUserItems --- miniqiita.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/miniqiita.go b/miniqiita.go index 29fe40a..4130e9d 100644 --- a/miniqiita.go +++ b/miniqiita.go @@ -2,10 +2,16 @@ package miniqiita import ( "context" + "encoding/json" + "errors" + "fmt" + "io/ioutil" "log" "net/http" "net/url" "os" + "path" + "strconv" ) type Client struct { @@ -40,5 +46,52 @@ type Item struct { } func (c *Client) GetUserItems(ctx context.Context, userID string, page, perPage int) ([]*Item, error) { - return nil, nil + reqURL := *c.BaseURL + + // set path + reqURL.Path = path.Join(reqURL.Path, "users", userID, "items") + + // set query + q := reqURL.Query() + q.Add("page", strconv.Itoa(page)) + q.Add("per_page", strconv.Itoa(perPage)) + reqURL.RawQuery = q.Encode() + + // instantiate request + req, err := http.NewRequest(http.MethodGet, reqURL.String(), nil) + if err != nil { + return nil, err + } + + // set header + req.Header.Set("User-Agent", "qiita-go-client") + + // set context + req = req.WithContext(ctx) + + // send request + resp, err := c.HTTPClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + + switch resp.StatusCode { + case http.StatusOK: + bodyBytes, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + var items []*Item + if err := json.Unmarshal(bodyBytes, &items); err != nil { + return nil, err + } + return items, nil + case http.StatusBadRequest: + return nil, errors.New("bad request. some parameters may be invalid") + case http.StatusNotFound: + return nil, fmt.Errorf("not found. user with id '%s' may not exist", userID) + default: + return nil, errors.New("unexpected error") + } }