mirror of
https://github.com/bestnite/go-igdb.git
synced 2025-04-20 05:25:53 +08:00
104 lines
2.6 KiB
Go
104 lines
2.6 KiB
Go
package endpoint
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
type Webhooks struct {
|
|
request RequestFunc
|
|
}
|
|
|
|
func NewWebhooks(request RequestFunc) *Webhooks {
|
|
return &Webhooks{
|
|
request: request,
|
|
}
|
|
}
|
|
|
|
type WebhookMethod string
|
|
|
|
const (
|
|
WebhookMethodUpdate WebhookMethod = "update"
|
|
WebhookMethodDelete WebhookMethod = "delete"
|
|
WebhookMethodCreate WebhookMethod = "create"
|
|
)
|
|
|
|
type WebhookResponse struct {
|
|
Id uint64 `json:"id"`
|
|
Url string `json:"url"`
|
|
Category uint64 `json:"category"`
|
|
SubCategory uint64 `json:"sub_category"`
|
|
Active bool `json:"active"`
|
|
ApiKey string `json:"api_key"`
|
|
Secret string `json:"secret"`
|
|
CreatedAt string `json:"created_at"`
|
|
UpdatedAt string `json:"updated_at"`
|
|
}
|
|
|
|
func (a *Webhooks) Register(endpoint Name, secret, callbackUrl string, method WebhookMethod) (*WebhookResponse, error) {
|
|
dataBody := url.Values{}
|
|
dataBody.Set("url", callbackUrl)
|
|
dataBody.Set("secret", secret)
|
|
dataBody.Set("method", string(method))
|
|
|
|
resp, err := a.request("POST", fmt.Sprintf("https://api.igdb.com/v4/%s/webhooks/", endpoint), dataBody.Encode())
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to make request: %s: %w", callbackUrl, err)
|
|
}
|
|
|
|
if resp.StatusCode() == http.StatusOK {
|
|
return nil, nil
|
|
}
|
|
|
|
var data WebhookResponse
|
|
if err = json.Unmarshal(resp.Body(), &data); err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal: %w", err)
|
|
}
|
|
|
|
return &data, fmt.Errorf("failed to activate webhook: %s: %s", callbackUrl, resp.String())
|
|
}
|
|
|
|
func (a *Webhooks) Unregister(webhookId uint64) error {
|
|
resp, err := a.request("DELETE", fmt.Sprintf("https://api.igdb.com/v4/webhooks/%v", webhookId), "")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to make request: %w", err)
|
|
}
|
|
|
|
if resp.StatusCode() == http.StatusOK {
|
|
return nil
|
|
}
|
|
|
|
return fmt.Errorf("failed to unregister webhook: %s", resp.String())
|
|
}
|
|
|
|
func (a *Webhooks) List() ([]*WebhookResponse, error) {
|
|
resp, err := a.request("GET", "https://api.igdb.com/v4/webhooks/", "")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to make request: %w", err)
|
|
}
|
|
|
|
var data []*WebhookResponse
|
|
if err = json.Unmarshal(resp.Body(), &data); err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal: %w", err)
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
func (a *Webhooks) Get(webhookId uint64) (*WebhookResponse, error) {
|
|
resp, err := a.request("GET", fmt.Sprintf("https://api.igdb.com/v4/webhooks/%v", webhookId), "")
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to make request: %w", err)
|
|
}
|
|
|
|
var data WebhookResponse
|
|
if err = json.Unmarshal(resp.Body(), &data); err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal: %w", err)
|
|
}
|
|
|
|
return &data, nil
|
|
}
|