1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
package linodego
import (
"context"
"encoding/json"
"time"
"github.com/linode/linodego/internal/parseabletime"
)
type UserType string
const (
UserTypeProxy UserType = "proxy"
UserTypeParent UserType = "parent"
UserTypeChild UserType = "child"
UserTypeDefault UserType = "default"
)
// LastLogin represents a LastLogin object
type LastLogin struct {
LoginDatetime *time.Time `json:"-"`
Status string `json:"status"`
}
// User represents a User object
type User struct {
Username string `json:"username"`
Email string `json:"email"`
LastLogin *LastLogin `json:"last_login"`
UserType UserType `json:"user_type"`
Restricted bool `json:"restricted"`
TFAEnabled bool `json:"tfa_enabled"`
SSHKeys []string `json:"ssh_keys"`
PasswordCreated *time.Time `json:"-"`
VerifiedPhoneNumber *string `json:"verified_phone_number"`
}
// UserCreateOptions fields are those accepted by CreateUser
type UserCreateOptions struct {
Username string `json:"username"`
Email string `json:"email"`
Restricted bool `json:"restricted"`
}
// UserUpdateOptions fields are those accepted by UpdateUser
type UserUpdateOptions struct {
Username string `json:"username,omitempty"`
Restricted *bool `json:"restricted,omitempty"`
Email string `json:"email,omitempty"`
}
// UnmarshalJSON implements the json.Unmarshaler interface
func (ll *LastLogin) UnmarshalJSON(b []byte) error {
type Mask LastLogin
p := struct {
*Mask
LoginDatetime *parseabletime.ParseableTime `json:"login_datetime"`
}{
Mask: (*Mask)(ll),
}
if err := json.Unmarshal(b, &p); err != nil {
return err
}
ll.LoginDatetime = (*time.Time)(p.LoginDatetime)
return nil
}
// UnmarshalJSON implements the json.Unmarshaler interface
func (i *User) UnmarshalJSON(b []byte) error {
type Mask User
p := struct {
*Mask
PasswordCreated *parseabletime.ParseableTime `json:"password_created"`
}{
Mask: (*Mask)(i),
}
if err := json.Unmarshal(b, &p); err != nil {
return err
}
i.PasswordCreated = (*time.Time)(p.PasswordCreated)
return nil
}
// GetCreateOptions converts a User to UserCreateOptions for use in CreateUser
func (i User) GetCreateOptions() (o UserCreateOptions) {
o.Username = i.Username
o.Email = i.Email
o.Restricted = i.Restricted
return
}
// GetUpdateOptions converts a User to UserUpdateOptions for use in UpdateUser
func (i User) GetUpdateOptions() (o UserUpdateOptions) {
o.Username = i.Username
o.Restricted = copyBool(&i.Restricted)
o.Email = i.Email
return
}
// ListUsers lists Users on the account
func (c *Client) ListUsers(ctx context.Context, opts *ListOptions) ([]User, error) {
return getPaginatedResults[User](ctx, c, "account/users", opts)
}
// GetUser gets the user with the provided ID
func (c *Client) GetUser(ctx context.Context, userID string) (*User, error) {
e := formatAPIPath("account/users/%s", userID)
return doGETRequest[User](ctx, c, e)
}
// CreateUser creates a User. The email address must be confirmed before the
// User account can be accessed.
func (c *Client) CreateUser(ctx context.Context, opts UserCreateOptions) (*User, error) {
return doPOSTRequest[User](ctx, c, "account/users", opts)
}
// UpdateUser updates the User with the specified id
func (c *Client) UpdateUser(ctx context.Context, userID string, opts UserUpdateOptions) (*User, error) {
e := formatAPIPath("account/users/%s", userID)
return doPUTRequest[User](ctx, c, e, opts)
}
// DeleteUser deletes the User with the specified id
func (c *Client) DeleteUser(ctx context.Context, userID string) error {
e := formatAPIPath("account/users/%s", userID)
return doDELETERequest(ctx, c, e)
}
|