palauth-iam-go/client.go

90 lines
1.9 KiB
Go

package palauthiam
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"strings"
)
type PalAuthIAMClient struct {
clientId string
clientSecret string
baseURL string
}
func InitClient(clientId, clientSecret string) *PalAuthIAMClient {
return &PalAuthIAMClient{
clientId: clientId,
clientSecret: clientSecret,
baseURL: "https://auth.palk.me/iam",
}
}
func (c *PalAuthIAMClient) SetBaseURL(baseURL string) {
c.baseURL = baseURL
}
func mapToQuery(variables map[string]string) (output string) {
for key, value := range variables {
output += fmt.Sprintf("%s=%s&", key, value)
}
if len(variables) != 0 {
output = strings.TrimSuffix(output, "&")
}
return output
}
func (c *PalAuthIAMClient) buildURL(path string, query map[string]string) string {
return fmt.Sprintf("%s/%s%s?%s", c.baseURL, c.clientId, path, mapToQuery(query))
}
func (c *PalAuthIAMClient) runRequest(req *http.Request, mapTo interface{}) error {
req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", c.clientSecret))
res, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("making request: %s", err)
}
resBody, err := io.ReadAll(res.Body)
if err != nil {
return fmt.Errorf("read response body: %s", err)
}
if res.StatusCode >= 200 && res.StatusCode < 300 {
err = json.Unmarshal(resBody, mapTo)
if err != nil {
return fmt.Errorf("decode JSON response: %s", err)
}
} else if res.StatusCode >= 400 && res.StatusCode < 500 {
return &IAMError{
ServerMessage: string(resBody),
}
}
return nil
}
func (c *PalAuthIAMClient) getRequest(
ctx context.Context,
path string,
variables map[string]string,
mapTo interface{},
) error {
req, err := http.NewRequestWithContext(
ctx,
http.MethodGet,
c.buildURL(path, variables),
http.NoBody,
)
if err != nil {
return fmt.Errorf("construct request: %s", err)
}
return c.runRequest(req, mapTo)
}