Standardize on returning objects, not the json roots.
Let's be nice to our consumers - they don't care about the root, they care about the object. Even when the user needs access to the Links, that's accessible via the resp variable returned.
This commit is contained in:
parent
bbf01e0d69
commit
1df42b98f6
10
account.go
10
account.go
|
@ -4,7 +4,7 @@ package godo
|
||||||
// endpoints of the Digital Ocean API
|
// endpoints of the Digital Ocean API
|
||||||
// See: https://developers.digitalocean.com/documentation/v2/#account
|
// See: https://developers.digitalocean.com/documentation/v2/#account
|
||||||
type AccountService interface {
|
type AccountService interface {
|
||||||
Get() (*AccountRoot, *Response, error)
|
Get() (*Account, *Response, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AccountServiceOp handles communication with the Account related methods of
|
// AccountServiceOp handles communication with the Account related methods of
|
||||||
|
@ -23,7 +23,7 @@ type Account struct {
|
||||||
EmailVerified bool `json:"email_verified,omitempty"`
|
EmailVerified bool `json:"email_verified,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type AccountRoot struct {
|
type accountRoot struct {
|
||||||
Account *Account `json:"account"`
|
Account *Account `json:"account"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ func (r Account) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get DigitalOcean account info
|
// Get DigitalOcean account info
|
||||||
func (s *AccountServiceOp) Get() (*AccountRoot, *Response, error) {
|
func (s *AccountServiceOp) Get() (*Account, *Response, error) {
|
||||||
path := "v2/account"
|
path := "v2/account"
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", path, nil)
|
req, err := s.client.NewRequest("GET", path, nil)
|
||||||
|
@ -40,11 +40,11 @@ func (s *AccountServiceOp) Get() (*AccountRoot, *Response, error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(AccountRoot)
|
root := new(accountRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return root, resp, err
|
return root.Account, resp, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,8 @@ func TestAccountGet(t *testing.T) {
|
||||||
t.Errorf("Account.Get returned error: %v", err)
|
t.Errorf("Account.Get returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := &AccountRoot{Account: &Account{DropletLimit: 25, Email: "sammy@digitalocean.com",
|
expected := &Account{DropletLimit: 25, Email: "sammy@digitalocean.com",
|
||||||
UUID: "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", EmailVerified: true}}
|
UUID: "b6fr89dbf6d9156cace5f3c78dc9851d957381ef", EmailVerified: true}
|
||||||
if !reflect.DeepEqual(acct, expected) {
|
if !reflect.DeepEqual(acct, expected) {
|
||||||
t.Errorf("Account.Get returned %+v, expected %+v", acct, expected)
|
t.Errorf("Account.Get returned %+v, expected %+v", acct, expected)
|
||||||
}
|
}
|
||||||
|
|
35
domains.go
35
domains.go
|
@ -9,8 +9,8 @@ const domainsBasePath = "v2/domains"
|
||||||
// https://developers.digitalocean.com/documentation/v2#domain-records
|
// https://developers.digitalocean.com/documentation/v2#domain-records
|
||||||
type DomainsService interface {
|
type DomainsService interface {
|
||||||
List(*ListOptions) ([]Domain, *Response, error)
|
List(*ListOptions) ([]Domain, *Response, error)
|
||||||
Get(string) (*DomainRoot, *Response, error)
|
Get(string) (*Domain, *Response, error)
|
||||||
Create(*DomainCreateRequest) (*DomainRoot, *Response, error)
|
Create(*DomainCreateRequest) (*Domain, *Response, error)
|
||||||
Delete(string) (*Response, error)
|
Delete(string) (*Response, error)
|
||||||
|
|
||||||
Records(string, *ListOptions) ([]DomainRecord, *Response, error)
|
Records(string, *ListOptions) ([]DomainRecord, *Response, error)
|
||||||
|
@ -35,8 +35,8 @@ type Domain struct {
|
||||||
ZoneFile string `json:"zone_file"`
|
ZoneFile string `json:"zone_file"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DomainRoot represents a response from the Digital Ocean API
|
// domainRoot represents a response from the Digital Ocean API
|
||||||
type DomainRoot struct {
|
type domainRoot struct {
|
||||||
Domain *Domain `json:"domain"`
|
Domain *Domain `json:"domain"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,12 +52,12 @@ type DomainCreateRequest struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DomainRecordRoot is the root of an individual Domain Record response
|
// DomainRecordRoot is the root of an individual Domain Record response
|
||||||
type DomainRecordRoot struct {
|
type domainRecordRoot struct {
|
||||||
DomainRecord *DomainRecord `json:"domain_record"`
|
DomainRecord *DomainRecord `json:"domain_record"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DomainRecordsRoot is the root of a group of Domain Record responses
|
// DomainRecordsRoot is the root of a group of Domain Record responses
|
||||||
type DomainRecordsRoot struct {
|
type domainRecordsRoot struct {
|
||||||
DomainRecords []DomainRecord `json:"domain_records"`
|
DomainRecords []DomainRecord `json:"domain_records"`
|
||||||
Links *Links `json:"links"`
|
Links *Links `json:"links"`
|
||||||
}
|
}
|
||||||
|
@ -113,7 +113,7 @@ func (s DomainsServiceOp) List(opt *ListOptions) ([]Domain, *Response, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get individual domain
|
// Get individual domain
|
||||||
func (s *DomainsServiceOp) Get(name string) (*DomainRoot, *Response, error) {
|
func (s *DomainsServiceOp) Get(name string) (*Domain, *Response, error) {
|
||||||
path := fmt.Sprintf("%s/%s", domainsBasePath, name)
|
path := fmt.Sprintf("%s/%s", domainsBasePath, name)
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", path, nil)
|
req, err := s.client.NewRequest("GET", path, nil)
|
||||||
|
@ -121,31 +121,34 @@ func (s *DomainsServiceOp) Get(name string) (*DomainRoot, *Response, error) {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(DomainRoot)
|
root := new(domainRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return root, resp, err
|
return root.Domain, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new domain
|
// Create a new domain
|
||||||
func (s *DomainsServiceOp) Create(createRequest *DomainCreateRequest) (*DomainRoot, *Response, error) {
|
func (s *DomainsServiceOp) Create(createRequest *DomainCreateRequest) (*Domain, *Response, error) {
|
||||||
path := domainsBasePath
|
path := domainsBasePath
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", path, createRequest)
|
req, err := s.client.NewRequest("POST", path, createRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Printf("1Something bad happened: %+v", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(DomainRoot)
|
root := new(domainRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
|
fmt.Printf("%+v\n", resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
fmt.Printf("2Something bad happened: %+v", err)
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
}
|
}
|
||||||
|
fmt.Printf("%+v\n", root)
|
||||||
return root, resp, err
|
return root.Domain, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete domain
|
// Delete domain
|
||||||
|
@ -185,7 +188,7 @@ func (s *DomainsServiceOp) Records(domain string, opt *ListOptions) ([]DomainRec
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(DomainRecordsRoot)
|
root := new(domainRecordsRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
|
@ -206,7 +209,7 @@ func (s *DomainsServiceOp) Record(domain string, id int) (*DomainRecord, *Respon
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
record := new(DomainRecordRoot)
|
record := new(domainRecordRoot)
|
||||||
resp, err := s.client.Do(req, record)
|
resp, err := s.client.Do(req, record)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
|
@ -261,7 +264,7 @@ func (s *DomainsServiceOp) CreateRecord(
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
d := new(DomainRecordRoot)
|
d := new(domainRecordRoot)
|
||||||
resp, err := s.client.Do(req, d)
|
resp, err := s.client.Do(req, d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
|
|
|
@ -90,7 +90,7 @@ func TestDomains_GetDomain(t *testing.T) {
|
||||||
t.Errorf("domain.Get returned error: %v", err)
|
t.Errorf("domain.Get returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := &DomainRoot{Domain: &Domain{Name: "example.com"}}
|
expected := &Domain{Name: "example.com"}
|
||||||
if !reflect.DeepEqual(domains, expected) {
|
if !reflect.DeepEqual(domains, expected) {
|
||||||
t.Errorf("domains.Get returned %+v, expected %+v", domains, expected)
|
t.Errorf("domains.Get returned %+v, expected %+v", domains, expected)
|
||||||
}
|
}
|
||||||
|
@ -117,13 +117,7 @@ func TestDomains_Create(t *testing.T) {
|
||||||
t.Errorf("Request body = %+v, expected %+v", v, createRequest)
|
t.Errorf("Request body = %+v, expected %+v", v, createRequest)
|
||||||
}
|
}
|
||||||
|
|
||||||
dr := DomainRoot{&Domain{Name: v.Name}}
|
fmt.Fprint(w, `{"domain":{"name":"example.com"}}`)
|
||||||
b, err := json.Marshal(dr)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Fprint(w, string(b))
|
|
||||||
})
|
})
|
||||||
|
|
||||||
domain, _, err := client.Domains.Create(createRequest)
|
domain, _, err := client.Domains.Create(createRequest)
|
||||||
|
@ -131,7 +125,7 @@ func TestDomains_Create(t *testing.T) {
|
||||||
t.Errorf("Domains.Create returned error: %v", err)
|
t.Errorf("Domains.Create returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := &DomainRoot{Domain: &Domain{Name: "example.com"}}
|
expected := &Domain{Name: "example.com"}
|
||||||
if !reflect.DeepEqual(domain, expected) {
|
if !reflect.DeepEqual(domain, expected) {
|
||||||
t.Errorf("Domains.Create returned %+v, expected %+v", domain, expected)
|
t.Errorf("Domains.Create returned %+v, expected %+v", domain, expected)
|
||||||
}
|
}
|
||||||
|
|
18
droplets.go
18
droplets.go
|
@ -12,8 +12,8 @@ const dropletBasePath = "v2/droplets"
|
||||||
// See: https://developers.digitalocean.com/documentation/v2#droplets
|
// See: https://developers.digitalocean.com/documentation/v2#droplets
|
||||||
type DropletsService interface {
|
type DropletsService interface {
|
||||||
List(*ListOptions) ([]Droplet, *Response, error)
|
List(*ListOptions) ([]Droplet, *Response, error)
|
||||||
Get(int) (*DropletRoot, *Response, error)
|
Get(int) (*Droplet, *Response, error)
|
||||||
Create(*DropletCreateRequest) (*DropletRoot, *Response, error)
|
Create(*DropletCreateRequest) (*Droplet, *Response, error)
|
||||||
Delete(int) (*Response, error)
|
Delete(int) (*Response, error)
|
||||||
Kernels(int, *ListOptions) ([]Kernel, *Response, error)
|
Kernels(int, *ListOptions) ([]Kernel, *Response, error)
|
||||||
Snapshots(int, *ListOptions) ([]Image, *Response, error)
|
Snapshots(int, *ListOptions) ([]Image, *Response, error)
|
||||||
|
@ -64,7 +64,7 @@ func (d Droplet) String() string {
|
||||||
}
|
}
|
||||||
|
|
||||||
// DropletRoot represents a Droplet root
|
// DropletRoot represents a Droplet root
|
||||||
type DropletRoot struct {
|
type dropletRoot struct {
|
||||||
Droplet *Droplet `json:"droplet"`
|
Droplet *Droplet `json:"droplet"`
|
||||||
Links *Links `json:"links,omitempty"`
|
Links *Links `json:"links,omitempty"`
|
||||||
}
|
}
|
||||||
|
@ -190,7 +190,7 @@ func (s *DropletsServiceOp) List(opt *ListOptions) ([]Droplet, *Response, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get individual droplet
|
// Get individual droplet
|
||||||
func (s *DropletsServiceOp) Get(dropletID int) (*DropletRoot, *Response, error) {
|
func (s *DropletsServiceOp) Get(dropletID int) (*Droplet, *Response, error) {
|
||||||
path := fmt.Sprintf("%s/%d", dropletBasePath, dropletID)
|
path := fmt.Sprintf("%s/%d", dropletBasePath, dropletID)
|
||||||
|
|
||||||
req, err := s.client.NewRequest("GET", path, nil)
|
req, err := s.client.NewRequest("GET", path, nil)
|
||||||
|
@ -198,17 +198,17 @@ func (s *DropletsServiceOp) Get(dropletID int) (*DropletRoot, *Response, error)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(DropletRoot)
|
root := new(dropletRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return root, resp, err
|
return root.Droplet, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create droplet
|
// Create droplet
|
||||||
func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*DropletRoot, *Response, error) {
|
func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Droplet, *Response, error) {
|
||||||
path := dropletBasePath
|
path := dropletBasePath
|
||||||
|
|
||||||
req, err := s.client.NewRequest("POST", path, createRequest)
|
req, err := s.client.NewRequest("POST", path, createRequest)
|
||||||
|
@ -216,7 +216,7 @@ func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Drople
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
root := new(DropletRoot)
|
root := new(dropletRoot)
|
||||||
resp, err := s.client.Do(req, root)
|
resp, err := s.client.Do(req, root)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, resp, err
|
return nil, resp, err
|
||||||
|
@ -225,7 +225,7 @@ func (s *DropletsServiceOp) Create(createRequest *DropletCreateRequest) (*Drople
|
||||||
resp.Links = l
|
resp.Links = l
|
||||||
}
|
}
|
||||||
|
|
||||||
return root, resp, err
|
return root.Droplet, resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete droplet
|
// Delete droplet
|
||||||
|
|
|
@ -106,7 +106,7 @@ func TestDroplets_GetDroplet(t *testing.T) {
|
||||||
t.Errorf("Droplet.Get returned error: %v", err)
|
t.Errorf("Droplet.Get returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
expected := &DropletRoot{Droplet: &Droplet{ID: 12345}}
|
expected := &Droplet{ID: 12345}
|
||||||
if !reflect.DeepEqual(droplets, expected) {
|
if !reflect.DeepEqual(droplets, expected) {
|
||||||
t.Errorf("Droplets.Get returned %+v, expected %+v", droplets, expected)
|
t.Errorf("Droplets.Get returned %+v, expected %+v", droplets, expected)
|
||||||
}
|
}
|
||||||
|
@ -150,12 +150,12 @@ func TestDroplets_Create(t *testing.T) {
|
||||||
fmt.Fprintf(w, `{"droplet":{"id":1}, "links":{"actions": [{"id": 1, "href": "http://example.com", "rel": "create"}]}}`)
|
fmt.Fprintf(w, `{"droplet":{"id":1}, "links":{"actions": [{"id": 1, "href": "http://example.com", "rel": "create"}]}}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
root, resp, err := client.Droplets.Create(createRequest)
|
droplet, resp, err := client.Droplets.Create(createRequest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Droplets.Create returned error: %v", err)
|
t.Errorf("Droplets.Create returned error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if id := root.Droplet.ID; id != 1 {
|
if id := droplet.ID; id != 1 {
|
||||||
t.Errorf("expected id '%d', received '%d'", 1, id)
|
t.Errorf("expected id '%d', received '%d'", 1, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue