435c0d9fc8
This PR switches the Nomad repository from using govendor to Go modules for managing dependencies. Aspects of the Nomad workflow remain pretty much the same. The usual Makefile targets should continue to work as they always did. The API submodule simply defers to the parent Nomad version on the repository, keeping the semantics of API versioning that currently exists.
118 lines
3.8 KiB
Go
118 lines
3.8 KiB
Go
package linodego
|
|
|
|
/*
|
|
- copy profile_test.go and do the same
|
|
- When updating Profile structs,
|
|
- use pointers where ever null'able would have a different meaning if the wrapper
|
|
supplied "" or 0 instead
|
|
- Add "NameOfResource" to client.go, resources.go, pagination.go
|
|
*/
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
)
|
|
|
|
// LishAuthMethod constants start with AuthMethod and include Linode API Lish Authentication Methods
|
|
type LishAuthMethod string
|
|
|
|
// LishAuthMethod constants are the methods of authentication allowed when connecting via Lish
|
|
const (
|
|
AuthMethodPasswordKeys LishAuthMethod = "password_keys"
|
|
AuthMethodKeysOnly LishAuthMethod = "keys_only"
|
|
AuthMethodDisabled LishAuthMethod = "disabled"
|
|
)
|
|
|
|
// ProfileReferrals represent a User's status in the Referral Program
|
|
type ProfileReferrals struct {
|
|
Total int `json:"total"`
|
|
Completed int `json:"completed"`
|
|
Pending int `json:"pending"`
|
|
Credit float64 `json:"credit"`
|
|
Code string `json:"code"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
// Profile represents a Profile object
|
|
type Profile struct {
|
|
UID int `json:"uid"`
|
|
Username string `json:"username"`
|
|
Email string `json:"email"`
|
|
Timezone string `json:"timezone"`
|
|
EmailNotifications bool `json:"email_notifications"`
|
|
IPWhitelistEnabled bool `json:"ip_whitelist_enabled"`
|
|
TwoFactorAuth bool `json:"two_factor_auth"`
|
|
Restricted bool `json:"restricted"`
|
|
LishAuthMethod LishAuthMethod `json:"lish_auth_method"`
|
|
Referrals ProfileReferrals `json:"referrals"`
|
|
AuthorizedKeys []string `json:"authorized_keys"`
|
|
}
|
|
|
|
// ProfileUpdateOptions fields are those accepted by UpdateProfile
|
|
type ProfileUpdateOptions struct {
|
|
Email string `json:"email,omitempty"`
|
|
Timezone string `json:"timezone,omitempty"`
|
|
EmailNotifications *bool `json:"email_notifications,omitempty"`
|
|
IPWhitelistEnabled *bool `json:"ip_whitelist_enabled,omitempty"`
|
|
LishAuthMethod LishAuthMethod `json:"lish_auth_method,omitempty"`
|
|
AuthorizedKeys *[]string `json:"authorized_keys,omitempty"`
|
|
TwoFactorAuth *bool `json:"two_factor_auth,omitempty"`
|
|
Restricted *bool `json:"restricted,omitempty"`
|
|
}
|
|
|
|
// GetUpdateOptions converts a Profile to ProfileUpdateOptions for use in UpdateProfile
|
|
func (i Profile) GetUpdateOptions() (o ProfileUpdateOptions) {
|
|
o.Email = i.Email
|
|
o.Timezone = i.Timezone
|
|
o.EmailNotifications = copyBool(&i.EmailNotifications)
|
|
o.IPWhitelistEnabled = copyBool(&i.IPWhitelistEnabled)
|
|
o.LishAuthMethod = i.LishAuthMethod
|
|
authorizedKeys := make([]string, len(i.AuthorizedKeys))
|
|
copy(authorizedKeys, i.AuthorizedKeys)
|
|
o.AuthorizedKeys = &authorizedKeys
|
|
o.TwoFactorAuth = copyBool(&i.TwoFactorAuth)
|
|
o.Restricted = copyBool(&i.Restricted)
|
|
|
|
return
|
|
}
|
|
|
|
// GetProfile gets the profile with the provided ID
|
|
func (c *Client) GetProfile(ctx context.Context) (*Profile, error) {
|
|
e, err := c.Profile.Endpoint()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
r, err := coupleAPIErrors(c.R(ctx).SetResult(&Profile{}).Get(e))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r.Result().(*Profile), nil
|
|
}
|
|
|
|
// UpdateProfile updates the Profile with the specified id
|
|
func (c *Client) UpdateProfile(ctx context.Context, updateOpts ProfileUpdateOptions) (*Profile, error) {
|
|
var body string
|
|
e, err := c.Profile.Endpoint()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
req := c.R(ctx).SetResult(&Profile{})
|
|
|
|
if bodyData, err := json.Marshal(updateOpts); err == nil {
|
|
body = string(bodyData)
|
|
} else {
|
|
return nil, NewError(err)
|
|
}
|
|
|
|
r, err := coupleAPIErrors(req.
|
|
SetBody(body).
|
|
Put(e))
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return r.Result().(*Profile), nil
|
|
}
|