diff options
| author | DJ O'Leary <dijitol@proton.me> | 2026-09-07 03:13:01 +0200 |
|---|---|---|
| committer | DJ O'Leary <dijitol@proton.me> | 2026-09-07 03:13:01 +0200 |
| commit | 2f61b07aea82fa0f5b98686bdfeba2e297c7b21b (patch) | |
| tree | b55f588e935b11decd782e7bd0a6c98f060e1654 /src/cardmarket/http.go | |
| parent | 5d3efcc64fc9664e061b44659f85aeec03a56685 (diff) | |
Diffstat (limited to 'src/cardmarket/http.go')
| -rw-r--r-- | src/cardmarket/http.go | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/src/cardmarket/http.go b/src/cardmarket/http.go index 4789fdf..010f884 100644 --- a/src/cardmarket/http.go +++ b/src/cardmarket/http.go @@ -3,13 +3,85 @@ package cardmarket import ( "context" "encoding/json" + "errors" "io" "log/slog" + "strings" ) -func (c *ApiClient) get(ctx context.Context, endpoint string, respBody any) error { +func (c *ApiClient) Get( + ctx context.Context, + endpoint string, + params map[string]string, + respBody any, +) error { + url := c.baseURL + endpoint + + slog.DebugContext(ctx, "building query param string...") + parts := make([]string, len(params)) + i := 0 + for k, v := range params { + parts[i] = k + "=" + v + i++ + } + query := strings.Join(parts, "&") + if query != "" { + url += "?" + query + } + slog.DebugContext(ctx, "built query param string") + + slog.DebugContext(ctx, "requesting entity info...") + resp, err := c.httpClient.GetWithContext(ctx, url) + if err != nil { + slog.DebugContext(ctx, "failed to get entity from API") + return err + } + slog.DebugContext(ctx, "received entity info") + + slog.DebugContext(ctx, "reading body...") + respBodyBuf, err := io.ReadAll(resp.Body) + if err != nil { + slog.DebugContext(ctx, "failed to read body") + return err + } + defer resp.Body.Close() + slog.DebugContext(ctx, "read body") + + slog.DebugContext(ctx, "parsing body...", "respBodyBuf", string(respBodyBuf)) + if err = json.Unmarshal(respBodyBuf, respBody); err != nil { + slog.DebugContext(ctx, "failed to unmarshal body: "+string(respBodyBuf)) + return err + } + slog.DebugContext(ctx, "parsed body") + + return nil +} + +func (c *ApiClient) Put( + ctx context.Context, + endpoint string, + params map[string]string, + contentType string, + reqBody io.Reader, + respBody any, +) error { + url := c.baseURL + endpoint + + slog.DebugContext(ctx, "building query param string...") + parts := make([]string, len(params)) + i := 0 + for k, v := range params { + parts[i] = k + "=" + v + i++ + } + query := strings.Join(parts, "&") + if query != "" { + url += "?" + query + } + slog.DebugContext(ctx, "built query param string") + slog.DebugContext(ctx, "requesting entity info...") - resp, err := c.httpClient.GetWithContext(ctx, c.baseURL+endpoint) + resp, err := c.httpClient.PutWithContext(ctx, url, contentType, reqBody) if err != nil { slog.DebugContext(ctx, "failed to get entity from API") return err @@ -25,6 +97,18 @@ func (c *ApiClient) get(ctx context.Context, endpoint string, respBody any) erro defer resp.Body.Close() slog.DebugContext(ctx, "read body") + if resp.StatusCode < 200 || resp.StatusCode > 299 { + msg := "status code outside of successful range - " + resp.Status + if len(respBodyBuf) > 0 { + msg += " body=" + string(respBodyBuf) + } + return errors.New(msg) + } + + if respBody == nil { + return nil + } + slog.DebugContext(ctx, "parsing body...", "respBodyBuf", string(respBodyBuf)) if err = json.Unmarshal(respBodyBuf, respBody); err != nil { slog.DebugContext(ctx, "failed to unmarshal body: "+string(respBodyBuf)) |
