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