diff --git a/collection.go b/collection.go index 2f28dbc..e9102b0 100644 --- a/collection.go +++ b/collection.go @@ -1,47 +1,87 @@ package writeas import ( "fmt" "net/http" ) -// Collection represents a collection of posts. Blogs are a type of collection -// on Write.as. -type 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"` -} +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"` + } + + // 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://writeas.github.io/docs/#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://writeas.github.io/docs/#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.") + } else { + return nil, fmt.Errorf("Problem getting post: %s. %v\n", status, err) + } + return p, nil +}