access_application.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package cloudflare
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/url"
  6. "strconv"
  7. "time"
  8. "github.com/pkg/errors"
  9. )
  10. // AccessApplication represents an Access application.
  11. type AccessApplication struct {
  12. ID string `json:"id,omitempty"`
  13. CreatedAt *time.Time `json:"created_at,omitempty"`
  14. UpdatedAt *time.Time `json:"updated_at,omitempty"`
  15. AUD string `json:"aud,omitempty"`
  16. Name string `json:"name"`
  17. Domain string `json:"domain"`
  18. SessionDuration string `json:"session_duration,omitempty"`
  19. }
  20. // AccessApplicationListResponse represents the response from the list
  21. // access applications endpoint.
  22. type AccessApplicationListResponse struct {
  23. Result []AccessApplication `json:"result"`
  24. Response
  25. ResultInfo `json:"result_info"`
  26. }
  27. // AccessApplicationDetailResponse is the API response, containing a single
  28. // access application.
  29. type AccessApplicationDetailResponse struct {
  30. Success bool `json:"success"`
  31. Errors []string `json:"errors"`
  32. Messages []string `json:"messages"`
  33. Result AccessApplication `json:"result"`
  34. }
  35. // AccessApplications returns all applications within a zone.
  36. //
  37. // API reference: https://api.cloudflare.com/#access-applications-list-access-applications
  38. func (api *API) AccessApplications(zoneID string, pageOpts PaginationOptions) ([]AccessApplication, ResultInfo, error) {
  39. v := url.Values{}
  40. if pageOpts.PerPage > 0 {
  41. v.Set("per_page", strconv.Itoa(pageOpts.PerPage))
  42. }
  43. if pageOpts.Page > 0 {
  44. v.Set("page", strconv.Itoa(pageOpts.Page))
  45. }
  46. uri := "/zones/" + zoneID + "/access/apps"
  47. if len(v) > 0 {
  48. uri = uri + "?" + v.Encode()
  49. }
  50. res, err := api.makeRequest("GET", uri, nil)
  51. if err != nil {
  52. return []AccessApplication{}, ResultInfo{}, errors.Wrap(err, errMakeRequestError)
  53. }
  54. var accessApplicationListResponse AccessApplicationListResponse
  55. err = json.Unmarshal(res, &accessApplicationListResponse)
  56. if err != nil {
  57. return []AccessApplication{}, ResultInfo{}, errors.Wrap(err, errUnmarshalError)
  58. }
  59. return accessApplicationListResponse.Result, accessApplicationListResponse.ResultInfo, nil
  60. }
  61. // AccessApplication returns a single application based on the
  62. // application ID.
  63. //
  64. // API reference: https://api.cloudflare.com/#access-applications-access-applications-details
  65. func (api *API) AccessApplication(zoneID, applicationID string) (AccessApplication, error) {
  66. uri := fmt.Sprintf(
  67. "/zones/%s/access/apps/%s",
  68. zoneID,
  69. applicationID,
  70. )
  71. res, err := api.makeRequest("GET", uri, nil)
  72. if err != nil {
  73. return AccessApplication{}, errors.Wrap(err, errMakeRequestError)
  74. }
  75. var accessApplicationDetailResponse AccessApplicationDetailResponse
  76. err = json.Unmarshal(res, &accessApplicationDetailResponse)
  77. if err != nil {
  78. return AccessApplication{}, errors.Wrap(err, errUnmarshalError)
  79. }
  80. return accessApplicationDetailResponse.Result, nil
  81. }
  82. // CreateAccessApplication creates a new access application.
  83. //
  84. // API reference: https://api.cloudflare.com/#access-applications-create-access-application
  85. func (api *API) CreateAccessApplication(zoneID string, accessApplication AccessApplication) (AccessApplication, error) {
  86. uri := "/zones/" + zoneID + "/access/apps"
  87. res, err := api.makeRequest("POST", uri, accessApplication)
  88. if err != nil {
  89. return AccessApplication{}, errors.Wrap(err, errMakeRequestError)
  90. }
  91. var accessApplicationDetailResponse AccessApplicationDetailResponse
  92. err = json.Unmarshal(res, &accessApplicationDetailResponse)
  93. if err != nil {
  94. return AccessApplication{}, errors.Wrap(err, errUnmarshalError)
  95. }
  96. return accessApplicationDetailResponse.Result, nil
  97. }
  98. // UpdateAccessApplication updates an existing access application.
  99. //
  100. // API reference: https://api.cloudflare.com/#access-applications-update-access-application
  101. func (api *API) UpdateAccessApplication(zoneID string, accessApplication AccessApplication) (AccessApplication, error) {
  102. if accessApplication.ID == "" {
  103. return AccessApplication{}, errors.Errorf("access application ID cannot be empty")
  104. }
  105. uri := fmt.Sprintf(
  106. "/zones/%s/access/apps/%s",
  107. zoneID,
  108. accessApplication.ID,
  109. )
  110. res, err := api.makeRequest("PUT", uri, accessApplication)
  111. if err != nil {
  112. return AccessApplication{}, errors.Wrap(err, errMakeRequestError)
  113. }
  114. var accessApplicationDetailResponse AccessApplicationDetailResponse
  115. err = json.Unmarshal(res, &accessApplicationDetailResponse)
  116. if err != nil {
  117. return AccessApplication{}, errors.Wrap(err, errUnmarshalError)
  118. }
  119. return accessApplicationDetailResponse.Result, nil
  120. }
  121. // DeleteAccessApplication deletes an access application.
  122. //
  123. // API reference: https://api.cloudflare.com/#access-applications-delete-access-application
  124. func (api *API) DeleteAccessApplication(zoneID, applicationID string) error {
  125. uri := fmt.Sprintf(
  126. "/zones/%s/access/apps/%s",
  127. zoneID,
  128. applicationID,
  129. )
  130. _, err := api.makeRequest("DELETE", uri, nil)
  131. if err != nil {
  132. return errors.Wrap(err, errMakeRequestError)
  133. }
  134. return nil
  135. }
  136. // RevokeAccessApplicationTokens revokes tokens associated with an
  137. // access application.
  138. //
  139. // API reference: https://api.cloudflare.com/#access-applications-revoke-access-tokens
  140. func (api *API) RevokeAccessApplicationTokens(zoneID, applicationID string) error {
  141. uri := fmt.Sprintf(
  142. "/zones/%s/access/apps/%s/revoke-tokens",
  143. zoneID,
  144. applicationID,
  145. )
  146. _, err := api.makeRequest("POST", uri, nil)
  147. if err != nil {
  148. return errors.Wrap(err, errMakeRequestError)
  149. }
  150. return nil
  151. }