160 lines
3.7 KiB
Go
160 lines
3.7 KiB
Go
|
// Copyright 2016 Circonus, Inc. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// User API support - Fetch, Update, and Search
|
||
|
// See: https://login.circonus.com/resources/api/calls/user
|
||
|
// Note: Create and Delete are not supported directly via the User API
|
||
|
// endpoint. See the Account endpoint for inviting and removing users
|
||
|
// from specific accounts.
|
||
|
|
||
|
package api
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
"regexp"
|
||
|
|
||
|
"github.com/circonus-labs/circonus-gometrics/api/config"
|
||
|
)
|
||
|
|
||
|
// UserContactInfo defines known contact details
|
||
|
type UserContactInfo struct {
|
||
|
SMS string `json:"sms,omitempty"` // string
|
||
|
XMPP string `json:"xmpp,omitempty"` // string
|
||
|
}
|
||
|
|
||
|
// User defines a user. See https://login.circonus.com/resources/api/calls/user for more information.
|
||
|
type User struct {
|
||
|
CID string `json:"_cid,omitempty"` // string
|
||
|
ContactInfo UserContactInfo `json:"contact_info,omitempty"` // UserContactInfo
|
||
|
Email string `json:"email"` // string
|
||
|
Firstname string `json:"firstname"` // string
|
||
|
Lastname string `json:"lastname"` // string
|
||
|
}
|
||
|
|
||
|
// FetchUser retrieves user with passed cid. Pass nil for '/user/current'.
|
||
|
func (a *API) FetchUser(cid CIDType) (*User, error) {
|
||
|
var userCID string
|
||
|
|
||
|
if cid == nil || *cid == "" {
|
||
|
userCID = config.UserPrefix + "/current"
|
||
|
} else {
|
||
|
userCID = string(*cid)
|
||
|
}
|
||
|
|
||
|
matched, err := regexp.MatchString(config.UserCIDRegex, userCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if !matched {
|
||
|
return nil, fmt.Errorf("Invalid user CID [%s]", userCID)
|
||
|
}
|
||
|
|
||
|
result, err := a.Get(userCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if a.Debug {
|
||
|
a.Log.Printf("[DEBUG] fetch user, received JSON: %s", string(result))
|
||
|
}
|
||
|
|
||
|
user := new(User)
|
||
|
if err := json.Unmarshal(result, user); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return user, nil
|
||
|
}
|
||
|
|
||
|
// FetchUsers retrieves all users available to API Token.
|
||
|
func (a *API) FetchUsers() (*[]User, error) {
|
||
|
result, err := a.Get(config.UserPrefix)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var users []User
|
||
|
if err := json.Unmarshal(result, &users); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &users, nil
|
||
|
}
|
||
|
|
||
|
// UpdateUser updates passed user.
|
||
|
func (a *API) UpdateUser(cfg *User) (*User, error) {
|
||
|
if cfg == nil {
|
||
|
return nil, fmt.Errorf("Invalid user config [nil]")
|
||
|
}
|
||
|
|
||
|
userCID := string(cfg.CID)
|
||
|
|
||
|
matched, err := regexp.MatchString(config.UserCIDRegex, userCID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
if !matched {
|
||
|
return nil, fmt.Errorf("Invalid user CID [%s]", userCID)
|
||
|
}
|
||
|
|
||
|
jsonCfg, err := json.Marshal(cfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if a.Debug {
|
||
|
a.Log.Printf("[DEBUG] update user, sending JSON: %s", string(jsonCfg))
|
||
|
}
|
||
|
|
||
|
result, err := a.Put(userCID, jsonCfg)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
user := &User{}
|
||
|
if err := json.Unmarshal(result, user); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return user, nil
|
||
|
}
|
||
|
|
||
|
// SearchUsers returns users matching a filter (search queries
|
||
|
// are not suppoted by the user endpoint). Pass nil as filter for all
|
||
|
// users available to the API Token.
|
||
|
func (a *API) SearchUsers(filterCriteria *SearchFilterType) (*[]User, error) {
|
||
|
q := url.Values{}
|
||
|
|
||
|
if filterCriteria != nil && len(*filterCriteria) > 0 {
|
||
|
for filter, criteria := range *filterCriteria {
|
||
|
for _, val := range criteria {
|
||
|
q.Add(filter, val)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if q.Encode() == "" {
|
||
|
return a.FetchUsers()
|
||
|
}
|
||
|
|
||
|
reqURL := url.URL{
|
||
|
Path: config.UserPrefix,
|
||
|
RawQuery: q.Encode(),
|
||
|
}
|
||
|
|
||
|
result, err := a.Get(reqURL.String())
|
||
|
if err != nil {
|
||
|
return nil, fmt.Errorf("[ERROR] API call error %+v", err)
|
||
|
}
|
||
|
|
||
|
var users []User
|
||
|
if err := json.Unmarshal(result, &users); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return &users, nil
|
||
|
}
|