1package pagerduty
2
3import (
4	"bytes"
5	"encoding/json"
6	"fmt"
7	"net/http"
8)
9
10const eventEndPoint = "https://events.pagerduty.com/generic/2010-04-15/create_event.json"
11
12// Event stores data for problem reporting, acknowledgement, and resolution.
13type Event struct {
14	ServiceKey  string        `json:"service_key"`
15	Type        string        `json:"event_type"`
16	IncidentKey string        `json:"incident_key,omitempty"`
17	Description string        `json:"description"`
18	Client      string        `json:"client,omitempty"`
19	ClientURL   string        `json:"client_url,omitempty"`
20	Details     interface{}   `json:"details,omitempty"`
21	Contexts    []interface{} `json:"contexts,omitempty"`
22}
23
24// EventResponse is the data returned from the CreateEvent API endpoint.
25type EventResponse struct {
26	Status      string `json:"status"`
27	Message     string `json:"message"`
28	IncidentKey string `json:"incident_key"`
29}
30
31// CreateEvent sends PagerDuty an event to trigger, acknowledge, or resolve a
32// problem. If you need to provide a custom HTTP client, please use
33// CreateEventWithHTTPClient.
34func CreateEvent(e Event) (*EventResponse, error) {
35	return CreateEventWithHTTPClient(e, defaultHTTPClient)
36}
37
38// CreateEventWithHTTPClient sends PagerDuty an event to trigger, acknowledge,
39// or resolve a problem. This function accepts a custom HTTP Client, if the
40// default one used by this package doesn't fit your needs. If you don't need a
41// custom HTTP client, please use CreateEvent instead.
42func CreateEventWithHTTPClient(e Event, client HTTPClient) (*EventResponse, error) {
43	data, err := json.Marshal(e)
44	if err != nil {
45		return nil, err
46	}
47	req, _ := http.NewRequest("POST", eventEndPoint, bytes.NewBuffer(data))
48	req.Header.Set("Content-Type", "application/json")
49	resp, err := client.Do(req)
50	if err != nil {
51		return nil, err
52	}
53	defer resp.Body.Close()
54	if resp.StatusCode != http.StatusOK {
55		return nil, fmt.Errorf("HTTP Status Code: %d", resp.StatusCode)
56	}
57	var eventResponse EventResponse
58	if err := json.NewDecoder(resp.Body).Decode(&eventResponse); err != nil {
59		return nil, err
60	}
61	return &eventResponse, nil
62}
63