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.

137 lines
4.0 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. URL string `json:"url,omitempty"`
  19. TotalPosts int `json:"total_posts"`
  20. Posts *[]Post `json:"posts,omitempty"`
  21. }
  22. // CollectionParams holds values for creating a collection.
  23. CollectionParams struct {
  24. Alias string `json:"alias"`
  25. Title string `json:"title"`
  26. }
  27. )
  28. // CreateCollection creates a new collection, returning a user-friendly error
  29. // if one comes up. Requires a Write.as subscription. See
  30. // https://developer.write.as/docs/api/#create-a-collection
  31. func (c *Client) CreateCollection(sp *CollectionParams) (*Collection, error) {
  32. p := &Collection{}
  33. env, err := c.post("/collections", sp, p)
  34. if err != nil {
  35. return nil, err
  36. }
  37. var ok bool
  38. if p, ok = env.Data.(*Collection); !ok {
  39. return nil, fmt.Errorf("Wrong data returned from API.")
  40. }
  41. status := env.Code
  42. if status == http.StatusCreated {
  43. return p, nil
  44. } else if status == http.StatusBadRequest {
  45. return nil, fmt.Errorf("Bad request: %s", env.ErrorMessage)
  46. } else if status == http.StatusForbidden {
  47. return nil, fmt.Errorf("Casual or Pro user required.")
  48. } else if status == http.StatusConflict {
  49. return nil, fmt.Errorf("Collection name is already taken.")
  50. } else if status == http.StatusPreconditionFailed {
  51. return nil, fmt.Errorf("Reached max collection quota.")
  52. }
  53. return nil, fmt.Errorf("Problem getting post: %d. %v\n", status, err)
  54. }
  55. // GetCollection retrieves a collection, returning the Collection and any error
  56. // (in user-friendly form) that occurs. See
  57. // https://developer.write.as/docs/api/#retrieve-a-collection
  58. func (c *Client) GetCollection(alias string) (*Collection, error) {
  59. coll := &Collection{}
  60. env, err := c.get(fmt.Sprintf("/collections/%s", alias), coll)
  61. if err != nil {
  62. return nil, err
  63. }
  64. var ok bool
  65. if coll, ok = env.Data.(*Collection); !ok {
  66. return nil, fmt.Errorf("Wrong data returned from API.")
  67. }
  68. status := env.Code
  69. if status == http.StatusOK {
  70. return coll, nil
  71. } else if status == http.StatusNotFound {
  72. return nil, fmt.Errorf("Collection not found.")
  73. } else {
  74. return nil, fmt.Errorf("Problem getting collection: %d. %v\n", status, err)
  75. }
  76. }
  77. // GetCollectionPosts retrieves a collection's posts, returning the Posts
  78. // and any error (in user-friendly form) that occurs. See
  79. // https://developer.write.as/docs/api/#retrieve-collection-posts
  80. func (c *Client) GetCollectionPosts(alias string) (*[]Post, error) {
  81. coll := &Collection{}
  82. env, err := c.get(fmt.Sprintf("/collections/%s/posts", alias), coll)
  83. if err != nil {
  84. return nil, err
  85. }
  86. var ok bool
  87. if coll, ok = env.Data.(*Collection); !ok {
  88. return nil, fmt.Errorf("Wrong data returned from API.")
  89. }
  90. status := env.Code
  91. if status == http.StatusOK {
  92. return coll.Posts, nil
  93. } else if status == http.StatusNotFound {
  94. return nil, fmt.Errorf("Collection not found.")
  95. } else {
  96. return nil, fmt.Errorf("Problem getting collection: %d. %v\n", status, err)
  97. }
  98. }
  99. // GetUserCollections retrieves the authenticated user's collections.
  100. // See https://developers.write.as/docs/api/#retrieve-user-39-s-collections
  101. func (c *Client) GetUserCollections() (*[]Collection, error) {
  102. colls := &[]Collection{}
  103. env, err := c.get("/me/collections", colls)
  104. if err != nil {
  105. return nil, err
  106. }
  107. var ok bool
  108. if colls, ok = env.Data.(*[]Collection); !ok {
  109. return nil, fmt.Errorf("Wrong data returned from API.")
  110. }
  111. status := env.Code
  112. if status != http.StatusOK {
  113. if c.isNotLoggedIn(status) {
  114. return nil, fmt.Errorf("Not authenticated.")
  115. }
  116. return nil, fmt.Errorf("Problem getting collections: %d. %v\n", status, err)
  117. }
  118. return colls, nil
  119. }