238 lines
6 KiB
Go
238 lines
6 KiB
Go
|
package dnspod
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
type Record struct {
|
||
|
ID string `json:"id,omitempty"`
|
||
|
Name string `json:"name,omitempty"`
|
||
|
Line string `json:"line,omitempty"`
|
||
|
LineID string `json:"line_id,omitempty"`
|
||
|
Type string `json:"type,omitempty"`
|
||
|
TTL string `json:"ttl,omitempty"`
|
||
|
Value string `json:"value,omitempty"`
|
||
|
MX string `json:"mx,omitempty"`
|
||
|
Enabled string `json:"enabled,omitempty"`
|
||
|
Status string `json:"status,omitempty"`
|
||
|
MonitorStatus string `json:"monitor_status,omitempty"`
|
||
|
Remark string `json:"remark,omitempty"`
|
||
|
UpdateOn string `json:"updated_on,omitempty"`
|
||
|
UseAQB string `json:"use_aqb,omitempty"`
|
||
|
}
|
||
|
|
||
|
type recordsWrapper struct {
|
||
|
Status Status `json:"status"`
|
||
|
Info DomainInfo `json:"info"`
|
||
|
Records []Record `json:"records"`
|
||
|
}
|
||
|
|
||
|
type recordWrapper struct {
|
||
|
Status Status `json:"status"`
|
||
|
Info DomainInfo `json:"info"`
|
||
|
Record Record `json:"record"`
|
||
|
}
|
||
|
|
||
|
// recordAction generates the resource path for given record that belongs to a domain.
|
||
|
func recordAction(action string) string {
|
||
|
if len(action) > 0 {
|
||
|
return fmt.Sprintf("Record.%s", action)
|
||
|
}
|
||
|
return "Record.List"
|
||
|
}
|
||
|
|
||
|
// List the domain records.
|
||
|
//
|
||
|
// dnspod API docs: https://www.dnspod.cn/docs/records.html#record-list
|
||
|
func (s *DomainsService) ListRecords(domain string, recordName string) ([]Record, *Response, error) {
|
||
|
path := recordAction("List")
|
||
|
|
||
|
payload := newPayLoad(s.client.CommonParams)
|
||
|
|
||
|
payload.Add("domain_id", domain)
|
||
|
|
||
|
if recordName != "" {
|
||
|
payload.Add("sub_domain", recordName)
|
||
|
}
|
||
|
|
||
|
wrappedRecords := recordsWrapper{}
|
||
|
|
||
|
res, err := s.client.post(path, payload, &wrappedRecords)
|
||
|
if err != nil {
|
||
|
return []Record{}, res, err
|
||
|
}
|
||
|
|
||
|
if wrappedRecords.Status.Code != "1" {
|
||
|
return wrappedRecords.Records, nil, fmt.Errorf("Could not get domains: %s", wrappedRecords.Status.Message)
|
||
|
}
|
||
|
|
||
|
records := []Record{}
|
||
|
for _, record := range wrappedRecords.Records {
|
||
|
records = append(records, record)
|
||
|
}
|
||
|
|
||
|
return records, res, nil
|
||
|
}
|
||
|
|
||
|
// CreateRecord creates a domain record.
|
||
|
//
|
||
|
// dnspod API docs: https://www.dnspod.cn/docs/records.html#record-create
|
||
|
func (s *DomainsService) CreateRecord(domain string, recordAttributes Record) (Record, *Response, error) {
|
||
|
path := recordAction("Create")
|
||
|
|
||
|
payload := newPayLoad(s.client.CommonParams)
|
||
|
|
||
|
payload.Add("domain_id", domain)
|
||
|
|
||
|
if recordAttributes.Name != "" {
|
||
|
payload.Add("sub_domain", recordAttributes.Name)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Type != "" {
|
||
|
payload.Add("record_type", recordAttributes.Type)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Line != "" {
|
||
|
payload.Add("record_line", recordAttributes.Line)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.LineID != "" {
|
||
|
payload.Add("record_line_id", recordAttributes.LineID)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Value != "" {
|
||
|
payload.Add("value", recordAttributes.Value)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.MX != "" {
|
||
|
payload.Add("mx", recordAttributes.MX)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.TTL != "" {
|
||
|
payload.Add("ttl", recordAttributes.TTL)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Status != "" {
|
||
|
payload.Add("status", recordAttributes.Status)
|
||
|
}
|
||
|
|
||
|
returnedRecord := recordWrapper{}
|
||
|
|
||
|
res, err := s.client.post(path, payload, &returnedRecord)
|
||
|
if err != nil {
|
||
|
return Record{}, res, err
|
||
|
}
|
||
|
|
||
|
if returnedRecord.Status.Code != "1" {
|
||
|
return returnedRecord.Record, nil, fmt.Errorf("Could not get domains: %s", returnedRecord.Status.Message)
|
||
|
}
|
||
|
|
||
|
return returnedRecord.Record, res, nil
|
||
|
}
|
||
|
|
||
|
// GetRecord fetches the domain record.
|
||
|
//
|
||
|
// dnspod API docs: https://www.dnspod.cn/docs/records.html#record-info
|
||
|
func (s *DomainsService) GetRecord(domain string, recordID string) (Record, *Response, error) {
|
||
|
path := recordAction("Info")
|
||
|
|
||
|
payload := newPayLoad(s.client.CommonParams)
|
||
|
|
||
|
payload.Add("domain_id", domain)
|
||
|
payload.Add("record_id", recordID)
|
||
|
|
||
|
returnedRecord := recordWrapper{}
|
||
|
|
||
|
res, err := s.client.post(path, payload, &returnedRecord)
|
||
|
if err != nil {
|
||
|
return Record{}, res, err
|
||
|
}
|
||
|
|
||
|
if returnedRecord.Status.Code != "1" {
|
||
|
return returnedRecord.Record, nil, fmt.Errorf("Could not get domains: %s", returnedRecord.Status.Message)
|
||
|
}
|
||
|
|
||
|
return returnedRecord.Record, res, nil
|
||
|
}
|
||
|
|
||
|
// UpdateRecord updates a domain record.
|
||
|
//
|
||
|
// dnspod API docs: https://www.dnspod.cn/docs/records.html#record-modify
|
||
|
func (s *DomainsService) UpdateRecord(domain string, recordID string, recordAttributes Record) (Record, *Response, error) {
|
||
|
path := recordAction("Modify")
|
||
|
|
||
|
payload := newPayLoad(s.client.CommonParams)
|
||
|
|
||
|
payload.Add("domain_id", domain)
|
||
|
|
||
|
if recordAttributes.Name != "" {
|
||
|
payload.Add("sub_domain", recordAttributes.Name)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Type != "" {
|
||
|
payload.Add("record_type", recordAttributes.Type)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Line != "" {
|
||
|
payload.Add("record_line", recordAttributes.Line)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.LineID != "" {
|
||
|
payload.Add("record_line_id", recordAttributes.LineID)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Value != "" {
|
||
|
payload.Add("value", recordAttributes.Value)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.MX != "" {
|
||
|
payload.Add("mx", recordAttributes.MX)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.TTL != "" {
|
||
|
payload.Add("ttl", recordAttributes.TTL)
|
||
|
}
|
||
|
|
||
|
if recordAttributes.Status != "" {
|
||
|
payload.Add("status", recordAttributes.Status)
|
||
|
}
|
||
|
|
||
|
returnedRecord := recordWrapper{}
|
||
|
|
||
|
res, err := s.client.post(path, payload, &returnedRecord)
|
||
|
if err != nil {
|
||
|
return Record{}, res, err
|
||
|
}
|
||
|
|
||
|
if returnedRecord.Status.Code != "1" {
|
||
|
return returnedRecord.Record, nil, fmt.Errorf("Could not get domains: %s", returnedRecord.Status.Message)
|
||
|
}
|
||
|
|
||
|
return returnedRecord.Record, res, nil
|
||
|
}
|
||
|
|
||
|
// DeleteRecord deletes a domain record.
|
||
|
//
|
||
|
// dnspod API docs: https://www.dnspod.cn/docs/records.html#record-remove
|
||
|
func (s *DomainsService) DeleteRecord(domain string, recordID string) (*Response, error) {
|
||
|
path := recordAction("Remove")
|
||
|
|
||
|
payload := newPayLoad(s.client.CommonParams)
|
||
|
|
||
|
payload.Add("domain_id", domain)
|
||
|
payload.Add("record_id", recordID)
|
||
|
|
||
|
returnedRecord := recordWrapper{}
|
||
|
|
||
|
res, err := s.client.post(path, payload, &returnedRecord)
|
||
|
if err != nil {
|
||
|
return res, err
|
||
|
}
|
||
|
|
||
|
if returnedRecord.Status.Code != "1" {
|
||
|
return nil, fmt.Errorf("Could not get domains: %s", returnedRecord.Status.Message)
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|