Skip to content

Commit

Permalink
Return checkeable error for missing items.
Browse files Browse the repository at this point in the history
  • Loading branch information
ernestoalejo committed Dec 18, 2023
1 parent b4242fe commit b0772e3
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 5 deletions.
19 changes: 14 additions & 5 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"log/slog"
Expand Down Expand Up @@ -80,7 +81,10 @@ func (client *Client) do(req *http.Request, dest interface{}) error {
}

if resp.StatusCode != http.StatusOK {
return fmt.Errorf("directus: unexpected status code %v for url %q", resp.StatusCode, req.URL.String())
return &unexpectedStatusError{
status: resp.StatusCode,
url: req.URL,
}
}

if dest != nil {
Expand Down Expand Up @@ -117,14 +121,15 @@ func WithFields(fields ...string) ReadOption {
}

func (items *ItemsClient[T]) itemsdo(ctx context.Context, method, url string, request, reply any) error {
var buf *bytes.Buffer
var body io.Reader
if request != nil {
buf = bytes.NewBuffer(nil)
if err := json.NewEncoder(buf).Encode(request); err != nil {
var buf bytes.Buffer
if err := json.NewEncoder(&buf).Encode(request); err != nil {
return fmt.Errorf("directus: cannot encode request: %v", err)
}
body = &buf
}
req, err := http.NewRequestWithContext(ctx, method, url, buf)
req, err := http.NewRequestWithContext(ctx, method, url, body)
if err != nil {
return fmt.Errorf("directus: cannot prepare request: %v", err)
}
Expand All @@ -149,6 +154,10 @@ func (items *ItemsClient[T]) Get(ctx context.Context, id string) (*T, error) {
Data *T `json:"data"`
}{}
if err := items.itemsdo(ctx, http.MethodGet, items.c.urlf("/items/%s/%s", items.collection, id), nil, &reply); err != nil {
var e *unexpectedStatusError
if errors.As(err, &e) && e.status == http.StatusForbidden {
return nil, fmt.Errorf("%w: %v", ErrItemNotFound, id)
}
return nil, err
}
return reply.Data, nil
Expand Down
7 changes: 7 additions & 0 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ func TestItemsGetFields(t *testing.T) {
fmt.Printf("%#v\n", regime)
}

func TestItemsGetNotFound(t *testing.T) {
items := NewItemsClient[Regime](initClient(t), "regimes")
regime, err := items.Get(context.Background(), "foo")
require.Nil(t, regime)
require.EqualError(t, err, "directus: item not found: foo")
}

func TestItemsCreate(t *testing.T) {
items := NewItemsClient[Regime](initClient(t), "regimes")
regime, err := items.Create(context.Background(), &Regime{
Expand Down
20 changes: 20 additions & 0 deletions errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package directus

import (
"errors"
"fmt"
"net/url"
)

var (
ErrItemNotFound = errors.New("directus: item not found")
)

type unexpectedStatusError struct {
status int
url *url.URL
}

func (e *unexpectedStatusError) Error() string {
return fmt.Sprintf("directus: unexpected status code %v for url %q", e.status, e.url.String())
}

0 comments on commit b0772e3

Please sign in to comment.