Skip to content

Commit

Permalink
refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
momotaro98 committed Nov 3, 2020
1 parent ba5fc68 commit 99ab13b
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 61 deletions.
106 changes: 50 additions & 56 deletions backend.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import (
"fmt"
"io/ioutil"
"net/http"

"github.com/tomnomnom/linkheader"
)

const (
Expand All @@ -17,104 +19,96 @@ func setAuthHeader(req *http.Request, token string) {
req.Header.Set("Authorization", val)
}

type ReqGetAuthenticatedUserItems struct {
type GetRequest struct {
Token string
Page int
}

func GetAuthenticatedUserItems(reqObj *ReqGetAuthenticatedUserItems) ([]*Article, error) {
url := fmt.Sprintf(qiitaGetAuthenticatedUserItemsURI, reqObj.Page)
type ArticlesGetRequester interface {
AssembleURL() (url string)
SetAuthHeader(req *http.Request)
}

type Links struct {
linkheader.Links
}

func GetArticles(r ArticlesGetRequester) (articles []*Article, links *Links, err error) {
url := r.AssembleURL()
req, _ := http.NewRequest(http.MethodGet, url, nil)
setAuthHeader(req, reqObj.Token)
//setAuthHeader(req, reqObj.Token)
r.SetAuthHeader(req)
client := new(http.Client)
res, err := client.Do(req)
if err != nil {
return nil, err
return nil, nil, err
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, nil, fmt.Errorf("unable to read response body (%s): %v", url, err)
}

if res.StatusCode != 200 {
body, _ := ioutil.ReadAll(res.Body)
return nil, fmt.Errorf("response is not 200. res: %+v, body: %+v\n", res, body)
return nil, nil, fmt.Errorf("response is not 200. res: %+v, body: %+v\n", res, body)
}

if err != nil {
return nil, fmt.Errorf("Unable to read response body (%s): %v", url, err)
if h := res.Header["Link"]; len(h) == 1 {
header := h[0]
links = &Links{
linkheader.Parse(header),
}
for _, link := range links.Links {
fmt.Printf("URL: %s; Rel: %s\n", link.URL, link.Rel)
}
}

var articlesFromApi []QiitaArticle
if err := json.Unmarshal(body, &articlesFromApi); err != nil {
return nil, fmt.Errorf("Unable to unmarshal response (%s): %v", url, err)
return nil, nil, fmt.Errorf("unable to unmarshal response (%s): %v", url, err)

}
// Convert API data model to qiic domain model
var ret []*Article
for _, a := range articlesFromApi {
var tags []Tag
for _, t := range a.Tags {
tag := NewTag(t.Name)
tags = append(tags, tag)
}
article := NewArticle(a.ID, a.Title, tags, a.LikesCount, a.URL)
ret = append(ret, &article)
articles = append(articles, &article)
}

return ret, nil
return articles, links, nil
}

// UserStockAPI is Qiita v2 API resource "GET /api/v2/users/:url_name/stocks"
type UserStockAPI struct {
UserName string
Page int
type ReqGetAuthenticatedUserItems struct {
GetRequest
}

// NewUserStockAPI is a func.
func NewUserStockAPI(UserName string, Page int) *UserStockAPI {
us := UserStockAPI{UserName: UserName, Page: Page}
return &us
func (r *ReqGetAuthenticatedUserItems) AssembleURL() string {
return fmt.Sprintf(qiitaGetAuthenticatedUserItemsURI, r.Page)
}

func (us *UserStockAPI) fetch(url string) ([]*Article, error) {
res, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("Unable to get (%s): %v", url, err)
} else if res.StatusCode != 200 {
return nil, fmt.Errorf("Unable to get (%s): http status %d", url, err)
}
defer res.Body.Close()

body, err := ioutil.ReadAll(res.Body)
if err != nil {
return nil, fmt.Errorf("Unable to read response body (%s): %v", url, err)
}
func (r *ReqGetAuthenticatedUserItems) SetAuthHeader(req *http.Request) {
setAuthHeader(req, r.Token)
}

var articlesFromApi []QiitaArticle
if err := json.Unmarshal(body, &articlesFromApi); err != nil {
return nil, fmt.Errorf("Unable to unmarshal response (%s): %v", url, err)
// func CollectAuthenticatedUserItems(reqObj *ReqGetAuthenticatedUserItems) ([]*Article, error) {
// }

}
// Convert API data model to qiic domain model
var ret []*Article
for _, a := range articlesFromApi {
var tags []Tag
for _, t := range a.Tags {
tag := NewTag(t.Name)
tags = append(tags, tag)
}
article := NewArticle(a.ID, a.Title, tags, a.LikesCount, a.URL)
ret = append(ret, &article)
}
// UserStockRequest is Qiita v2 API resource "GET /api/v2/users/:url_name/stocks"
type UserStockRequest struct {
UserName string
GetRequest
}

return ret, nil
func (r *UserStockRequest) AssembleURL() string {
return fmt.Sprintf(qiitaUserStockURI, r.UserName, r.Page)
}

// Fetch (HTTP Access)
func (us *UserStockAPI) Fetch() ([]*Article, error) {
articles, err := us.fetch(fmt.Sprintf(qiitaUserStockURI, us.UserName, us.Page))
if err != nil {
return nil, err
}
return articles, nil
func (r *UserStockRequest) SetAuthHeader(req *http.Request) {
// Do nothing
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ require (
github.com/moznion/go-unicode-east-asian-width v0.0.0-20140622124307-0231aeb79f9b
github.com/onsi/gomega v1.10.3 // indirect
github.com/stretchr/testify v1.4.0
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80
github.com/urfave/cli v1.21.0
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y=
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE=
github.com/urfave/cli v1.21.0 h1:wYSSj06510qPIzGSua9ZqsncMmWE3Zr55KBERygyrxE=
github.com/urfave/cli v1.21.0/go.mod h1:lxDj6qX9Q6lWQxIrbrT0nwecwUtRnhVZAJjJZrVUZZQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
Expand Down
17 changes: 12 additions & 5 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,13 @@ func main() {
username := ctx.String("username")
page := ctx.Int("page")
// Fetch from API Server
userStock := NewUserStockAPI(username, page)
articles, err := userStock.Fetch()
req := &UserStockRequest{
UserName: username,
GetRequest: GetRequest{
Page: page,
},
}
articles, _, err := GetArticles(req)
if err != nil {
return err
}
Expand Down Expand Up @@ -113,11 +118,13 @@ func main() {
token := ctx.String("token")
page := ctx.Int("page")
// Fetch from API Server
articles, err := GetAuthenticatedUserItems(
&ReqGetAuthenticatedUserItems{
req := &ReqGetAuthenticatedUserItems{
GetRequest{
Token: token,
Page: page,
})
},
}
articles, _, err := GetArticles(req)
if err != nil {
return err
}
Expand Down

0 comments on commit 99ab13b

Please sign in to comment.