1// Copyright 2016 Circonus, Inc. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Check API support - Fetch and Search
6// See: https://login.circonus.com/resources/api/calls/check
7// Notes: checks do not directly support create, update, and delete - see check bundle.
8
9package api
10
11import (
12	"encoding/json"
13	"fmt"
14	"net/url"
15	"regexp"
16
17	"github.com/circonus-labs/circonus-gometrics/api/config"
18)
19
20// CheckDetails contains [undocumented] check type specific information
21type CheckDetails map[config.Key]string
22
23// Check defines a check. See https://login.circonus.com/resources/api/calls/check for more information.
24type Check struct {
25	Active         bool         `json:"_active"`       // bool
26	BrokerCID      string       `json:"_broker"`       // string
27	CheckBundleCID string       `json:"_check_bundle"` // string
28	CheckUUID      string       `json:"_check_uuid"`   // string
29	CID            string       `json:"_cid"`          // string
30	Details        CheckDetails `json:"_details"`      // NOTE contents of details are check type specific, map len >= 0
31}
32
33// FetchCheck retrieves check with passed cid.
34func (a *API) FetchCheck(cid CIDType) (*Check, error) {
35	if cid == nil || *cid == "" {
36		return nil, fmt.Errorf("Invalid check CID [none]")
37	}
38
39	checkCID := string(*cid)
40
41	matched, err := regexp.MatchString(config.CheckCIDRegex, checkCID)
42	if err != nil {
43		return nil, err
44	}
45	if !matched {
46		return nil, fmt.Errorf("Invalid check CID [%s]", checkCID)
47	}
48
49	result, err := a.Get(checkCID)
50	if err != nil {
51		return nil, err
52	}
53
54	if a.Debug {
55		a.Log.Printf("[DEBUG] fetch check, received JSON: %s", string(result))
56	}
57
58	check := new(Check)
59	if err := json.Unmarshal(result, check); err != nil {
60		return nil, err
61	}
62
63	return check, nil
64}
65
66// FetchChecks retrieves all checks available to the API Token.
67func (a *API) FetchChecks() (*[]Check, error) {
68	result, err := a.Get(config.CheckPrefix)
69	if err != nil {
70		return nil, err
71	}
72
73	var checks []Check
74	if err := json.Unmarshal(result, &checks); err != nil {
75		return nil, err
76	}
77
78	return &checks, nil
79}
80
81// SearchChecks returns checks matching the specified search query
82// and/or filter. If nil is passed for both parameters all checks
83// will be returned.
84func (a *API) SearchChecks(searchCriteria *SearchQueryType, filterCriteria *SearchFilterType) (*[]Check, error) {
85	q := url.Values{}
86
87	if searchCriteria != nil && *searchCriteria != "" {
88		q.Set("search", string(*searchCriteria))
89	}
90
91	if filterCriteria != nil && len(*filterCriteria) > 0 {
92		for filter, criteria := range *filterCriteria {
93			for _, val := range criteria {
94				q.Add(filter, val)
95			}
96		}
97	}
98
99	if q.Encode() == "" {
100		return a.FetchChecks()
101	}
102
103	reqURL := url.URL{
104		Path:     config.CheckPrefix,
105		RawQuery: q.Encode(),
106	}
107
108	result, err := a.Get(reqURL.String())
109	if err != nil {
110		return nil, err
111	}
112
113	var checks []Check
114	if err := json.Unmarshal(result, &checks); err != nil {
115		return nil, err
116	}
117
118	return &checks, nil
119}
120