Page Menu
Home
Musing Studio
Search
Configure Global Search
Log In
Files
F10455633
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Subscribers
None
View Options
diff --git a/collection.go b/collection.go
index d63e116..8c00a54 100644
--- a/collection.go
+++ b/collection.go
@@ -1,137 +1,161 @@
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"`
URL string `json:"url,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"`
}
)
// 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 {
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: %d. %v\n", status, err)
}
return p, nil
}
// 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: %d. %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: %d. %v\n", status, err)
}
}
// GetUserCollections retrieves the authenticated user's collections.
// See https://developers.write.as/docs/api/#retrieve-user-39-s-collections
func (c *Client) GetUserCollections() (*[]Collection, error) {
colls := &[]Collection{}
env, err := c.get("/me/collections", colls)
if err != nil {
return nil, err
}
var ok bool
if colls, ok = env.Data.(*[]Collection); !ok {
return nil, fmt.Errorf("Wrong data returned from API.")
}
status := env.Code
if status != http.StatusOK {
if c.isNotLoggedIn(status) {
return nil, fmt.Errorf("Not authenticated.")
}
return nil, fmt.Errorf("Problem getting collections: %d. %v\n", status, err)
}
return colls, nil
}
+
+// DeleteCollection permanently deletes a collection and makes any posts on it
+// anonymous.
+//
+// See https://developers.write.as/docs/api/#delete-a-collection.
+func (c *Client) DeleteCollection(alias string) error {
+ endpoint := "/collections/" + alias
+ env, err := c.delete(endpoint, nil /* data */)
+ if err != nil {
+ return err
+ }
+
+ status := env.Code
+ switch status {
+ case http.StatusNoContent:
+ return nil
+ case http.StatusUnauthorized:
+ return fmt.Errorf("Not authenticated.")
+ case http.StatusBadRequest:
+ return fmt.Errorf("Bad request: %s", env.ErrorMessage)
+ default:
+ return fmt.Errorf("Problem deleting collection: %d. %s\n", status, env.ErrorMessage)
+ }
+}
diff --git a/collection_test.go b/collection_test.go
index da9a7f3..93e82c7 100644
--- a/collection_test.go
+++ b/collection_test.go
@@ -1,63 +1,103 @@
package writeas
import (
"fmt"
+ "strings"
"testing"
+ "time"
)
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("Collection: %+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 TestGetUserCollections(t *testing.T) {
wac := NewDevClient()
_, err := wac.LogIn("demo", "demo")
if err != nil {
t.Fatalf("Unable to log in: %v", err)
}
defer wac.LogOut()
res, err := wac.GetUserCollections()
if err != nil {
t.Errorf("Unexpected fetch results: %+v, err: %v\n", res, err)
} else {
t.Logf("User collections: %+v", res)
if len(*res) == 0 {
t.Errorf("No collections returned!")
}
}
}
+func TestCreateAndDeleteCollection(t *testing.T) {
+ wac := NewDevClient()
+ _, err := wac.LogIn("demo", "demo")
+ if err != nil {
+ t.Fatalf("Unable to log in: %v", err)
+ }
+ defer wac.LogOut()
+
+ now := time.Now().Unix()
+ alias := fmt.Sprintf("test-collection-%v", now)
+ c, err := wac.CreateCollection(&CollectionParams{
+ Alias: alias,
+ Title: fmt.Sprintf("Test Collection %v", now),
+ })
+ if err != nil {
+ t.Fatalf("Unable to create collection %q: %v", alias, err)
+ }
+
+ if err := wac.DeleteCollection(c.Alias); err != nil {
+ t.Fatalf("Unable to delete collection %q: %v", alias, err)
+ }
+}
+
+func TestDeleteCollectionUnauthenticated(t *testing.T) {
+ wac := NewDevClient()
+
+ now := time.Now().Unix()
+ alias := fmt.Sprintf("test-collection-does-not-exist-%v", now)
+ err := wac.DeleteCollection(alias)
+ if err == nil {
+ t.Fatalf("Should not be able to delete collection %q unauthenticated.", alias)
+ }
+
+ if !strings.Contains(err.Error(), "Not authenticated") {
+ t.Fatalf("Error message should be more informative: %v", err)
+ }
+}
+
func ExampleClient_GetCollection() {
c := NewClient()
coll, err := c.GetCollection("blog")
if err != nil {
fmt.Printf("%v", err)
return
}
fmt.Printf("%s", coll.Title)
// Output: write.as
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Fri, Jan 31, 3:02 PM (16 h, 28 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3145859
Attached To
rWGO writeas-go
Event Timeline
Log In to Comment