Initial commit. Code separated from point-tools-crawler repository.

This commit is contained in:
Alexey Skobkin 2016-03-29 10:24:58 +03:00
commit c4ac747add
7 changed files with 186 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/.idea/

142
client.go Normal file
View File

@ -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
}

10
meta_post.go Normal file
View File

@ -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"`
}

7
page.go Normal file
View File

@ -0,0 +1,7 @@
package point
type Page struct {
HasNext bool `json:"has_next"`
Posts []MetaPost `json:"posts"`
Error string `json:"error"`
}

13
post.go Normal file
View File

@ -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"`
}

7
token.go Normal file
View File

@ -0,0 +1,7 @@
package point
type Token struct {
AuthToken string `json:"token"`
CsRfToken string `json:"csrf_token"`
Error string `json:"error"`
}

6
user.go Normal file
View File

@ -0,0 +1,6 @@
package point
type User struct {
Id int `json:"id"`
Login string `json:"login"`
}