File: contactGroups.go

package info (click to toggle)
golang-github-dreamitgetit-statuscake 0.0~git20220607.de57c59-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid, trixie
  • size: 308 kB
  • sloc: makefile: 19
file content (149 lines) | stat: -rw-r--r-- 4,044 bytes parent folder | download
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
141
142
143
144
145
146
147
148
149
package statuscake

import (
	"encoding/json"
	"fmt"
	"net/url"
	"strings"

	"github.com/google/go-querystring/query"
)

//ContactGroup represent the data received by the API with GET
type ContactGroup struct {
	GroupName    string   `json:"GroupName"    url:"GroupName,omitempty"`
	Emails       []string `json:"Emails"`
	EmailsPut    string   `url:"Email,omitempty"`
	Mobiles      string   `json:"Mobiles"      url:"Mobile,omitempty"`
	Boxcar       string   `json:"Boxcar"       url:"Boxcar,omitempty"`
	Pushover     string   `json:"Pushover"     url:"Pushover,omitempty"`
	ContactID    int      `json:"ContactID"    url:"ContactID,omitempty"`
	DesktopAlert string   `json:"DesktopAlert" url:"DesktopAlert,omitempty"`
	PingURL      string   `json:"PingURL"      url:"PingURL,omitempty"`
}

//Response represent the data received from the API
type Response struct {
	Success  bool   `json:"Success"`
	Message  string `json:"Message"`
	InsertID int    `json:"InsertID"`
}

//ContactGroups represent the actions done with the API
type ContactGroups interface {
	All() ([]*ContactGroup, error)
	Detail(int) (*ContactGroup, error)
	Update(*ContactGroup) (*ContactGroup, error)
	Delete(int) error
	Create(*ContactGroup) (*ContactGroup, error)
}

func findContactGroup(responses []*ContactGroup, id int) (*ContactGroup, error) {
	var response *ContactGroup
	for _, elem := range responses {
		if (*elem).ContactID == id {
			return elem, nil
		}
	}
	return response, fmt.Errorf("%d Not found", id)
}

type contactGroups struct {
	client apiClient
}

//NewContactGroups return a new ssls
func NewContactGroups(c apiClient) ContactGroups {
	return &contactGroups{
		client: c,
	}
}

//All return a list of all the ContactGroup from the API
func (tt *contactGroups) All() ([]*ContactGroup, error) {
	rawResponse, err := tt.client.get("/ContactGroups", nil)
	if err != nil {
		return nil, fmt.Errorf("Error getting StatusCake contactGroups: %s", err.Error())
	}
	var getResponse []*ContactGroup
	err = json.NewDecoder(rawResponse.Body).Decode(&getResponse)
	if err != nil {
		return nil, err
	}
	return getResponse, err
}

//Detail return the ContactGroup corresponding to the id
func (tt *contactGroups) Detail(id int) (*ContactGroup, error) {
	responses, err := tt.All()
	if err != nil {
		return nil, err
	}
	myContactGroup, errF := findContactGroup(responses, id)
	if errF != nil {
		return nil, errF
	}
	return myContactGroup, nil
}

//Update update the API with cg and create one if cg.ContactID=0 then return the corresponding ContactGroup
func (tt *contactGroups) Update(cg *ContactGroup) (*ContactGroup, error) {

	if cg.ContactID == 0 {
		return tt.Create(cg)
	}
	cg.EmailsPut = strings.Join(cg.Emails, ",")
	var v url.Values

	v, _ = query.Values(*cg)

	rawResponse, err := tt.client.put("/ContactGroups/Update", v)
	if err != nil {
		return nil, fmt.Errorf("Error creating StatusCake ContactGroup: %s", err.Error())
	}

	var response Response
	err = json.NewDecoder(rawResponse.Body).Decode(&response)
	if err != nil {
		return nil, err
	}

	if !response.Success {
		return nil, fmt.Errorf("%s", response.Message)
	}

	return cg, nil
}

//Delete delete the ContactGroup which ID is id
func (tt *contactGroups) Delete(id int) error {
	_, err := tt.client.delete("/ContactGroups/Update", url.Values{"ContactID": {fmt.Sprint(id)}})
	return err
}

//CreatePartial create the ContactGroup with the data in cg and return the ContactGroup created
func (tt *contactGroups) Create(cg *ContactGroup) (*ContactGroup, error) {
	cg.ContactID = 0
	cg.EmailsPut = strings.Join(cg.Emails, ",")
	var v url.Values
	v, _ = query.Values(*cg)

	rawResponse, err := tt.client.put("/ContactGroups/Update", v)
	if err != nil {
		return nil, fmt.Errorf("Error creating StatusCake ContactGroup: %s", err.Error())
	}

	var response Response
	err = json.NewDecoder(rawResponse.Body).Decode(&response)
	if err != nil {
		return nil, err
	}

	if !response.Success {
		return nil, fmt.Errorf("%s", response.Message)
	}

	cg.ContactID = response.InsertID

	return cg, nil
}