From c4ac747addfdd3da777de28a919743011cf16fa1 Mon Sep 17 00:00:00 2001 From: Alexey Skobkin Date: Tue, 29 Mar 2016 10:24:58 +0300 Subject: [PATCH] Initial commit. Code separated from point-tools-crawler repository. --- .gitignore | 1 + client.go | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++ meta_post.go | 10 ++++ page.go | 7 +++ post.go | 13 +++++ token.go | 7 +++ user.go | 6 +++ 7 files changed, 186 insertions(+) create mode 100644 .gitignore create mode 100644 client.go create mode 100644 meta_post.go create mode 100644 page.go create mode 100644 post.go create mode 100644 token.go create mode 100644 user.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57f1cb2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea/ \ No newline at end of file diff --git a/client.go b/client.go new file mode 100644 index 0000000..20afc0c --- /dev/null +++ b/client.go @@ -0,0 +1,142 @@ +package point + +import ( + "bitbucket.org/skobkin/dumb-http-go" + "encoding/json" + "errors" + "log" + "net/http" + "net/url" + "strconv" +) + +type PointClient struct { + client simple_http.Client + apiUrl string + token Token +} + +func NewClient(apiUrl string) PointClient { + return PointClient{ + simple_http.Client{http.Client{}}, + apiUrl, + Token{}, + } +} + +func (c *PointClient) Login(login, password string) (Token, error) { + var token Token + + data := url.Values{} + data.Set("login", login) + data.Set("password", password) + + body, reqErr := c.client.MakePostRequest(c.apiUrl+"login", data, nil) + + if reqErr != nil { + return token, reqErr + } + + jsonErr := json.Unmarshal(body, &token) + + if jsonErr != nil { + log.Fatal(jsonErr) + return token, errors.New("JSON deserialization error") + } + + if token.Error != "" { + return token, errors.New(token.Error) + } + + c.token = token + + return token, nil +} + +func (c *PointClient) GetRecentAllPostsPage() (Page, error) { + var page Page + + if len(c.token.AuthToken) == 0 { + log.Fatal("Can not get recent posts. Login first.") + return page, errors.New("Login first") + } + + headers := map[string]string{ + "Authorization": c.token.AuthToken, + } + + body, reqErr := c.client.MakeGetRequest(c.apiUrl+"all", nil, &headers) + + if reqErr != nil { + return page, errors.New("HTTP request error") + } + + jsonErr := json.Unmarshal(body, &page) + + if jsonErr != nil { + log.Fatal(jsonErr) + return page, errors.New("JSON deserialization error") + } + + // Move page.Error to response object + if page.Error == "NotAuthorized" { + log.Fatal("Please use correct login and password to fetch recent posts") + return page, errors.New("Not authorized") + } + + return page, nil +} + +func (c *PointClient) GetNextAllPostsPageBeforeUid(uid int) (Page, error) { + var nextPage Page + + if len(c.token.AuthToken) == 0 { + log.Fatal("Can not get recent posts. Login first.") + return nextPage, errors.New("Login first") + } + + data := url.Values{} + data.Set("before", strconv.Itoa(uid)) + + headers := map[string]string{ + "Authorization": c.token.AuthToken, + } + + body, req_err := c.client.MakeGetRequest(c.apiUrl+"all", &data, &headers) + + if req_err != nil { + return nextPage, errors.New("HTTP request error") + } + + json_err := json.Unmarshal(body, &nextPage) + + if json_err != nil { + log.Fatal(json_err) + return nextPage, errors.New("JSON deserialization error") + } + + // Move page.Error to response object + if nextPage.Error == "NotAuthorized" { + log.Fatal("Please use correct login and password to fetch recent posts") + return nextPage, errors.New("Not authorized") + } + + return nextPage, nil +} + +func (c *PointClient) GetNextAllPostsPage(page Page) (Page, error) { + var nextPage Page + + if len(page.Posts) == 0 { + return nextPage, errors.New("Page must have has_next=true and some posts") + } + + if len(c.token.AuthToken) == 0 { + log.Fatal("Can not get recent posts. Login first.") + return nextPage, errors.New("Login first") + } + + nextPage, err := c.GetNextAllPostsPageBeforeUid(page.Posts[len(page.Posts)-1].Uid) + + return nextPage, err +} diff --git a/meta_post.go b/meta_post.go new file mode 100644 index 0000000..9dd5d8e --- /dev/null +++ b/meta_post.go @@ -0,0 +1,10 @@ +package point + +type MetaPost struct { + Bookmarked bool `json:"bookmarked"` + Uid int `json:"uid"` + Subscribed bool `json:"subscribed"` + Editable bool `json:"editable"` + Recommended bool `json:"recommended"` + Post Post `json:"post"` +} diff --git a/page.go b/page.go new file mode 100644 index 0000000..3e304b4 --- /dev/null +++ b/page.go @@ -0,0 +1,7 @@ +package point + +type Page struct { + HasNext bool `json:"has_next"` + Posts []MetaPost `json:"posts"` + Error string `json:"error"` +} diff --git a/post.go b/post.go new file mode 100644 index 0000000..bf48553 --- /dev/null +++ b/post.go @@ -0,0 +1,13 @@ +package point + +type Post struct { + Id string `json:"id"` + Author User `json:"author"` + Tags []string `json:"tags"` + Text string `json:"text"` + Files []string `json:"files"` + CommentsCount int `json:"comments_count"` + Created string `json:"created"` + Pinned bool `json:"pinned"` + Private bool `json:"private"` +} diff --git a/token.go b/token.go new file mode 100644 index 0000000..26fb9a9 --- /dev/null +++ b/token.go @@ -0,0 +1,7 @@ +package point + +type Token struct { + AuthToken string `json:"token"` + CsRfToken string `json:"csrf_token"` + Error string `json:"error"` +} diff --git a/user.go b/user.go new file mode 100644 index 0000000..ee5a5b3 --- /dev/null +++ b/user.go @@ -0,0 +1,6 @@ +package point + +type User struct { + Id int `json:"id"` + Login string `json:"login"` +}