mirror of
https://bitbucket.org/skobkin/point-api-go.git
synced 2025-03-14 12:13:24 +00:00
Initial commit. Code separated from point-tools-crawler repository.
This commit is contained in:
commit
c4ac747add
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
/.idea/
|
142
client.go
Normal file
142
client.go
Normal 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
10
meta_post.go
Normal 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
7
page.go
Normal 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
13
post.go
Normal 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
7
token.go
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package point
|
||||||
|
|
||||||
|
type Token struct {
|
||||||
|
AuthToken string `json:"token"`
|
||||||
|
CsRfToken string `json:"csrf_token"`
|
||||||
|
Error string `json:"error"`
|
||||||
|
}
|
Loading…
Reference in a new issue