Add dnsimple to vendor
parent
4e16bab92e
commit
2e8df65ff3
@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2016 Aetrion LLC
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
@ -0,0 +1,49 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AccountsService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Account represents a DNSimple account.
|
||||||
|
type Account struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
Email string `json:"email,omitempty"`
|
||||||
|
PlanIdentifier string `json:"plan_identifier,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func accountsPath() string {
|
||||||
|
return fmt.Sprintf("/accounts")
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountsResponse represents a response from an API method that returns a collection of Account struct.
|
||||||
|
type AccountsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Account `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListAccounts list the accounts for an user.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/accounts/#list
|
||||||
|
func (s *AccountsService) ListAccounts(options *ListOptions) (*AccountsResponse, error) {
|
||||||
|
path := versioned(accountsPath())
|
||||||
|
accountsResponse := &AccountsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, accountsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return accountsResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
accountsResponse.HttpResponse = resp
|
||||||
|
return accountsResponse, nil
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
httpHeaderDomainToken = "X-DNSimple-Domain-Token"
|
||||||
|
httpHeaderApiToken = "X-DNSimple-Token"
|
||||||
|
httpHeaderAuthorization = "Authorization"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Provides credentials that can be used for authenticating with DNSimple.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/#authentication
|
||||||
|
type Credentials interface {
|
||||||
|
// Returns the HTTP headers that should be set
|
||||||
|
// to authenticate the HTTP Request.
|
||||||
|
Headers() map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Domain token authentication
|
||||||
|
type domainTokenCredentials struct {
|
||||||
|
domainToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewDomainTokenCredentials construct Credentials using the DNSimple Domain Token method.
|
||||||
|
func NewDomainTokenCredentials(domainToken string) Credentials {
|
||||||
|
return &domainTokenCredentials{domainToken: domainToken}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *domainTokenCredentials) Headers() map[string]string {
|
||||||
|
return map[string]string{httpHeaderDomainToken: c.domainToken}
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTP basic authentication
|
||||||
|
type httpBasicCredentials struct {
|
||||||
|
email string
|
||||||
|
password string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewHTTPBasicCredentials construct Credentials using HTTP Basic Auth.
|
||||||
|
func NewHTTPBasicCredentials(email, password string) Credentials {
|
||||||
|
return &httpBasicCredentials{email, password}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpBasicCredentials) Headers() map[string]string {
|
||||||
|
return map[string]string{httpHeaderAuthorization: "Basic " + c.basicAuth(c.email, c.password)}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *httpBasicCredentials) basicAuth(username, password string) string {
|
||||||
|
auth := username + ":" + password
|
||||||
|
return base64.StdEncoding.EncodeToString([]byte(auth))
|
||||||
|
}
|
||||||
|
|
||||||
|
// OAuth token authentication
|
||||||
|
|
||||||
|
type oauthTokenCredentials struct {
|
||||||
|
oauthToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewOauthTokenCredentials construct Credentials using the OAuth access token.
|
||||||
|
func NewOauthTokenCredentials(oauthToken string) Credentials {
|
||||||
|
return &oauthTokenCredentials{oauthToken: oauthToken}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *oauthTokenCredentials) Headers() map[string]string {
|
||||||
|
return map[string]string{httpHeaderAuthorization: "Bearer " + c.oauthToken}
|
||||||
|
}
|
@ -0,0 +1,135 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
)
|
||||||
|
|
||||||
|
// CertificatesService handles communication with the certificate related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/certificates
|
||||||
|
type CertificatesService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Certificate represents a Certificate in DNSimple.
|
||||||
|
type Certificate struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
DomainID int `json:"domain_id,omitempty"`
|
||||||
|
CommonName string `json:"common_name,omitempty"`
|
||||||
|
Years int `json:"years,omitempty"`
|
||||||
|
State string `json:"state,omitempty"`
|
||||||
|
AuthorityIdentifier string `json:"authority_identifier,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
ExpiresOn string `json:"expires_on,omitempty"`
|
||||||
|
CertificateRequest string `json:"csr,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CertificateBundle represents a container for all the PEM-encoded X509 certificate entities,
|
||||||
|
// such as the private key, the server certificate and the intermediate chain.
|
||||||
|
type CertificateBundle struct {
|
||||||
|
// CertificateRequest string `json:"csr,omitempty"`
|
||||||
|
PrivateKey string `json:"private_key,omitempty"`
|
||||||
|
ServerCertificate string `json:"server,omitempty"`
|
||||||
|
RootCertificate string `json:"root,omitempty"`
|
||||||
|
IntermediateCertificates []string `json:"chain,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func certificatePath(accountID, domainIdentifier, certificateID string) string {
|
||||||
|
path := fmt.Sprintf("%v/certificates", domainPath(accountID, domainIdentifier))
|
||||||
|
|
||||||
|
if certificateID != "" {
|
||||||
|
path += fmt.Sprintf("/%v", certificateID)
|
||||||
|
}
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// CertificateResponse represents a response from an API method that returns a Certificate struct.
|
||||||
|
type CertificateResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Certificate `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CertificateBundleResponse represents a response from an API method that returns a CertificatBundle struct.
|
||||||
|
type CertificateBundleResponse struct {
|
||||||
|
Response
|
||||||
|
Data *CertificateBundle `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CertificatesResponse represents a response from an API method that returns a collection of Certificate struct.
|
||||||
|
type CertificatesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Certificate `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListCertificates list the certificates for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/certificates#list
|
||||||
|
func (s *CertificatesService) ListCertificates(accountID, domainIdentifier string, options *ListOptions) (*CertificatesResponse, error) {
|
||||||
|
path := versioned(certificatePath(accountID, domainIdentifier, ""))
|
||||||
|
certificatesResponse := &CertificatesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, certificatesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return certificatesResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
certificatesResponse.HttpResponse = resp
|
||||||
|
return certificatesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCertificate fetches the certificate.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/certificates#get
|
||||||
|
func (s *CertificatesService) GetCertificate(accountID, domainIdentifier string, certificateID int) (*CertificateResponse, error) {
|
||||||
|
path := versioned(certificatePath(accountID, domainIdentifier, strconv.Itoa(certificateID)))
|
||||||
|
certificateResponse := &CertificateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, certificateResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
certificateResponse.HttpResponse = resp
|
||||||
|
return certificateResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownloadCertificate download the issued server certificate,
|
||||||
|
// as well the root certificate and the intermediate chain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/certificates#download
|
||||||
|
func (s *CertificatesService) DownloadCertificate(accountID, domainIdentifier string, certificateID int) (*CertificateBundleResponse, error) {
|
||||||
|
path := versioned(certificatePath(accountID, domainIdentifier, strconv.Itoa(certificateID)) + "/download")
|
||||||
|
certificateBundleResponse := &CertificateBundleResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, certificateBundleResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
certificateBundleResponse.HttpResponse = resp
|
||||||
|
return certificateBundleResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCertificatePrivateKey fetches the certificate private key.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/certificates#get-private-key
|
||||||
|
func (s *CertificatesService) GetCertificatePrivateKey(accountID, domainIdentifier string, certificateID int) (*CertificateBundleResponse, error) {
|
||||||
|
path := versioned(certificatePath(accountID, domainIdentifier, strconv.Itoa(certificateID)) + "/private_key")
|
||||||
|
certificateBundleResponse := &CertificateBundleResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, certificateBundleResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
certificateBundleResponse.HttpResponse = resp
|
||||||
|
return certificateBundleResponse, nil
|
||||||
|
}
|
@ -0,0 +1,97 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Collaborator represents a Collaborator in DNSimple.
|
||||||
|
type Collaborator struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
DomainID int `json:"domain_id,omitempty"`
|
||||||
|
DomainName string `json:"domain_name,omitempty"`
|
||||||
|
UserID int `json:"user_id,omitempty"`
|
||||||
|
UserEmail string `json:"user_email,omitempty"`
|
||||||
|
Invitation bool `json:"invitation,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
AcceptedAt string `json:"accepted_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CollaboratorAttributes represents Collaborator attributes for AddCollaborator operation.
|
||||||
|
type CollaboratorAttributes struct {
|
||||||
|
Email string `json:"email,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func collaboratorPath(accountID, domainIdentifier, collaboratorID string) string {
|
||||||
|
path := fmt.Sprintf("%v/collaborators", domainPath(accountID, domainIdentifier))
|
||||||
|
|
||||||
|
if collaboratorID != "" {
|
||||||
|
path += fmt.Sprintf("/%v", collaboratorID)
|
||||||
|
}
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// CollaboratorResponse represents a response from an API method that returns a Collaborator struct.
|
||||||
|
type CollaboratorResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Collaborator `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CollaboratorsResponse represents a response from an API method that returns a collection of Collaborator struct.
|
||||||
|
type CollaboratorsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Collaborator `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListCollaborators list the collaborators for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/collaborators#list
|
||||||
|
func (s *DomainsService) ListCollaborators(accountID, domainIdentifier string, options *ListOptions) (*CollaboratorsResponse, error) {
|
||||||
|
path := versioned(collaboratorPath(accountID, domainIdentifier, ""))
|
||||||
|
collaboratorsResponse := &CollaboratorsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, collaboratorsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return collaboratorsResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
collaboratorsResponse.HttpResponse = resp
|
||||||
|
return collaboratorsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddCollaborator adds a new collaborator to the domain in the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/collaborators#add
|
||||||
|
func (s *DomainsService) AddCollaborator(accountID string, domainIdentifier string, attributes CollaboratorAttributes) (*CollaboratorResponse, error) {
|
||||||
|
path := versioned(collaboratorPath(accountID, domainIdentifier, ""))
|
||||||
|
collaboratorResponse := &CollaboratorResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, attributes, collaboratorResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
collaboratorResponse.HttpResponse = resp
|
||||||
|
return collaboratorResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RemoveCollaborator PERMANENTLY deletes a domain from the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/collaborators#add
|
||||||
|
func (s *DomainsService) RemoveCollaborator(accountID string, domainIdentifier string, collaboratorID string) (*CollaboratorResponse, error) {
|
||||||
|
path := versioned(collaboratorPath(accountID, domainIdentifier, collaboratorID))
|
||||||
|
collaboratorResponse := &CollaboratorResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
collaboratorResponse.HttpResponse = resp
|
||||||
|
return collaboratorResponse, nil
|
||||||
|
}
|
@ -0,0 +1,139 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ContactsService handles communication with the contact related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/
|
||||||
|
type ContactsService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Contact represents a Contact in DNSimple.
|
||||||
|
type Contact struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
AccountID int `json:"account_id,omitempty"`
|
||||||
|
Label string `json:"label,omitempty"`
|
||||||
|
FirstName string `json:"first_name,omitempty"`
|
||||||
|
LastName string `json:"last_name,omitempty"`
|
||||||
|
JobTitle string `json:"job_title,omitempty"`
|
||||||
|
Organization string `json:"organization_name,omitempty"`
|
||||||
|
Address1 string `json:"address1,omitempty"`
|
||||||
|
Address2 string `json:"address2,omitempty"`
|
||||||
|
City string `json:"city,omitempty"`
|
||||||
|
StateProvince string `json:"state_province,omitempty"`
|
||||||
|
PostalCode string `json:"postal_code,omitempty"`
|
||||||
|
Country string `json:"country,omitempty"`
|
||||||
|
Phone string `json:"phone,omitempty"`
|
||||||
|
Fax string `json:"fax,omitempty"`
|
||||||
|
Email string `json:"email,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func contactPath(accountID string, contact interface{}) string {
|
||||||
|
if contact != nil {
|
||||||
|
return fmt.Sprintf("/%v/contacts/%v", accountID, contact)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("/%v/contacts", accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContactResponse represents a response from an API method that returns a Contact struct.
|
||||||
|
type ContactResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Contact `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ContactsResponse represents a response from an API method that returns a collection of Contact struct.
|
||||||
|
type ContactsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Contact `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListContacts list the contacts for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/#list
|
||||||
|
func (s *ContactsService) ListContacts(accountID string, options *ListOptions) (*ContactsResponse, error) {
|
||||||
|
path := versioned(contactPath(accountID, nil))
|
||||||
|
contactsResponse := &ContactsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, contactsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return contactsResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
contactsResponse.HttpResponse = resp
|
||||||
|
return contactsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateContact creates a new contact.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/#create
|
||||||
|
func (s *ContactsService) CreateContact(accountID string, contactAttributes Contact) (*ContactResponse, error) {
|
||||||
|
path := versioned(contactPath(accountID, nil))
|
||||||
|
contactResponse := &ContactResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, contactAttributes, contactResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
contactResponse.HttpResponse = resp
|
||||||
|
return contactResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetContact fetches a contact.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/#get
|
||||||
|
func (s *ContactsService) GetContact(accountID string, contactID int) (*ContactResponse, error) {
|
||||||
|
path := versioned(contactPath(accountID, contactID))
|
||||||
|
contactResponse := &ContactResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, contactResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
contactResponse.HttpResponse = resp
|
||||||
|
return contactResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateContact updates a contact.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/#update
|
||||||
|
func (s *ContactsService) UpdateContact(accountID string, contactID int, contactAttributes Contact) (*ContactResponse, error) {
|
||||||
|
path := versioned(contactPath(accountID, contactID))
|
||||||
|
contactResponse := &ContactResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.patch(path, contactAttributes, contactResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
contactResponse.HttpResponse = resp
|
||||||
|
return contactResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteContact PERMANENTLY deletes a contact from the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/contacts/#delete
|
||||||
|
func (s *ContactsService) DeleteContact(accountID string, contactID int) (*ContactResponse, error) {
|
||||||
|
path := versioned(contactPath(accountID, contactID))
|
||||||
|
contactResponse := &ContactResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
contactResponse.HttpResponse = resp
|
||||||
|
return contactResponse, nil
|
||||||
|
}
|
@ -0,0 +1,341 @@
|
|||||||
|
// Package dnsimple provides a client for the DNSimple API.
|
||||||
|
// In order to use this package you will need a DNSimple account.
|
||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/google/go-querystring/query"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// libraryVersion identifies the current library version.
|
||||||
|
// This is a pro-forma convention given that Go dependencies
|
||||||
|
// tends to be fetched directly from the repo.
|
||||||
|
// It is also used in the user-agent identify the client.
|
||||||
|
libraryVersion = "0.13.0"
|
||||||
|
|
||||||
|
// defaultBaseURL to the DNSimple production API.
|
||||||
|
defaultBaseURL = "https://api.dnsimple.com"
|
||||||
|
|
||||||
|
// userAgent represents the default user agent used
|
||||||
|
// when no other user agent is set.
|
||||||
|
defaultUserAgent = "dnsimple-go/" + libraryVersion
|
||||||
|
|
||||||
|
apiVersion = "v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Client represents a client to the DNSimple API.
|
||||||
|
type Client struct {
|
||||||
|
// HttpClient is the underlying HTTP client
|
||||||
|
// used to communicate with the API.
|
||||||
|
HttpClient *http.Client
|
||||||
|
|
||||||
|
// Credentials used for accessing the DNSimple API
|
||||||
|
Credentials Credentials
|
||||||
|
|
||||||
|
// BaseURL for API requests.
|
||||||
|
// Defaults to the public DNSimple API, but can be set to a different endpoint (e.g. the sandbox).
|
||||||
|
BaseURL string
|
||||||
|
|
||||||
|
// UserAgent used when communicating with the DNSimple API.
|
||||||
|
UserAgent string
|
||||||
|
|
||||||
|
// Services used for talking to different parts of the DNSimple API.
|
||||||
|
Identity *IdentityService
|
||||||
|
Accounts *AccountsService
|
||||||
|
Certificates *CertificatesService
|
||||||
|
Contacts *ContactsService
|
||||||
|
Domains *DomainsService
|
||||||
|
Oauth *OauthService
|
||||||
|
Registrar *RegistrarService
|
||||||
|
Services *ServicesService
|
||||||
|
Templates *TemplatesService
|
||||||
|
Tlds *TldsService
|
||||||
|
VanityNameServers *VanityNameServersService
|
||||||
|
Webhooks *WebhooksService
|
||||||
|
Zones *ZonesService
|
||||||
|
|
||||||
|
// Set to true to output debugging logs during API calls
|
||||||
|
Debug bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListOptions contains the common options you can pass to a List method
|
||||||
|
// in order to control parameters such as paginations and page number.
|
||||||
|
type ListOptions struct {
|
||||||
|
// The page to return
|
||||||
|
Page int `url:"page,omitempty"`
|
||||||
|
|
||||||
|
// The number of entries to return per page
|
||||||
|
PerPage int `url:"per_page,omitempty"`
|
||||||
|
|
||||||
|
// The order criteria to sort the results.
|
||||||
|
// The value is a comma-separated list of field[:direction],
|
||||||
|
// eg. name | name:desc | name:desc,expiration:desc
|
||||||
|
Sort string `url:"sort,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClient returns a new DNSimple API client using the given credentials.
|
||||||
|
func NewClient(credentials Credentials) *Client {
|
||||||
|
c := &Client{Credentials: credentials, HttpClient: &http.Client{}, BaseURL: defaultBaseURL}
|
||||||
|
c.Identity = &IdentityService{client: c}
|
||||||
|
c.Accounts = &AccountsService{client: c}
|
||||||
|
c.Certificates = &CertificatesService{client: c}
|
||||||
|
c.Contacts = &ContactsService{client: c}
|
||||||
|
c.Domains = &DomainsService{client: c}
|
||||||
|
c.Oauth = &OauthService{client: c}
|
||||||
|
c.Registrar = &RegistrarService{client: c}
|
||||||
|
c.Services = &ServicesService{client: c}
|
||||||
|
c.Templates = &TemplatesService{client: c}
|
||||||
|
c.Tlds = &TldsService{client: c}
|
||||||
|
c.VanityNameServers = &VanityNameServersService{client: c}
|
||||||
|
c.Webhooks = &WebhooksService{client: c}
|
||||||
|
c.Zones = &ZonesService{client: c}
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRequest creates an API request.
|
||||||
|
// The path is expected to be a relative path and will be resolved
|
||||||
|
// according to the BaseURL of the Client. Paths should always be specified without a preceding slash.
|
||||||
|
func (c *Client) NewRequest(method, path string, payload interface{}) (*http.Request, error) {
|
||||||
|
url := c.BaseURL + path
|
||||||
|
|
||||||
|
body := new(bytes.Buffer)
|
||||||
|
if payload != nil {
|
||||||
|
err := json.NewEncoder(body).Encode(payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := http.NewRequest(method, url, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("Content-Type", "application/json")
|
||||||
|
req.Header.Add("Accept", "application/json")
|
||||||
|
req.Header.Add("User-Agent", formatUserAgent(c.UserAgent))
|
||||||
|
for key, value := range c.Credentials.Headers() {
|
||||||
|
req.Header.Add(key, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// formatUserAgent builds the final user agent to use for HTTP requests.
|
||||||
|
//
|
||||||
|
// If no custom user agent is provided, the default user agent is used.
|
||||||
|
//
|
||||||
|
// dnsimple-go/1.0
|
||||||
|
//
|
||||||
|
// If a custom user agent is provided, the final user agent is the combination of the custom user agent
|
||||||
|
// prepended by the default user agent.
|
||||||
|
//
|
||||||
|
// dnsimple-go/1.0 customAgentFlag
|
||||||
|
//
|
||||||
|
func formatUserAgent(customUserAgent string) string {
|
||||||
|
if customUserAgent == "" {
|
||||||
|
return defaultUserAgent
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("%s %s", defaultUserAgent, customUserAgent)
|
||||||
|
}
|
||||||
|
|
||||||
|
func versioned(path string) string {
|
||||||
|
return fmt.Sprintf("/%s/%s", apiVersion, strings.Trim(path, "/"))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) get(path string, obj interface{}) (*http.Response, error) {
|
||||||
|
req, err := c.NewRequest("GET", path, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Do(req, obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) post(path string, payload, obj interface{}) (*http.Response, error) {
|
||||||
|
req, err := c.NewRequest("POST", path, payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Do(req, obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) put(path string, payload, obj interface{}) (*http.Response, error) {
|
||||||
|
req, err := c.NewRequest("PUT", path, payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Do(req, obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) patch(path string, payload, obj interface{}) (*http.Response, error) {
|
||||||
|
req, err := c.NewRequest("PATCH", path, payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Do(req, obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Client) delete(path string, payload interface{}, obj interface{}) (*http.Response, error) {
|
||||||
|
req, err := c.NewRequest("DELETE", path, payload)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Do(req, obj)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do sends an API request and returns the API response.
|
||||||
|
//
|
||||||
|
// The API response is JSON decoded and stored in the value pointed by obj,
|
||||||
|
// or returned as an error if an API error has occurred.
|
||||||
|
// If obj implements the io.Writer interface, the raw response body will be written to obj,
|
||||||
|
// without attempting to decode it.
|
||||||
|
func (c *Client) Do(req *http.Request, obj interface{}) (*http.Response, error) {
|
||||||
|
if c.Debug {
|
||||||
|
log.Printf("Executing request (%v): %#v", req.URL, req)
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := c.HttpClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if c.Debug {
|
||||||
|
log.Printf("Response received: %#v", resp)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = CheckResponse(resp)
|
||||||
|
if err != nil {
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If obj implements the io.Writer,
|
||||||
|
// the response body is decoded into v.
|
||||||
|
if obj != nil {
|
||||||
|
if w, ok := obj.(io.Writer); ok {
|
||||||
|
io.Copy(w, resp.Body)
|
||||||
|
} else {
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(obj)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Response represents an API response.
|
||||||
|
type Response struct {
|
||||||
|
// HTTP response
|
||||||
|
HttpResponse *http.Response
|
||||||
|
|
||||||
|
// If the response is paginated, the Pagination will store them.
|
||||||
|
Pagination *Pagination `json:"pagination"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RateLimit returns the maximum amount of requests this account can send in an hour.
|
||||||
|
func (r *Response) RateLimit() int {
|
||||||
|
value, _ := strconv.Atoi(r.HttpResponse.Header.Get("X-RateLimit-Limit"))
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// RateLimitRemaining returns the remaining amount of requests this account can send within this hour window.
|
||||||
|
func (r *Response) RateLimitRemaining() int {
|
||||||
|
value, _ := strconv.Atoi(r.HttpResponse.Header.Get("X-RateLimit-Remaining"))
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// RateLimitReset returns when the throttling window will be reset for this account.
|
||||||
|
func (r *Response) RateLimitReset() time.Time {
|
||||||
|
value, _ := strconv.ParseInt(r.HttpResponse.Header.Get("X-RateLimit-Reset"), 10, 64)
|
||||||
|
return time.Unix(value, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the response is paginated, Pagination represents the pagination information.
|
||||||
|
type Pagination struct {
|
||||||
|
CurrentPage int `json:"current_page"`
|
||||||
|
PerPage int `json:"per_page"`
|
||||||
|
TotalPages int `json:"total_pages"`
|
||||||
|
TotalEntries int `json:"total_entries"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// An ErrorResponse represents an API response that generated an error.
|
||||||
|
type ErrorResponse struct {
|
||||||
|
Response
|
||||||
|
|
||||||
|
// human-readable message
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements the error interface.
|
||||||
|
func (r *ErrorResponse) Error() string {
|
||||||
|
return fmt.Sprintf("%v %v: %v %v",
|
||||||
|
r.HttpResponse.Request.Method, r.HttpResponse.Request.URL,
|
||||||
|
r.HttpResponse.StatusCode, r.Message)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckResponse checks the API response for errors, and returns them if present.
|
||||||
|
// A response is considered an error if the status code is different than 2xx. Specific requests
|
||||||
|
// may have additional requirements, but this is sufficient in most of the cases.
|
||||||
|
func CheckResponse(resp *http.Response) error {
|
||||||
|
if code := resp.StatusCode; 200 <= code && code <= 299 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
errorResponse := &ErrorResponse{}
|
||||||
|
errorResponse.HttpResponse = resp
|
||||||
|
|
||||||
|
err := json.NewDecoder(resp.Body).Decode(errorResponse)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return errorResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
// addOptions adds the parameters in opt as URL query parameters to s. opt
|
||||||
|
// must be a struct whose fields may contain "url" tags.
|
||||||
|
func addURLQueryOptions(path string, options interface{}) (string, error) {
|
||||||
|
opt := reflect.ValueOf(options)
|
||||||
|
|
||||||
|
// options is a pointer
|
||||||
|
// return if the value of the pointer is nil,
|
||||||
|
if opt.Kind() == reflect.Ptr && opt.IsNil() {
|
||||||
|
return path, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// append the options to the URL
|
||||||
|
u, err := url.Parse(path)
|
||||||
|
if err != nil {
|
||||||
|
return path, err
|
||||||
|
}
|
||||||
|
|
||||||
|
qs, err := query.Values(options)
|
||||||
|
if err != nil {
|
||||||
|
return path, err
|
||||||
|
}
|
||||||
|
|
||||||
|
uqs := u.Query()
|
||||||
|
for k, _ := range qs {
|
||||||
|
uqs.Set(k, qs.Get(k))
|
||||||
|
}
|
||||||
|
u.RawQuery = uqs.Encode()
|
||||||
|
|
||||||
|
return u.String(), nil
|
||||||
|
}
|
@ -0,0 +1,161 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DomainsService handles communication with the domain related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/
|
||||||
|
type DomainsService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Domain represents a domain in DNSimple.
|
||||||
|
type Domain struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
AccountID int `json:"account_id,omitempty"`
|
||||||
|
RegistrantID int `json:"registrant_id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
UnicodeName string `json:"unicode_name,omitempty"`
|
||||||
|
Token string `json:"token,omitempty"`
|
||||||
|
State string `json:"state,omitempty"`
|
||||||
|
AutoRenew bool `json:"auto_renew,omitempty"`
|
||||||
|
PrivateWhois bool `json:"private_whois,omitempty"`
|
||||||
|
ExpiresOn string `json:"expires_on,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainListOptions specifies the optional parameters you can provide
|
||||||
|
// to customize the DomainsService.ListDomains method.
|
||||||
|
type DomainListOptions struct {
|
||||||
|
// Select domains where the name contains given string.
|
||||||
|
NameLike string `url:"name_like,omitempty"`
|
||||||
|
|
||||||
|
// Select domains where the registrant matches given ID.
|
||||||
|
RegistrantID int `url:"registrant_id,omitempty"`
|
||||||
|
|
||||||
|
ListOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainResponse represents a response from an API method that returns a Domain struct.
|
||||||
|
type DomainResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainsResponse represents a response from an API method that returns a collection of Domain struct.
|
||||||
|
type DomainsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// domainRequest represents a generic wrapper for a domain request,
|
||||||
|
// when domainWrapper cannot be used because of type constraint on Domain.
|
||||||
|
type domainRequest struct {
|
||||||
|
Domain interface{} `json:"domain"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func domainIdentifier(value interface{}) string {
|
||||||
|
switch value := value.(type) {
|
||||||
|
case string:
|
||||||
|
return value
|
||||||
|
case int:
|
||||||
|
return fmt.Sprintf("%d", value)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func domainPath(accountID string, domain interface{}) string {
|
||||||
|
if domain != nil {
|
||||||
|
return fmt.Sprintf("/%v/domains/%v", accountID, domainIdentifier(domain))
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("/%v/domains", accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListDomains lists the domains for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/#list
|
||||||
|
func (s *DomainsService) ListDomains(accountID string, options *DomainListOptions) (*DomainsResponse, error) {
|
||||||
|
path := versioned(domainPath(accountID, nil))
|
||||||
|
domainsResponse := &DomainsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, domainsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainsResponse.HttpResponse = resp
|
||||||
|
return domainsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateDomain creates a new domain in the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/#create
|
||||||
|
func (s *DomainsService) CreateDomain(accountID string, domainAttributes Domain) (*DomainResponse, error) {
|
||||||
|
path := versioned(domainPath(accountID, nil))
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, domainAttributes, domainResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDomain fetches a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/#get
|
||||||
|
func (s *DomainsService) GetDomain(accountID string, domain interface{}) (*DomainResponse, error) {
|
||||||
|
path := versioned(domainPath(accountID, domain))
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, domainResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteDomain PERMANENTLY deletes a domain from the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/#delete
|
||||||
|
func (s *DomainsService) DeleteDomain(accountID string, domain interface{}) (*DomainResponse, error) {
|
||||||
|
path := versioned(domainPath(accountID, domain))
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResetDomainToken resets the domain token.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/#reset-token
|
||||||
|
func (s *DomainsService) ResetDomainToken(accountID string, domain interface{}) (*DomainResponse, error) {
|
||||||
|
path := versioned(domainPath(accountID, domain) + "/token")
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, nil, domainResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EmailForward represents an email forward in DNSimple.
|
||||||
|
type EmailForward struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
DomainID int `json:"domain_id,omitempty"`
|
||||||
|
From string `json:"from,omitempty"`
|
||||||
|
To string `json:"to,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// EmailForwardResponse represents a response from an API method that returns an EmailForward struct.
|
||||||
|
type EmailForwardResponse struct {
|
||||||
|
Response
|
||||||
|
Data *EmailForward `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// EmailForwardsResponse represents a response from an API method that returns a collection of EmailForward struct.
|
||||||
|
type EmailForwardsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []EmailForward `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func emailForwardPath(accountID string, domain interface{}, forwardID int) string {
|
||||||
|
path := fmt.Sprintf("%v/email_forwards", domainPath(accountID, domain))
|
||||||
|
|
||||||
|
if forwardID != 0 {
|
||||||
|
path += fmt.Sprintf("/%d", forwardID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListEmailForwards lists the email forwards for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/email-forwards/#list
|
||||||
|
func (s *DomainsService) ListEmailForwards(accountID string, domain interface{}, options *ListOptions) (*EmailForwardsResponse, error) {
|
||||||
|
path := versioned(emailForwardPath(accountID, domain, 0))
|
||||||
|
forwardsResponse := &EmailForwardsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, forwardsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
forwardsResponse.HttpResponse = resp
|
||||||
|
return forwardsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateEmailForward creates a new email forward.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/email-forwards/#create
|
||||||
|
func (s *DomainsService) CreateEmailForward(accountID string, domain interface{}, forwardAttributes EmailForward) (*EmailForwardResponse, error) {
|
||||||
|
path := versioned(emailForwardPath(accountID, domain, 0))
|
||||||
|
forwardResponse := &EmailForwardResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, forwardAttributes, forwardResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
forwardResponse.HttpResponse = resp
|
||||||
|
return forwardResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetEmailForward fetches an email forward.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/email-forwards/#get
|
||||||
|
func (s *DomainsService) GetEmailForward(accountID string, domain interface{}, forwardID int) (*EmailForwardResponse, error) {
|
||||||
|
path := versioned(emailForwardPath(accountID, domain, forwardID))
|
||||||
|
forwardResponse := &EmailForwardResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, forwardResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
forwardResponse.HttpResponse = resp
|
||||||
|
return forwardResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteEmailForward PERMANENTLY deletes an email forward from the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/email-forwards/#delete
|
||||||
|
func (s *DomainsService) DeleteEmailForward(accountID string, domain interface{}, forwardID int) (*EmailForwardResponse, error) {
|
||||||
|
path := versioned(emailForwardPath(accountID, domain, forwardID))
|
||||||
|
forwardResponse := &EmailForwardResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
forwardResponse.HttpResponse = resp
|
||||||
|
return forwardResponse, nil
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DomainPush represents a domain push in DNSimple.
|
||||||
|
type DomainPush struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
DomainID int `json:"domain_id,omitempty"`
|
||||||
|
ContactID int `json:"contact_id,omitempty"`
|
||||||
|
AccountID int `json:"account_id,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
AcceptedAt string `json:"accepted_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainPushAttributes represent a domain push payload (see initiate).
|
||||||
|
type DomainPushAttributes struct {
|
||||||
|
NewAccountEmail string `json:"new_account_email,omitempty"`
|
||||||
|
ContactID string `json:"contact_id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainPushResponse represents a response from an API method that returns a DomainPush struct.
|
||||||
|
type DomainPushResponse struct {
|
||||||
|
Response
|
||||||
|
Data *DomainPush `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainPushesResponse represents a response from an API method that returns a collection of DomainPush struct.
|
||||||
|
type DomainPushesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []DomainPush `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func initiateDomainPushPath(accountID string, domainID string) string {
|
||||||
|
return fmt.Sprintf("%v/pushes", domainPath(accountID, domainID))
|
||||||
|
}
|
||||||
|
|
||||||
|
func domainPushPath(accountID string, pushID int) string {
|
||||||
|
path := fmt.Sprintf("%v/pushes", accountID)
|
||||||
|
|
||||||
|
if pushID != 0 {
|
||||||
|
path += fmt.Sprintf("/%d", pushID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitiatePush initiate a new domain push.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/pushes/#initiate
|
||||||
|
func (s *DomainsService) InitiatePush(accountID string, domainID string, pushAttributes DomainPushAttributes) (*DomainPushResponse, error) {
|
||||||
|
path := versioned(initiateDomainPushPath(accountID, domainID))
|
||||||
|
pushResponse := &DomainPushResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, pushAttributes, pushResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pushResponse.HttpResponse = resp
|
||||||
|
return pushResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListPushes lists the pushes for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/pushes/#list
|
||||||
|
func (s *DomainsService) ListPushes(accountID string, options *ListOptions) (*DomainPushesResponse, error) {
|
||||||
|
path := versioned(domainPushPath(accountID, 0))
|
||||||
|
pushesResponse := &DomainPushesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, pushesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pushesResponse.HttpResponse = resp
|
||||||
|
return pushesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AcceptPush accept a push for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/pushes/#accept
|
||||||
|
func (s *DomainsService) AcceptPush(accountID string, pushID int, pushAttributes DomainPushAttributes) (*DomainPushResponse, error) {
|
||||||
|
path := versioned(domainPushPath(accountID, pushID))
|
||||||
|
pushResponse := &DomainPushResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, pushAttributes, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pushResponse.HttpResponse = resp
|
||||||
|
return pushResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RejectPush reject a push for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/domains/pushes/#reject
|
||||||
|
func (s *DomainsService) RejectPush(accountID string, pushID int) (*DomainPushResponse, error) {
|
||||||
|
path := versioned(domainPushPath(accountID, pushID))
|
||||||
|
pushResponse := &DomainPushResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pushResponse.HttpResponse = resp
|
||||||
|
return pushResponse, nil
|
||||||
|
}
|
@ -0,0 +1,48 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
// IdentityService handles communication with several authentication identity
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/identity/
|
||||||
|
type IdentityService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhoamiData represents an authenticated context
|
||||||
|
// that contains information about the current logged User and/or Account.
|
||||||
|
type WhoamiData struct {
|
||||||
|
User *User `json:"user,omitempty"`
|
||||||
|
Account *Account `json:"account,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhoamiResponse represents a response from an API method that returns a Whoami struct.
|
||||||
|
type WhoamiResponse struct {
|
||||||
|
Response
|
||||||
|
Data *WhoamiData `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Whoami gets the current authenticate context.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/whoami
|
||||||
|
func (s *IdentityService) Whoami() (*WhoamiResponse, error) {
|
||||||
|
path := versioned("/whoami")
|
||||||
|
whoamiResponse := &WhoamiResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, whoamiResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
whoamiResponse.HttpResponse = resp
|
||||||
|
return whoamiResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Whoami is a state-less shortcut to client.Whoami()
|
||||||
|
// that returns only the relevant Data.
|
||||||
|
func Whoami(c *Client) (data *WhoamiData, err error) {
|
||||||
|
resp, err := c.Identity.Whoami()
|
||||||
|
if resp != nil {
|
||||||
|
data = resp.Data
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GrantType is a string that identifies a particular grant type in the exchange request.
|
||||||
|
type GrantType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// AuthorizationCodeGrant is the type of access token request
|
||||||
|
// for an Authorization Code Grant flow.
|
||||||
|
// https://tools.ietf.org/html/rfc6749#section-4.1
|
||||||
|
AuthorizationCodeGrant = GrantType("authorization_code")
|
||||||
|
)
|
||||||
|
|
||||||
|
// OauthService handles communication with the authorization related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/oauth/
|
||||||
|
type OauthService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccessToken represents a DNSimple Oauth access token.
|
||||||
|
type AccessToken struct {
|
||||||
|
Token string `json:"access_token"`
|
||||||
|
Type string `json:"token_type"`
|
||||||
|
AccountID int `json:"account_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExchangeAuthorizationRequest represents a request to exchange
|
||||||
|
// an authorization code for an access token.
|
||||||
|
// RedirectURI is optional, all the other fields are mandatory.
|
||||||
|
type ExchangeAuthorizationRequest struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
ClientID string `json:"client_id"`
|
||||||
|
ClientSecret string `json:"client_secret"`
|
||||||
|
RedirectURI string `json:"redirect_uri,omitempty"`
|
||||||
|
State string `json:"state,omitempty"`
|
||||||
|
GrantType GrantType `json:"grant_type,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExchangeAuthorizationError represents a failed request to exchange
|
||||||
|
// an authorization code for an access token.
|
||||||
|
type ExchangeAuthorizationError struct {
|
||||||
|
// HTTP response
|
||||||
|
HttpResponse *http.Response
|
||||||
|
|
||||||
|
ErrorCode string `json:"error"`
|
||||||
|
ErrorDescription string `json:"error_description"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error implements the error interface.
|
||||||
|
func (r *ExchangeAuthorizationError) Error() string {
|
||||||
|
return fmt.Sprintf("%v %v: %v %v",
|
||||||
|
r.HttpResponse.Request.Method, r.HttpResponse.Request.URL,
|
||||||
|
r.ErrorCode, r.ErrorDescription)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ExchangeAuthorizationForToken exchanges the short-lived authorization code for an access token
|
||||||
|
// you can use to authenticate your API calls.
|
||||||
|
func (s *OauthService) ExchangeAuthorizationForToken(authorization *ExchangeAuthorizationRequest) (*AccessToken, error) {
|
||||||
|
path := versioned("/oauth/access_token")
|
||||||
|
|
||||||
|
req, err := s.client.NewRequest("POST", path, authorization)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.HttpClient.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
if resp.StatusCode != 200 {
|
||||||
|
errorResponse := &ExchangeAuthorizationError{}
|
||||||
|
errorResponse.HttpResponse = resp
|
||||||
|
json.NewDecoder(resp.Body).Decode(errorResponse)
|
||||||
|
return nil, errorResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
accessToken := &AccessToken{}
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(accessToken)
|
||||||
|
|
||||||
|
return accessToken, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// AuthorizationOptions represents the option you can use to generate an authorization URL.
|
||||||
|
type AuthorizationOptions struct {
|
||||||
|
RedirectURI string `url:"redirect_uri,omitempty"`
|
||||||
|
// A randomly generated string to verify the validity of the request.
|
||||||
|
// Currently "state" is required by the DNSimple OAuth implementation, so you must specify it.
|
||||||
|
State string `url:"state,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AuthorizeURL generates the URL to authorize an user for an application via the OAuth2 flow.
|
||||||
|
func (s *OauthService) AuthorizeURL(clientID string, options *AuthorizationOptions) string {
|
||||||
|
uri, _ := url.Parse(strings.Replace(s.client.BaseURL, "api.", "", 1))
|
||||||
|
uri.Path = "/oauth/authorize"
|
||||||
|
query := uri.Query()
|
||||||
|
query.Add("client_id", clientID)
|
||||||
|
query.Add("response_type", "code")
|
||||||
|
uri.RawQuery = query.Encode()
|
||||||
|
|
||||||
|
path, _ := addURLQueryOptions(uri.String(), options)
|
||||||
|
return path
|
||||||
|
}
|
@ -0,0 +1,170 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RegistrarService handles communication with the registrar related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/
|
||||||
|
type RegistrarService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainCheck represents the result of a domain check.
|
||||||
|
type DomainCheck struct {
|
||||||
|
Domain string `json:"domain"`
|
||||||
|
Available bool `json:"available"`
|
||||||
|
Premium bool `json:"premium"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainCheckResponse represents a response from the domain check.
|
||||||
|
type DomainCheckResponse struct {
|
||||||
|
Response
|
||||||
|
Data *DomainCheck `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CheckDomain checks a domain name.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/#check
|
||||||
|
func (s *RegistrarService) CheckDomain(accountID string, domainName string) (*DomainCheckResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/check", accountID, domainName))
|
||||||
|
checkResponse := &DomainCheckResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, checkResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
checkResponse.HttpResponse = resp
|
||||||
|
return checkResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainRegisterRequest represents the attributes you can pass to a register API request.
|
||||||
|
// Some attributes are mandatory.
|
||||||
|
type DomainRegisterRequest struct {
|
||||||
|
// The ID of the Contact to use as registrant for the domain
|
||||||
|
RegistrantID int `json:"registrant_id"`
|
||||||
|
// Set to true to enable the whois privacy service. An extra cost may apply.
|
||||||
|
// Default to false.
|
||||||
|
EnableWhoisPrivacy bool `json:"private_whois,omitempty"`
|
||||||
|
// Set to true to enable the auto-renewal of the domain.
|
||||||
|
// Default to true.
|
||||||
|
EnableAutoRenewal bool `json:"auto_renew,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainRegistrationResponse represents a response from an API method that results in a domain registration.
|
||||||
|
type DomainRegistrationResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegisterDomain registers a domain name.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/#register
|
||||||
|
func (s *RegistrarService) RegisterDomain(accountID string, domainName string, request *DomainRegisterRequest) (*DomainRegistrationResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/registration", accountID, domainName))
|
||||||
|
registrationResponse := &DomainRegistrationResponse{}
|
||||||
|
|
||||||
|
// TODO: validate mandatory attributes RegistrantID
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, request, registrationResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
registrationResponse.HttpResponse = resp
|
||||||
|
return registrationResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainTransferRequest represents the attributes you can pass to a transfer API request.
|
||||||
|
// Some attributes are mandatory.
|
||||||
|
type DomainTransferRequest struct {
|
||||||
|
// The ID of the Contact to use as registrant for the domain
|
||||||
|
RegistrantID int `json:"registrant_id"`
|
||||||
|
// The Auth-Code required to transfer the domain.
|
||||||
|
// This is provided by the current registrar of the domain.
|
||||||
|
AuthCode string `json:"auth_code,omitempty"`
|
||||||
|
// Set to true to enable the whois privacy service. An extra cost may apply.
|
||||||
|
// Default to false.
|
||||||
|
EnableWhoisPrivacy bool `json:"private_whois,omitempty"`
|
||||||
|
// Set to true to enable the auto-renewal of the domain.
|
||||||
|
// Default to true.
|
||||||
|
EnableAutoRenewal bool `json:"auto_renew,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainTransferResponse represents a response from an API method that results in a domain transfer.
|
||||||
|
type DomainTransferResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransferDomain transfers a domain name.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/#transfer
|
||||||
|
func (s *RegistrarService) TransferDomain(accountID string, domainName string, request *DomainTransferRequest) (*DomainTransferResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/transfer", accountID, domainName))
|
||||||
|
transferResponse := &DomainTransferResponse{}
|
||||||
|
|
||||||
|
// TODO: validate mandatory attributes RegistrantID
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, request, transferResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
transferResponse.HttpResponse = resp
|
||||||
|
return transferResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainTransferOutResponse represents a response from an API method that results in a domain transfer out.
|
||||||
|
type DomainTransferOutResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Transfer out a domain name.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/#transfer-out
|
||||||
|
func (s *RegistrarService) TransferDomainOut(accountID string, domainName string) (*DomainTransferOutResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/transfer_out", accountID, domainName))
|
||||||
|
transferResponse := &DomainTransferOutResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
transferResponse.HttpResponse = resp
|
||||||
|
return transferResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainRenewRequest represents the attributes you can pass to a renew API request.
|
||||||
|
// Some attributes are mandatory.
|
||||||
|
type DomainRenewRequest struct {
|
||||||
|
// The number of years
|
||||||
|
Period int `json:"period"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainRenewalResponse represents a response from an API method that results in a domain renewal.
|
||||||
|
type DomainRenewalResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Domain `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RenewDomain renews a domain name.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/#register
|
||||||
|
func (s *RegistrarService) RenewDomain(accountID string, domainName string, request *DomainRenewRequest) (*DomainRenewalResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/renewal", accountID, domainName))
|
||||||
|
renewalResponse := &DomainRenewalResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, request, renewalResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
renewalResponse.HttpResponse = resp
|
||||||
|
return renewalResponse, nil
|
||||||
|
}
|
@ -0,0 +1,37 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EnableDomainAutoRenewal enables auto-renewal for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/auto-renewal/#enable
|
||||||
|
func (s *RegistrarService) EnableDomainAutoRenewal(accountID string, domainName string) (*DomainResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/auto_renewal", accountID, domainName))
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.put(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisableDomainAutoRenewal disables auto-renewal for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/auto-renewal/#enable
|
||||||
|
func (s *RegistrarService) DisableDomainAutoRenewal(accountID string, domainName string) (*DomainResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/auto_renewal", accountID, domainName))
|
||||||
|
domainResponse := &DomainResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
domainResponse.HttpResponse = resp
|
||||||
|
return domainResponse, nil
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Delegation represents a list of name servers that correspond to a domain delegation.
|
||||||
|
type Delegation []string
|
||||||
|
|
||||||
|
// DelegationResponse represents a response from an API method that returns a delegation struct.
|
||||||
|
type DelegationResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Delegation `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VanityDelegationResponse represents a response for vanity name server enable and disable operations.
|
||||||
|
type VanityDelegationResponse struct {
|
||||||
|
Response
|
||||||
|
Data []VanityNameServer `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDomainDelegation gets the current delegated name servers for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/delegation/#get
|
||||||
|
func (s *RegistrarService) GetDomainDelegation(accountID string, domainName string) (*DelegationResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/delegation", accountID, domainName))
|
||||||
|
delegationResponse := &DelegationResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, delegationResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
delegationResponse.HttpResponse = resp
|
||||||
|
return delegationResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeDomainDelegation updates the delegated name severs for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/delegation/#get
|
||||||
|
func (s *RegistrarService) ChangeDomainDelegation(accountID string, domainName string, newDelegation *Delegation) (*DelegationResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/delegation", accountID, domainName))
|
||||||
|
delegationResponse := &DelegationResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.put(path, newDelegation, delegationResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
delegationResponse.HttpResponse = resp
|
||||||
|
return delegationResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeDomainDelegationToVanity enables vanity name servers for the given domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/delegation/#delegateToVanity
|
||||||
|
func (s *RegistrarService) ChangeDomainDelegationToVanity(accountID string, domainName string, newDelegation *Delegation) (*VanityDelegationResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/delegation/vanity", accountID, domainName))
|
||||||
|
delegationResponse := &VanityDelegationResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.put(path, newDelegation, delegationResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
delegationResponse.HttpResponse = resp
|
||||||
|
return delegationResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeDomainDelegationFromVanity disables vanity name servers for the given domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/delegation/#dedelegateFromVanity
|
||||||
|
func (s *RegistrarService) ChangeDomainDelegationFromVanity(accountID string, domainName string) (*VanityDelegationResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/delegation/vanity", accountID, domainName))
|
||||||
|
delegationResponse := &VanityDelegationResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
delegationResponse.HttpResponse = resp
|
||||||
|
return delegationResponse, nil
|
||||||
|
}
|
@ -0,0 +1,69 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WhoisPrivacy represents a whois privacy in DNSimple.
|
||||||
|
type WhoisPrivacy struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
DomainID int `json:"domain_id,omitempty"`
|
||||||
|
Enabled bool `json:"enabled,omitempty"`
|
||||||
|
ExpiresOn string `json:"expires_on,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WhoisPrivacyResponse represents a response from an API method that returns a WhoisPrivacy struct.
|
||||||
|
type WhoisPrivacyResponse struct {
|
||||||
|
Response
|
||||||
|
Data *WhoisPrivacy `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetWhoisPrivacy gets the whois privacy for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/whois-privacy/#get
|
||||||
|
func (s *RegistrarService) GetWhoisPrivacy(accountID string, domainName string) (*WhoisPrivacyResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/whois_privacy", accountID, domainName))
|
||||||
|
privacyResponse := &WhoisPrivacyResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, privacyResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
privacyResponse.HttpResponse = resp
|
||||||
|
return privacyResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnableWhoisPrivacy enables the whois privacy for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/whois-privacy/#enable
|
||||||
|
func (s *RegistrarService) EnableWhoisPrivacy(accountID string, domainName string) (*WhoisPrivacyResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/whois_privacy", accountID, domainName))
|
||||||
|
privacyResponse := &WhoisPrivacyResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.put(path, nil, privacyResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
privacyResponse.HttpResponse = resp
|
||||||
|
return privacyResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisablePrivacy disables the whois privacy for the domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/registrar/whois-privacy/#enable
|
||||||
|
func (s *RegistrarService) DisableWhoisPrivacy(accountID string, domainName string) (*WhoisPrivacyResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/registrar/domains/%v/whois_privacy", accountID, domainName))
|
||||||
|
privacyResponse := &WhoisPrivacyResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, privacyResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
privacyResponse.HttpResponse = resp
|
||||||
|
return privacyResponse, nil
|
||||||
|
}
|
@ -0,0 +1,93 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServicesService handles communication with the service related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/
|
||||||
|
type ServicesService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServiceSetting represents a single group of settings for a DNSimple Service.
|
||||||
|
type ServiceSetting struct {
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Label string `json:"label,omitempty"`
|
||||||
|
Append string `json:"append,omitempty"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
Example string `json:"example,omitempty"`
|
||||||
|
Password bool `json:"password,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Service represents a Service in DNSimple.
|
||||||
|
type Service struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
ShortName string `json:"short_name,omitempty"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
SetupDescription string `json:"setup_description,omitempty"`
|
||||||
|
RequiresSetup bool `json:"requires_setup,omitempty"`
|
||||||
|
DefaultSubdomain string `json:"default_subdomain,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
Settings []ServiceSetting `json:"settings,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func servicePath(serviceID string) string {
|
||||||
|
if serviceID != "" {
|
||||||
|
return fmt.Sprintf("/services/%v", serviceID)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("/services")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServiceResponse represents a response from an API method that returns a Service struct.
|
||||||
|
type ServiceResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Service `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServicesResponse represents a response from an API method that returns a collection of Service struct.
|
||||||
|
type ServicesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Service `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListServices lists the one-click services available in DNSimple.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/#list
|
||||||
|
func (s *ServicesService) ListServices(options *ListOptions) (*ServicesResponse, error) {
|
||||||
|
path := versioned(servicePath(""))
|
||||||
|
servicesResponse := &ServicesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, servicesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return servicesResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
servicesResponse.HttpResponse = resp
|
||||||
|
return servicesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetService fetches a one-click service.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/#get
|
||||||
|
func (s *ServicesService) GetService(serviceIdentifier string) (*ServiceResponse, error) {
|
||||||
|
path := versioned(servicePath(serviceIdentifier))
|
||||||
|
serviceResponse := &ServiceResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, serviceResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
serviceResponse.HttpResponse = resp
|
||||||
|
return serviceResponse, nil
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func domainServicesPath(accountID string, domainID string, serviceIdentifier string) string {
|
||||||
|
if serviceIdentifier != "" {
|
||||||
|
return fmt.Sprintf("/%v/domains/%v/services/%v", accountID, domainID, serviceIdentifier)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("/%v/domains/%v/services", accountID, domainID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DomainServiceSettings represents optional settings when applying a DNSimple one-click service to a domain.
|
||||||
|
type DomainServiceSettings struct {
|
||||||
|
Settings map[string]string `url:"settings,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// AppliedServices lists the applied one-click services for a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/domains/#applied
|
||||||
|
func (s *ServicesService) AppliedServices(accountID string, domainID string, options *ListOptions) (*ServicesResponse, error) {
|
||||||
|
path := versioned(domainServicesPath(accountID, domainID, ""))
|
||||||
|
servicesResponse := &ServicesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, servicesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return servicesResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
servicesResponse.HttpResponse = resp
|
||||||
|
return servicesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApplyService applies a one-click services to a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/domains/#apply
|
||||||
|
func (s *ServicesService) ApplyService(accountID string, serviceIdentifier string, domainID string, settings DomainServiceSettings) (*ServiceResponse, error) {
|
||||||
|
path := versioned(domainServicesPath(accountID, domainID, serviceIdentifier))
|
||||||
|
serviceResponse := &ServiceResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, settings, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
serviceResponse.HttpResponse = resp
|
||||||
|
return serviceResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnapplyService unapplies a one-click services from a domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/services/domains/#unapply
|
||||||
|
func (s *ServicesService) UnapplyService(accountID string, serviceIdentifier string, domainID string) (*ServiceResponse, error) {
|
||||||
|
path := versioned(domainServicesPath(accountID, domainID, serviceIdentifier))
|
||||||
|
serviceResponse := &ServiceResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
serviceResponse.HttpResponse = resp
|
||||||
|
return serviceResponse, nil
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TemplatesService handles communication with the template related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/
|
||||||
|
type TemplatesService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Template represents a Template in DNSimple.
|
||||||
|
type Template struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
AccountID int `json:"account_id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
ShortName string `json:"short_name,omitempty"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func templatePath(accountID string, templateIdentifier string) string {
|
||||||
|
if templateIdentifier != "" {
|
||||||
|
return fmt.Sprintf("/%v/templates/%v", accountID, templateIdentifier)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Sprintf("/%v/templates", accountID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplateResponse represents a response from an API method that returns a Template struct.
|
||||||
|
type TemplateResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Template `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplatesResponse represents a response from an API method that returns a collection of Template struct.
|
||||||
|
type TemplatesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Template `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListTemplates list the templates for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/#list
|
||||||
|
func (s *TemplatesService) ListTemplates(accountID string, options *ListOptions) (*TemplatesResponse, error) {
|
||||||
|
path := versioned(templatePath(accountID, ""))
|
||||||
|
templatesResponse := &TemplatesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, templatesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return templatesResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templatesResponse.HttpResponse = resp
|
||||||
|
return templatesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTemplate creates a new template.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/#create
|
||||||
|
func (s *TemplatesService) CreateTemplate(accountID string, templateAttributes Template) (*TemplateResponse, error) {
|
||||||
|
path := versioned(templatePath(accountID, ""))
|
||||||
|
templateResponse := &TemplateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, templateAttributes, templateResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateResponse.HttpResponse = resp
|
||||||
|
return templateResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTemplate fetches a template.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/#get
|
||||||
|
func (s *TemplatesService) GetTemplate(accountID string, templateIdentifier string) (*TemplateResponse, error) {
|
||||||
|
path := versioned(templatePath(accountID, templateIdentifier))
|
||||||
|
templateResponse := &TemplateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, templateResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateResponse.HttpResponse = resp
|
||||||
|
return templateResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateTemplate updates a template.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/#update
|
||||||
|
func (s *TemplatesService) UpdateTemplate(accountID string, templateIdentifier string, templateAttributes Template) (*TemplateResponse, error) {
|
||||||
|
path := versioned(templatePath(accountID, templateIdentifier))
|
||||||
|
templateResponse := &TemplateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.patch(path, templateAttributes, templateResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateResponse.HttpResponse = resp
|
||||||
|
return templateResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteTemplate deletes a template.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/#delete
|
||||||
|
func (s *TemplatesService) DeleteTemplate(accountID string, templateIdentifier string) (*TemplateResponse, error) {
|
||||||
|
path := versioned(templatePath(accountID, templateIdentifier))
|
||||||
|
templateResponse := &TemplateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateResponse.HttpResponse = resp
|
||||||
|
return templateResponse, nil
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ApplyTemplate applies a template to the given domain.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/domains/#apply
|
||||||
|
func (s *TemplatesService) ApplyTemplate(accountID string, templateIdentifier string, domainID string) (*TemplateResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("%v/templates/%v", domainPath(accountID, domainID), templateIdentifier))
|
||||||
|
templateResponse := &TemplateResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateResponse.HttpResponse = resp
|
||||||
|
return templateResponse, nil
|
||||||
|
}
|
@ -0,0 +1,107 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TemplateRecord represents a DNS record for a template in DNSimple.
|
||||||
|
type TemplateRecord struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
TemplateID int `json:"template_id,omitempty"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Content string `json:"content,omitempty"`
|
||||||
|
TTL int `json:"ttl,omitempty"`
|
||||||
|
Type string `json:"type,omitempty"`
|
||||||
|
Priority int `json:"priority,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplateRecordResponse represents a response from an API method that returns a TemplateRecord struct.
|
||||||
|
type TemplateRecordResponse struct {
|
||||||
|
Response
|
||||||
|
Data *TemplateRecord `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TemplateRecordsResponse represents a response from an API method that returns a collection of TemplateRecord struct.
|
||||||
|
type TemplateRecordsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []TemplateRecord `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func templateRecordPath(accountID string, templateIdentifier string, templateRecordID string) string {
|
||||||
|
if templateRecordID != "" {
|
||||||
|
return fmt.Sprintf("%v/records/%v", templatePath(accountID, templateIdentifier), templateRecordID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return templatePath(accountID, templateIdentifier) + "/records"
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListTemplateRecords list the templates for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/records/#list
|
||||||
|
func (s *TemplatesService) ListTemplateRecords(accountID string, templateIdentifier string, options *ListOptions) (*TemplateRecordsResponse, error) {
|
||||||
|
path := versioned(templateRecordPath(accountID, templateIdentifier, ""))
|
||||||
|
templateRecordsResponse := &TemplateRecordsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, templateRecordsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return templateRecordsResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateRecordsResponse.HttpResponse = resp
|
||||||
|
return templateRecordsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateTemplateRecord creates a new template record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/records/#create
|
||||||
|
func (s *TemplatesService) CreateTemplateRecord(accountID string, templateIdentifier string, templateRecordAttributes TemplateRecord) (*TemplateRecordResponse, error) {
|
||||||
|
path := versioned(templateRecordPath(accountID, templateIdentifier, ""))
|
||||||
|
templateRecordResponse := &TemplateRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, templateRecordAttributes, templateRecordResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateRecordResponse.HttpResponse = resp
|
||||||
|
return templateRecordResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTemplateRecord fetches a template record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/records/#get
|
||||||
|
func (s *TemplatesService) GetTemplateRecord(accountID string, templateIdentifier string, templateRecordID string) (*TemplateRecordResponse, error) {
|
||||||
|
path := versioned(templateRecordPath(accountID, templateIdentifier, templateRecordID))
|
||||||
|
templateRecordResponse := &TemplateRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, templateRecordResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateRecordResponse.HttpResponse = resp
|
||||||
|
return templateRecordResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteTemplateRecord deletes a template record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/templates/records/#delete
|
||||||
|
func (s *TemplatesService) DeleteTemplateRecord(accountID string, templateIdentifier string, templateRecordID string) (*TemplateRecordResponse, error) {
|
||||||
|
path := versioned(templateRecordPath(accountID, templateIdentifier, templateRecordID))
|
||||||
|
templateRecordResponse := &TemplateRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
templateRecordResponse.HttpResponse = resp
|
||||||
|
return templateRecordResponse, nil
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TldsService handles communication with the Tld related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/
|
||||||
|
type TldsService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tld represents a TLD in DNSimple.
|
||||||
|
type Tld struct {
|
||||||
|
Tld string `json:"tld"`
|
||||||
|
TldType int `json:"tld_type"`
|
||||||
|
WhoisPrivacy bool `json:"whois_privacy"`
|
||||||
|
AutoRenewOnly bool `json:"auto_renew_only"`
|
||||||
|
MinimumRegistration int `json:"minimum_registration"`
|
||||||
|
RegistrationEnabled bool `json:"registration_enabled"`
|
||||||
|
RenewalEnabled bool `json:"renewal_enabled"`
|
||||||
|
TransferEnabled bool `json:"transfer_enabled"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TldExtendedAttribute represents an extended attributes supported or required
|
||||||
|
// by a specific TLD.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/
|
||||||
|
type TldExtendedAttribute struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Required bool `json:"required"`
|
||||||
|
Options []TldExtendedAttributeOption `json:"options"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TldExtendedAttributeOption represents a single option you can assign to an extended attributes.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/
|
||||||
|
type TldExtendedAttributeOption struct {
|
||||||
|
Title string `json:"title"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TldResponse represents a response from an API method that returns a Tld struct.
|
||||||
|
type TldResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Tld `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TldsResponse represents a response from an API method that returns a collection of Tld struct.
|
||||||
|
type TldsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Tld `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TldExtendedAttributesResponse represents a response from an API method that returns
|
||||||
|
// a collection of Tld extended attributes.
|
||||||
|
type TldExtendedAttributesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []TldExtendedAttribute `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListTlds lists the supported TLDs.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/#list
|
||||||
|
func (s *TldsService) ListTlds(options *ListOptions) (*TldsResponse, error) {
|
||||||
|
path := versioned("/tlds")
|
||||||
|
tldsResponse := &TldsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, tldsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return tldsResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
tldsResponse.HttpResponse = resp
|
||||||
|
return tldsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTld fetches a TLD.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/#get
|
||||||
|
func (s *TldsService) GetTld(tld string) (*TldResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/tlds/%s", tld))
|
||||||
|
tldResponse := &TldResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, tldResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
tldResponse.HttpResponse = resp
|
||||||
|
return tldResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetTld fetches the extended attributes of a TLD.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/tlds/#get
|
||||||
|
func (s *TldsService) GetTldExtendedAttributes(tld string) (*TldExtendedAttributesResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/tlds/%s/extended_attributes", tld))
|
||||||
|
tldResponse := &TldExtendedAttributesResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, tldResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
tldResponse.HttpResponse = resp
|
||||||
|
return tldResponse, nil
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
// User represents a DNSimple user.
|
||||||
|
type User struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
Email string `json:"email,omitempty"`
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// VanityNameServersService handles communication with Vanity Name Servers
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/vanity/
|
||||||
|
type VanityNameServersService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// VanityNameServer represents data for a single vanity name server
|
||||||
|
type VanityNameServer struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
IPv4 string `json:"ipv4,omitempty"`
|
||||||
|
IPv6 string `json:"ipv6,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// VanityNameServerResponse represents a response for vanity name server enable and disable operations.
|
||||||
|
type VanityNameServerResponse struct {
|
||||||
|
Response
|
||||||
|
Data []VanityNameServer `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func vanityNameServerPath(accountID string, domainID string) string {
|
||||||
|
return fmt.Sprintf("/%v/vanity/%v", accountID, domainID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// EnableVanityNameServers Vanity Name Servers for the given domain
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/vanity/#enable
|
||||||
|
func (s *VanityNameServersService) EnableVanityNameServers(accountID string, domainID string) (*VanityNameServerResponse, error) {
|
||||||
|
path := versioned(vanityNameServerPath(accountID, domainID))
|
||||||
|
vanityNameServerResponse := &VanityNameServerResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.put(path, nil, vanityNameServerResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
vanityNameServerResponse.HttpResponse = resp
|
||||||
|
return vanityNameServerResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DisableVanityNameServers Vanity Name Servers for the given domain
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/vanity/#disable
|
||||||
|
func (s *VanityNameServersService) DisableVanityNameServers(accountID string, domainID string) (*VanityNameServerResponse, error) {
|
||||||
|
path := versioned(vanityNameServerPath(accountID, domainID))
|
||||||
|
vanityNameServerResponse := &VanityNameServerResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
vanityNameServerResponse.HttpResponse = resp
|
||||||
|
return vanityNameServerResponse, nil
|
||||||
|
}
|
@ -0,0 +1,104 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// WebhooksService handles communication with the webhook related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/webhooks
|
||||||
|
type WebhooksService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Webhook represents a DNSimple webhook.
|
||||||
|
type Webhook struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
URL string `json:"url,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebhookResponse represents a response from an API method that returns a Webhook struct.
|
||||||
|
type WebhookResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Webhook `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebhookResponse represents a response from an API method that returns a collection of Webhook struct.
|
||||||
|
type WebhooksResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Webhook `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// webhookPath generates the resource path for given webhook.
|
||||||
|
func webhookPath(accountID string, webhookID int) (path string) {
|
||||||
|
path = fmt.Sprintf("/%v/webhooks", accountID)
|
||||||
|
if webhookID != 0 {
|
||||||
|
path = fmt.Sprintf("%v/%v", path, webhookID)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListWebhooks lists the webhooks for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/webhooks#list
|
||||||
|
func (s *WebhooksService) ListWebhooks(accountID string, _ *ListOptions) (*WebhooksResponse, error) {
|
||||||
|
path := versioned(webhookPath(accountID, 0))
|
||||||
|
webhooksResponse := &WebhooksResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, webhooksResponse)
|
||||||
|
if err != nil {
|
||||||
|
return webhooksResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
webhooksResponse.HttpResponse = resp
|
||||||
|
return webhooksResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateWebhook creates a new webhook.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/webhooks#create
|
||||||
|
func (s *WebhooksService) CreateWebhook(accountID string, webhookAttributes Webhook) (*WebhookResponse, error) {
|
||||||
|
path := versioned(webhookPath(accountID, 0))
|
||||||
|
webhookResponse := &WebhookResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, webhookAttributes, webhookResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
webhookResponse.HttpResponse = resp
|
||||||
|
return webhookResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetWebhook fetches a webhook.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/webhooks#get
|
||||||
|
func (s *WebhooksService) GetWebhook(accountID string, webhookID int) (*WebhookResponse, error) {
|
||||||
|
path := versioned(webhookPath(accountID, webhookID))
|
||||||
|
webhookResponse := &WebhookResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, webhookResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
webhookResponse.HttpResponse = resp
|
||||||
|
return webhookResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteWebhook PERMANENTLY deletes a webhook from the account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/webhooks#delete
|
||||||
|
func (s *WebhooksService) DeleteWebhook(accountID string, webhookID int) (*WebhookResponse, error) {
|
||||||
|
path := versioned(webhookPath(accountID, webhookID))
|
||||||
|
webhookResponse := &WebhookResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
webhookResponse.HttpResponse = resp
|
||||||
|
return webhookResponse, nil
|
||||||
|
}
|
@ -0,0 +1,108 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ZonesService handles communication with the zone related
|
||||||
|
// methods of the DNSimple API.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/
|
||||||
|
type ZonesService struct {
|
||||||
|
client *Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zone represents a Zone in DNSimple.
|
||||||
|
type Zone struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
AccountID int `json:"account_id,omitempty"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Reverse bool `json:"reverse,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneFile represents a Zone File in DNSimple.
|
||||||
|
type ZoneFile struct {
|
||||||
|
Zone string `json:"zone,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneListOptions specifies the optional parameters you can provide
|
||||||
|
// to customize the ZonesService.ListZones method.
|
||||||
|
type ZoneListOptions struct {
|
||||||
|
// Select domains where the name contains given string.
|
||||||
|
NameLike string `url:"name_like,omitempty"`
|
||||||
|
|
||||||
|
ListOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneResponse represents a response from an API method that returns a Zone struct.
|
||||||
|
type ZoneResponse struct {
|
||||||
|
Response
|
||||||
|
Data *Zone `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZonesResponse represents a response from an API method that returns a collection of Zone struct.
|
||||||
|
type ZonesResponse struct {
|
||||||
|
Response
|
||||||
|
Data []Zone `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneFileResponse represents a response from an API method that returns a ZoneFile struct.
|
||||||
|
type ZoneFileResponse struct {
|
||||||
|
Response
|
||||||
|
Data *ZoneFile `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListZones the zones for an account.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#list
|
||||||
|
func (s *ZonesService) ListZones(accountID string, options *ZoneListOptions) (*ZonesResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/zones", accountID))
|
||||||
|
zonesResponse := &ZonesResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, zonesResponse)
|
||||||
|
if err != nil {
|
||||||
|
return zonesResponse, err
|
||||||
|
}
|
||||||
|
|
||||||
|
zonesResponse.HttpResponse = resp
|
||||||
|
return zonesResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetZone fetches a zone.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#get
|
||||||
|
func (s *ZonesService) GetZone(accountID string, zoneName string) (*ZoneResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/zones/%v", accountID, zoneName))
|
||||||
|
zoneResponse := &ZoneResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, zoneResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
zoneResponse.HttpResponse = resp
|
||||||
|
return zoneResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetZoneFile fetches a zone file.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#get-file
|
||||||
|
func (s *ZonesService) GetZoneFile(accountID string, zoneName string) (*ZoneFileResponse, error) {
|
||||||
|
path := versioned(fmt.Sprintf("/%v/zones/%v/file", accountID, zoneName))
|
||||||
|
zoneFileResponse := &ZoneFileResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, zoneFileResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
zoneFileResponse.HttpResponse = resp
|
||||||
|
return zoneFileResponse, nil
|
||||||
|
}
|
@ -0,0 +1,144 @@
|
|||||||
|
package dnsimple
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ZoneRecord represents a DNS record in DNSimple.
|
||||||
|
type ZoneRecord struct {
|
||||||
|
ID int `json:"id,omitempty"`
|
||||||
|
ZoneID string `json:"zone_id,omitempty"`
|
||||||
|
ParentID int `json:"parent_id,omitempty"`
|
||||||
|
Type string `json:"type,omitempty"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Content string `json:"content,omitempty"`
|
||||||
|
TTL int `json:"ttl,omitempty"`
|
||||||
|
Priority int `json:"priority,omitempty"`
|
||||||
|
SystemRecord bool `json:"system_record,omitempty"`
|
||||||
|
Regions []string `json:"regions,omitempty"`
|
||||||
|
CreatedAt string `json:"created_at,omitempty"`
|
||||||
|
UpdatedAt string `json:"updated_at,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneRecordListOptions specifies the optional parameters you can provide
|
||||||
|
// to customize the ZonesService.ListZoneRecords method.
|
||||||
|
type ZoneRecordListOptions struct {
|
||||||
|
// Select records where the name matches given string.
|
||||||
|
Name string `url:"name,omitempty"`
|
||||||
|
|
||||||
|
// Select records where the name contains given string.
|
||||||
|
NameLike string `url:"name_like,omitempty"`
|
||||||
|
|
||||||
|
// Select records of given type.
|
||||||
|
// Eg. TXT, A, NS.
|
||||||
|
Type string `url:"record_type,omitempty"`
|
||||||
|
|
||||||
|
ListOptions
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneRecordResponse represents a response from an API method that returns a ZoneRecord struct.
|
||||||
|
type ZoneRecordResponse struct {
|
||||||
|
Response
|
||||||
|
Data *ZoneRecord `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ZoneRecordsResponse represents a response from an API method that returns a collection of ZoneRecord struct.
|
||||||
|
type ZoneRecordsResponse struct {
|
||||||
|
Response
|
||||||
|
Data []ZoneRecord `json:"data"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func zoneRecordPath(accountID string, zoneID string, recordID int) string {
|
||||||
|
path := fmt.Sprintf("/%v/zones/%v/records", accountID, zoneID)
|
||||||
|
|
||||||
|
if recordID != 0 {
|
||||||
|
path += fmt.Sprintf("/%d", recordID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
|
// ListRecords lists the zone records for a zone.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#list
|
||||||
|
func (s *ZonesService) ListRecords(accountID string, zoneID string, options *ZoneRecordListOptions) (*ZoneRecordsResponse, error) {
|
||||||
|
path := versioned(zoneRecordPath(accountID, zoneID, 0))
|
||||||
|
recordsResponse := &ZoneRecordsResponse{}
|
||||||
|
|
||||||
|
path, err := addURLQueryOptions(path, options)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, recordsResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recordsResponse.HttpResponse = resp
|
||||||
|
return recordsResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateRecord creates a zone record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#create
|
||||||
|
func (s *ZonesService) CreateRecord(accountID string, zoneID string, recordAttributes ZoneRecord) (*ZoneRecordResponse, error) {
|
||||||
|
path := versioned(zoneRecordPath(accountID, zoneID, 0))
|
||||||
|
recordResponse := &ZoneRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.post(path, recordAttributes, recordResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recordResponse.HttpResponse = resp
|
||||||
|
return recordResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetRecord fetches a zone record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#get
|
||||||
|
func (s *ZonesService) GetRecord(accountID string, zoneID string, recordID int) (*ZoneRecordResponse, error) {
|
||||||
|
path := versioned(zoneRecordPath(accountID, zoneID, recordID))
|
||||||
|
recordResponse := &ZoneRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.get(path, recordResponse)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recordResponse.HttpResponse = resp
|
||||||
|
return recordResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateRecord updates a zone record.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#update
|
||||||
|
func (s *ZonesService) UpdateRecord(accountID string, zoneID string, recordID int, recordAttributes ZoneRecord) (*ZoneRecordResponse, error) {
|
||||||
|
path := versioned(zoneRecordPath(accountID, zoneID, recordID))
|
||||||
|
recordResponse := &ZoneRecordResponse{}
|
||||||
|
resp, err := s.client.patch(path, recordAttributes, recordResponse)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recordResponse.HttpResponse = resp
|
||||||
|
return recordResponse, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteRecord PERMANENTLY deletes a zone record from the zone.
|
||||||
|
//
|
||||||
|
// See https://developer.dnsimple.com/v2/zones/#delete
|
||||||
|
func (s *ZonesService) DeleteRecord(accountID string, zoneID string, recordID int) (*ZoneRecordResponse, error) {
|
||||||
|
path := versioned(zoneRecordPath(accountID, zoneID, recordID))
|
||||||
|
recordResponse := &ZoneRecordResponse{}
|
||||||
|
|
||||||
|
resp, err := s.client.delete(path, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
recordResponse.HttpResponse = resp
|
||||||
|
return recordResponse, nil
|
||||||
|
}
|
Loading…
Reference in New Issue