summaryrefslogtreecommitdiff
path: root/src/cardmarket/http.go
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2026-09-07 03:13:01 +0200
committerDJ O'Leary <dijitol@proton.me>2026-09-07 03:13:01 +0200
commit2f61b07aea82fa0f5b98686bdfeba2e297c7b21b (patch)
treeb55f588e935b11decd782e7bd0a6c98f060e1654 /src/cardmarket/http.go
parent5d3efcc64fc9664e061b44659f85aeec03a56685 (diff)
refactor(cardmarket): move handlers to own directoryHEADmain
Diffstat (limited to 'src/cardmarket/http.go')
-rw-r--r--src/cardmarket/http.go88
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))