domains.go raw

   1  package dnspod
   2  
   3  import (
   4  	"encoding/json"
   5  	"fmt"
   6  	"strconv"
   7  	// "time"
   8  )
   9  
  10  const (
  11  	methodDomainList   = "Domain.List"
  12  	methodDomainCreate = "Domain.Create"
  13  	methodDomainInfo   = "Domain.Info"
  14  	methodDomainRemove = "Domain.Remove"
  15  )
  16  
  17  // DomainInfo handles domain information.
  18  type DomainInfo struct {
  19  	DomainTotal   json.Number `json:"domain_total,omitempty"`
  20  	AllTotal      json.Number `json:"all_total,omitempty"`
  21  	MineTotal     json.Number `json:"mine_total,omitempty"`
  22  	ShareTotal    json.Number `json:"share_total,omitempty"`
  23  	VipTotal      json.Number `json:"vip_total,omitempty"`
  24  	IsMarkTotal   json.Number `json:"ismark_total,omitempty"`
  25  	PauseTotal    json.Number `json:"pause_total,omitempty"`
  26  	ErrorTotal    json.Number `json:"error_total,omitempty"`
  27  	LockTotal     json.Number `json:"lock_total,omitempty"`
  28  	SpamTotal     json.Number `json:"spam_total,omitempty"`
  29  	VipExpire     json.Number `json:"vip_expire,omitempty"`
  30  	ShareOutTotal json.Number `json:"share_out_total,omitempty"`
  31  }
  32  
  33  // Domain handles domain.
  34  type Domain struct {
  35  	ID               json.Number `json:"id,omitempty"`
  36  	Name             string      `json:"name,omitempty"`
  37  	PunyCode         string      `json:"punycode,omitempty"`
  38  	Grade            string      `json:"grade,omitempty"`
  39  	GradeTitle       string      `json:"grade_title,omitempty"`
  40  	Status           string      `json:"status,omitempty"`
  41  	ExtStatus        string      `json:"ext_status,omitempty"`
  42  	Records          string      `json:"records,omitempty"`
  43  	GroupID          json.Number `json:"group_id,omitempty"`
  44  	IsMark           string      `json:"is_mark,omitempty"`
  45  	Remark           string      `json:"remark,omitempty"`
  46  	IsVIP            string      `json:"is_vip,omitempty"`
  47  	SearchenginePush string      `json:"searchengine_push,omitempty"`
  48  	UserID           string      `json:"user_id,omitempty"`
  49  	CreatedOn        string      `json:"created_on,omitempty"`
  50  	UpdatedOn        string      `json:"updated_on,omitempty"`
  51  	TTL              string      `json:"ttl,omitempty"`
  52  	CNameSpeedUp     string      `json:"cname_speedup,omitempty"`
  53  	Owner            string      `json:"owner,omitempty"`
  54  	AuthToAnquanBao  bool        `json:"auth_to_anquanbao,omitempty"`
  55  }
  56  
  57  type domainListWrapper struct {
  58  	Status  Status     `json:"status"`
  59  	Info    DomainInfo `json:"info"`
  60  	Domains []Domain   `json:"domains"`
  61  }
  62  
  63  type domainWrapper struct {
  64  	Status Status     `json:"status"`
  65  	Info   DomainInfo `json:"info"`
  66  	Domain Domain     `json:"domain"`
  67  }
  68  
  69  // DomainsService handles communication with the domain related methods of the dnspod API.
  70  //
  71  // dnspod API docs: https://www.dnspod.cn/docs/domains.html
  72  type DomainsService struct {
  73  	client *Client
  74  }
  75  
  76  // List the domains.
  77  //
  78  // dnspod API docs: https://www.dnspod.cn/docs/domains.html#domain-list
  79  func (s *DomainsService) List() ([]Domain, *Response, error) {
  80  	payload := s.client.CommonParams.toPayLoad()
  81  
  82  	returnedDomains := domainListWrapper{}
  83  
  84  	res, err := s.client.post(methodDomainList, payload, &returnedDomains)
  85  	if err != nil {
  86  		return nil, res, err
  87  	}
  88  
  89  	if returnedDomains.Status.Code != "1" {
  90  		return nil, nil, fmt.Errorf("could not get domains: %s", returnedDomains.Status.Message)
  91  	}
  92  
  93  	return returnedDomains.Domains, res, nil
  94  }
  95  
  96  // Create a new domain.
  97  //
  98  // dnspod API docs: https://www.dnspod.cn/docs/domains.html#domain-create
  99  func (s *DomainsService) Create(domainAttributes Domain) (Domain, *Response, error) {
 100  	payload := s.client.CommonParams.toPayLoad()
 101  	payload.Set("domain", domainAttributes.Name)
 102  	payload.Set("group_id", domainAttributes.GroupID.String())
 103  	payload.Set("is_mark", domainAttributes.IsMark)
 104  
 105  	returnedDomain := domainWrapper{}
 106  
 107  	res, err := s.client.post(methodDomainCreate, payload, &returnedDomain)
 108  	if err != nil {
 109  		return Domain{}, res, err
 110  	}
 111  
 112  	return returnedDomain.Domain, res, nil
 113  }
 114  
 115  // Get fetches a domain.
 116  //
 117  // dnspod API docs: https://www.dnspod.cn/docs/domains.html#domain-info
 118  func (s *DomainsService) Get(id int) (Domain, *Response, error) {
 119  	payload := s.client.CommonParams.toPayLoad()
 120  	payload.Set("domain_id", strconv.Itoa(id))
 121  
 122  	returnedDomain := domainWrapper{}
 123  
 124  	res, err := s.client.post(methodDomainInfo, payload, &returnedDomain)
 125  	if err != nil {
 126  		return Domain{}, res, err
 127  	}
 128  
 129  	return returnedDomain.Domain, res, nil
 130  }
 131  
 132  // Delete a domain.
 133  //
 134  // dnspod API docs: https://dnsapi.cn/Domain.Remove
 135  func (s *DomainsService) Delete(id int) (*Response, error) {
 136  	payload := s.client.CommonParams.toPayLoad()
 137  	payload.Set("domain_id", strconv.Itoa(id))
 138  
 139  	returnedDomain := domainWrapper{}
 140  
 141  	return s.client.post(methodDomainRemove, payload, &returnedDomain)
 142  }
 143