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
|
package govultr
import (
"context"
"fmt"
"net/http"
"github.com/google/go-querystring/query"
)
const path = "/v2/users"
// UserService is the interface to interact with the user management endpoints on the Vultr API
// Link : https://www.vultr.com/api/#tag/users
type UserService interface {
Create(ctx context.Context, userCreate *UserReq) (*User, error)
Get(ctx context.Context, userID string) (*User, error)
Update(ctx context.Context, userID string, userReq *UserReq) error
Delete(ctx context.Context, userID string) error
List(ctx context.Context, options *ListOptions) ([]User, *Meta, error)
}
var _ UserService = &UserServiceHandler{}
// UserServiceHandler handles interaction with the user methods for the Vultr API
type UserServiceHandler struct {
client *Client
}
// User represents an user on Vultr
type User struct {
ID string `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
APIEnabled *bool `json:"api_enabled"`
APIKey string `json:"api_key,omitempty"`
ACL []string `json:"acls,omitempty"`
}
// UserReq is the user struct for create and update calls
type UserReq struct {
Email string `json:"email,omitempty"`
Name string `json:"name,omitempty"`
APIEnabled *bool `json:"api_enabled,omitempty"`
ACL []string `json:"acls,omitempty"`
Password string `json:"password,omitempty"`
}
type usersBase struct {
Users []User `json:"users"`
Meta *Meta `json:"meta"`
}
type userBase struct {
User *User `json:"user"`
}
// Create will add the specified user to your Vultr account
func (u *UserServiceHandler) Create(ctx context.Context, userCreate *UserReq) (*User, error) {
req, err := u.client.NewRequest(ctx, http.MethodPost, path, userCreate)
if err != nil {
return nil, err
}
user := new(userBase)
if err = u.client.DoWithContext(ctx, req, user); err != nil {
return nil, err
}
return user.User, nil
}
// Get will retrieve a specific user account
func (u *UserServiceHandler) Get(ctx context.Context, userID string) (*User, error) {
uri := fmt.Sprintf("%s/%s", path, userID)
req, err := u.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, err
}
user := new(userBase)
if err = u.client.DoWithContext(ctx, req, user); err != nil {
return nil, err
}
return user.User, nil
}
// Update will update the given user. Empty strings will be ignored.
func (u *UserServiceHandler) Update(ctx context.Context, userID string, userReq *UserReq) error {
uri := fmt.Sprintf("%s/%s", path, userID)
req, err := u.client.NewRequest(ctx, http.MethodPatch, uri, userReq)
if err != nil {
return err
}
return u.client.DoWithContext(ctx, req, nil)
}
// Delete will remove the specified user from your Vultr account
func (u *UserServiceHandler) Delete(ctx context.Context, userID string) error {
uri := fmt.Sprintf("%s/%s", path, userID)
req, err := u.client.NewRequest(ctx, http.MethodDelete, uri, nil)
if err != nil {
return err
}
return u.client.DoWithContext(ctx, req, nil)
}
// List will list all the users associated with your Vultr account
func (u *UserServiceHandler) List(ctx context.Context, options *ListOptions) ([]User, *Meta, error) {
req, err := u.client.NewRequest(ctx, http.MethodGet, path, nil)
if err != nil {
return nil, nil, err
}
newValues, err := query.Values(options)
if err != nil {
return nil, nil, err
}
req.URL.RawQuery = newValues.Encode()
users := new(usersBase)
if err = u.client.DoWithContext(ctx, req, &users); err != nil {
return nil, nil, err
}
return users.Users, users.Meta, nil
}
|