diff --git a/main.go b/main.go index 2ac8b77b..a520065c 100644 --- a/main.go +++ b/main.go @@ -313,7 +313,8 @@ func makeWidget(app *tview.Application, pages *tview.Pages, widgetName string) w settings := weather.NewSettingsFromYAML(wtf.Config) widget = weather.NewWidget(app, pages, settings) case "zendesk": - widget = zendesk.NewWidget(app) + settings := zendesk.NewSettingsFromYAML(wtf.Config) + widget = zendesk.NewWidget(app, settings) default: widget = unknown.NewWidget(app, widgetName) } diff --git a/modules/zendesk/client.go b/modules/zendesk/client.go index e093a7e5..9bdbd564 100644 --- a/modules/zendesk/client.go +++ b/modules/zendesk/client.go @@ -6,9 +6,6 @@ import ( "io/ioutil" "log" "net/http" - "os" - - "github.com/wtfutil/wtf/wtf" ) type Resource struct { @@ -16,34 +13,20 @@ type Resource struct { Raw string } -func apiKey() string { - return wtf.Config.UString( - "wtf.mods.zendesk.apiKey", - os.Getenv("ZENDESK_API"), - ) -} - -func subdomain() string { - return wtf.Config.UString( - "wtf.mods.zendesk.subdomain", - os.Getenv("ZENDESK_SUBDOMAIN"), - ) -} - func errHandler(err error) { if err != nil { log.Print(err) } } -func api(key string, meth string, path string, params string) (*Resource, error) { +func (widget *Widget) api(meth string, path string, params string) (*Resource, error) { trn := &http.Transport{} client := &http.Client{ Transport: trn, } - baseURL := fmt.Sprintf("https://%v.zendesk.com/api/v2", subdomain()) + baseURL := fmt.Sprintf("https://%v.zendesk.com/api/v2", widget.settings.subdomain) URL := baseURL + "/tickets.json?sort_by=status" req, err := http.NewRequest(meth, URL, bytes.NewBufferString(params)) @@ -53,9 +36,8 @@ func api(key string, meth string, path string, params string) (*Resource, error) req.Header.Add("Content-Type", "application/json") - username := wtf.Config.UString("wtf.mods.zendesk.username") - apiUser := fmt.Sprintf("%v/token", username) - req.SetBasicAuth(apiUser, key) + apiUser := fmt.Sprintf("%v/token", widget.settings.username) + req.SetBasicAuth(apiUser, widget.settings.apiKey) resp, err := client.Do(req) if err != nil { @@ -70,5 +52,4 @@ func api(key string, meth string, path string, params string) (*Resource, error) } return &Resource{Response: &resp, Raw: string(data)}, nil - } diff --git a/modules/zendesk/settings.go b/modules/zendesk/settings.go new file mode 100644 index 00000000..9bc1a407 --- /dev/null +++ b/modules/zendesk/settings.go @@ -0,0 +1,32 @@ +package zendesk + +import ( + "os" + + "github.com/olebedev/config" + "github.com/wtfutil/wtf/cfg" +) + +type Settings struct { + common *cfg.Common + + apiKey string + status string + subdomain string + username string +} + +func NewSettingsFromYAML(ymlConfig *config.Config) *Settings { + localConfig, _ := ymlConfig.Get("wtf.mods.zendesk") + + settings := Settings{ + common: cfg.NewCommonSettingsFromYAML(ymlConfig), + + apiKey: localConfig.UString("apiKey", os.Getenv("ZENDESK_API")), + status: localConfig.UString("status"), + subdomain: localConfig.UString("subdomain", os.Getenv("ZENDESK_SUBDOMAIN")), + username: localConfig.UString("username"), + } + + return &settings +} diff --git a/modules/zendesk/tickets.go b/modules/zendesk/tickets.go index a5ba7575..6bc3bbfa 100644 --- a/modules/zendesk/tickets.go +++ b/modules/zendesk/tickets.go @@ -45,7 +45,7 @@ type Ticket struct { Fields interface{} `json:"fields"` } -func listTickets(pag ...string) (*TicketArray, error) { +func (widget *Widget) listTickets(pag ...string) (*TicketArray, error) { TicketStruct := &TicketArray{} @@ -55,7 +55,7 @@ func listTickets(pag ...string) (*TicketArray, error) { } else { path = pag[0] } - resource, err := api(apiKey(), "GET", path, "") + resource, err := widget.api("GET", path, "") if err != nil { return nil, err } @@ -66,14 +66,14 @@ func listTickets(pag ...string) (*TicketArray, error) { } -func newTickets(ticketStatus string) (*TicketArray, error) { +func (widget *Widget) newTickets() (*TicketArray, error) { newTicketArray := &TicketArray{} - tickets, err := listTickets() + tickets, err := widget.listTickets(widget.settings.apiKey) if err != nil { log.Fatal(err) } for _, Ticket := range tickets.Tickets { - if Ticket.Status == ticketStatus && Ticket.Status != "closed" && Ticket.Status != "solved" { + if Ticket.Status == widget.settings.status && Ticket.Status != "closed" && Ticket.Status != "solved" { newTicketArray.Tickets = append(newTicketArray.Tickets, Ticket) } } diff --git a/modules/zendesk/widget.go b/modules/zendesk/widget.go index 153a954f..eb00b0c6 100644 --- a/modules/zendesk/widget.go +++ b/modules/zendesk/widget.go @@ -14,11 +14,14 @@ type Widget struct { result *TicketArray selected int + settings *Settings } -func NewWidget(app *tview.Application) *Widget { +func NewWidget(app *tview.Application, settings *Settings) *Widget { widget := Widget{ TextWidget: wtf.NewTextWidget(app, "Zendesk", "zendesk", true), + + settings: settings, } widget.View.SetInputCapture(widget.keyboardIntercept) @@ -28,8 +31,7 @@ func NewWidget(app *tview.Application) *Widget { /* -------------------- Exported Functions -------------------- */ func (widget *Widget) Refresh() { - ticketStatus := wtf.Config.UString("wtf.mods.zendesk.status") - ticketArray, err := newTickets(ticketStatus) + ticketArray, err := widget.newTickets() ticketArray.Count = len(ticketArray.Tickets) if err != nil { log.Fatal(err) @@ -102,7 +104,7 @@ func (widget *Widget) openTicket() { sel := widget.selected if sel >= 0 && widget.result != nil && sel < len(widget.result.Tickets) { issue := &widget.result.Tickets[widget.selected] - ticketUrl := fmt.Sprintf("https://%s.zendesk.com/agent/tickets/%d", subdomain(), issue.Id) + ticketUrl := fmt.Sprintf("https://%s.zendesk.com/agent/tickets/%d", widget.settings.subdomain, issue.Id) wtf.OpenFile(ticketUrl) } }