diff --git a/collection.go b/collection.go index be68f3b..97cefe6 100644 --- a/collection.go +++ b/collection.go @@ -1,85 +1,113 @@ package writeas import ( "fmt" "net/http" ) type ( // Collection represents a collection of posts. Blogs are a type of collection // on Write.as. Collection struct { Alias string `json:"alias"` Title string `json:"title"` Description string `json:"description"` StyleSheet string `json:"style_sheet"` Private bool `json:"private"` Views int64 `json:"views"` Domain string `json:"domain,omitempty"` Email string `json:"email,omitempty"` TotalPosts int `json:"total_posts"` + + Posts *[]Post `json:"posts,omitempty"` } // CollectionParams holds values for creating a collection. CollectionParams struct { Alias string `json:"alias"` Title string `json:"title"` } ) // GetCollection retrieves a collection, returning the Collection and any error // (in user-friendly form) that occurs. See // https://developer.write.as/docs/api/#retrieve-a-collection func (c *Client) GetCollection(alias string) (*Collection, error) { coll := &Collection{} env, err := c.get(fmt.Sprintf("/collections/%s", alias), coll) if err != nil { return nil, err } var ok bool if coll, ok = env.Data.(*Collection); !ok { return nil, fmt.Errorf("Wrong data returned from API.") } status := env.Code if status == http.StatusOK { return coll, nil } else if status == http.StatusNotFound { return nil, fmt.Errorf("Collection not found.") } else { return nil, fmt.Errorf("Problem getting collection: %s. %v\n", status, err) } return coll, nil } // CreateCollection creates a new collection, returning a user-friendly error // if one comes up. Requires a Write.as subscription. See // https://developer.write.as/docs/api/#create-a-collection func (c *Client) CreateCollection(sp *CollectionParams) (*Collection, error) { p := &Collection{} env, err := c.post("/collections", sp, p) if err != nil { return nil, err } var ok bool if p, ok = env.Data.(*Collection); !ok { return nil, fmt.Errorf("Wrong data returned from API.") } status := env.Code if status == http.StatusCreated { return p, nil } else if status == http.StatusBadRequest { return nil, fmt.Errorf("Bad request: %s", env.ErrorMessage) } else if status == http.StatusForbidden { return nil, fmt.Errorf("Casual or Pro user required.") } else if status == http.StatusConflict { return nil, fmt.Errorf("Collection name is already taken.") } else if status == http.StatusPreconditionFailed { return nil, fmt.Errorf("Reached max collection quota.") } return nil, fmt.Errorf("Problem getting post: %s. %v\n", status, err) } + +// GetCollectionPosts retrieves a collection's posts, returning the Posts +// and any error (in user-friendly form) that occurs. See +// https://developer.write.as/docs/api/#retrieve-collection-posts +func (c *Client) GetCollectionPosts(alias string) (*[]Post, error) { + coll := &Collection{} + env, err := c.get(fmt.Sprintf("/collections/%s/posts", alias), coll) + if err != nil { + return nil, err + } + + var ok bool + if coll, ok = env.Data.(*Collection); !ok { + return nil, fmt.Errorf("Wrong data returned from API.") + } + status := env.Code + + if status == http.StatusOK { + return coll.Posts, nil + } else if status == http.StatusNotFound { + return nil, fmt.Errorf("Collection not found.") + } else { + return nil, fmt.Errorf("Problem getting collection: %s. %v\n", status, err) + } + return coll.Posts, nil +} diff --git a/collection_test.go b/collection_test.go index c413235..44c67e2 100644 --- a/collection_test.go +++ b/collection_test.go @@ -1,30 +1,43 @@ package writeas import ( "fmt" "testing" ) func TestGetCollection(t *testing.T) { wac := NewClient() res, err := wac.GetCollection("blog") if err != nil { t.Errorf("Unexpected fetch results: %+v, err: %v\n", res, err) } else { t.Logf("Post: %+v", res) if res.Title != "write.as" { t.Errorf("Unexpected fetch results: %+v\n", res) } } } +func TestGetCollectionPosts(t *testing.T) { + wac := NewClient() + + res, err := wac.GetCollectionPosts("blog") + if err != nil { + t.Errorf("Unexpected fetch results: %+v, err: %v\n", res, err) + } else { + if len(*res) == 0 { + t.Errorf("No posts returned!") + } + } +} + func ExampleClient_GetCollection() { c := NewClient() coll, err := c.GetCollection("blog") if err != nil { fmt.Printf("%v", err) return } fmt.Printf("%+v", coll) }