Go client for the Write.as API https://developers.write.as
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
3.3 KiB

  1. package writeas
  2. import (
  3. "fmt"
  4. "net/http"
  5. )
  6. type (
  7. // Collection represents a collection of posts. Blogs are a type of collection
  8. // on Write.as.
  9. Collection struct {
  10. Alias string `json:"alias"`
  11. Title string `json:"title"`
  12. Description string `json:"description"`
  13. StyleSheet string `json:"style_sheet"`
  14. Private bool `json:"private"`
  15. Views int64 `json:"views"`
  16. Domain string `json:"domain,omitempty"`
  17. Email string `json:"email,omitempty"`
  18. TotalPosts int `json:"total_posts"`
  19. Posts *[]Post `json:"posts,omitempty"`
  20. }
  21. // CollectionParams holds values for creating a collection.
  22. CollectionParams struct {
  23. Alias string `json:"alias"`
  24. Title string `json:"title"`
  25. }
  26. )
  27. // CreateCollection creates a new collection, returning a user-friendly error
  28. // if one comes up. Requires a Write.as subscription. See
  29. // https://developer.write.as/docs/api/#create-a-collection
  30. func (c *Client) CreateCollection(sp *CollectionParams) (*Collection, error) {
  31. p := &Collection{}
  32. env, err := c.post("/collections", sp, p)
  33. if err != nil {
  34. return nil, err
  35. }
  36. var ok bool
  37. if p, ok = env.Data.(*Collection); !ok {
  38. return nil, fmt.Errorf("Wrong data returned from API.")
  39. }
  40. status := env.Code
  41. if status == http.StatusCreated {
  42. return p, nil
  43. } else if status == http.StatusBadRequest {
  44. return nil, fmt.Errorf("Bad request: %s", env.ErrorMessage)
  45. } else if status == http.StatusForbidden {
  46. return nil, fmt.Errorf("Casual or Pro user required.")
  47. } else if status == http.StatusConflict {
  48. return nil, fmt.Errorf("Collection name is already taken.")
  49. } else if status == http.StatusPreconditionFailed {
  50. return nil, fmt.Errorf("Reached max collection quota.")
  51. }
  52. return nil, fmt.Errorf("Problem getting post: %d. %v\n", status, err)
  53. }
  54. // GetCollection retrieves a collection, returning the Collection and any error
  55. // (in user-friendly form) that occurs. See
  56. // https://developer.write.as/docs/api/#retrieve-a-collection
  57. func (c *Client) GetCollection(alias string) (*Collection, error) {
  58. coll := &Collection{}
  59. env, err := c.get(fmt.Sprintf("/collections/%s", alias), coll)
  60. if err != nil {
  61. return nil, err
  62. }
  63. var ok bool
  64. if coll, ok = env.Data.(*Collection); !ok {
  65. return nil, fmt.Errorf("Wrong data returned from API.")
  66. }
  67. status := env.Code
  68. if status == http.StatusOK {
  69. return coll, nil
  70. } else if status == http.StatusNotFound {
  71. return nil, fmt.Errorf("Collection not found.")
  72. } else {
  73. return nil, fmt.Errorf("Problem getting collection: %d. %v\n", status, err)
  74. }
  75. }
  76. // GetCollectionPosts retrieves a collection's posts, returning the Posts
  77. // and any error (in user-friendly form) that occurs. See
  78. // https://developer.write.as/docs/api/#retrieve-collection-posts
  79. func (c *Client) GetCollectionPosts(alias string) (*[]Post, error) {
  80. coll := &Collection{}
  81. env, err := c.get(fmt.Sprintf("/collections/%s/posts", alias), coll)
  82. if err != nil {
  83. return nil, err
  84. }
  85. var ok bool
  86. if coll, ok = env.Data.(*Collection); !ok {
  87. return nil, fmt.Errorf("Wrong data returned from API.")
  88. }
  89. status := env.Code
  90. if status == http.StatusOK {
  91. return coll.Posts, nil
  92. } else if status == http.StatusNotFound {
  93. return nil, fmt.Errorf("Collection not found.")
  94. } else {
  95. return nil, fmt.Errorf("Problem getting collection: %d. %v\n", status, err)
  96. }
  97. }