Skip to content

Commit 553525a

Browse files
author
Mike Zorn
authored
feat: Expose more detail in dev server errors [FUN-701] (#522)
Expose more details about dev server errors like what thing wasn't found. Requested in #520.
1 parent 9cda470 commit 553525a

File tree

14 files changed

+54
-44
lines changed

14 files changed

+54
-44
lines changed

internal/dev_server/api/delete_flag_override.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
func (s server) DeleteFlagOverride(ctx context.Context, request DeleteFlagOverrideRequestObject) (DeleteFlagOverrideResponseObject, error) {
1212
err := model.DeleteOverride(ctx, request.ProjectKey, request.FlagKey)
1313
if err != nil {
14-
if errors.Is(err, model.ErrNotFound) {
14+
if errors.As(err, &model.ErrNotFound{}) {
1515
return DeleteFlagOverride404Response{}, nil
1616
}
1717
return nil, err

internal/dev_server/api/post_add_project.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ func (s server) PostAddProject(ctx context.Context, request PostAddProjectReques
2121
store := model.StoreFromContext(ctx)
2222
project, err := model.CreateProject(ctx, request.ProjectKey, request.Body.SourceEnvironmentKey, request.Body.Context)
2323
switch {
24-
case errors.Is(err, model.ErrAlreadyExists):
24+
case errors.As(err, &model.ErrAlreadyExists{}):
2525
return PostAddProject409JSONResponse{
2626
Code: "conflict",
27-
Message: "project already exists",
27+
Message: err.Error(),
2828
}, nil
2929
case err != nil:
3030
return nil, err

internal/dev_server/api/put_override_flag.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ func (s server) PutOverrideFlag(ctx context.Context, request PutOverrideFlagRequ
1414
}
1515
override, err := model.UpsertOverride(ctx, request.ProjectKey, request.FlagKey, *request.Body)
1616
if err != nil {
17-
if errors.As(err, &model.Error{}) {
17+
if errors.As(err, &model.ErrNotFound{}) {
1818
return PutOverrideFlag400JSONResponse{
1919
ErrorResponseJSONResponse{
2020
Code: "invalid_request",

internal/dev_server/db/sqlite.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ func (s *Sqlite) GetDevProject(ctx context.Context, key string) (*model.Project,
5454

5555
if err := row.Scan(&project.Key, &project.SourceEnvironmentKey, &contextData, &project.LastSyncTime, &flagStateData); err != nil {
5656
if errors.Is(err, sql.ErrNoRows) {
57-
return nil, errors.Wrapf(model.ErrNotFound, "no project found with key, '%s'", key)
57+
return nil, model.NewErrNotFound("project", key)
5858
}
5959
return nil, err
6060
}
@@ -181,7 +181,7 @@ SELECT 1 FROM projects WHERE key = ?
181181
return
182182
}
183183
if projects.Next() {
184-
err = model.ErrAlreadyExists
184+
err = model.NewErrAlreadyExists("project", project.Key)
185185
return
186186
}
187187
err = projects.Close()
@@ -343,7 +343,7 @@ func (s *Sqlite) DeactivateOverride(ctx context.Context, projectKey, flagKey str
343343
var version int
344344
if err := row.Scan(&version); err != nil {
345345
if errors.Is(err, sql.ErrNoRows) {
346-
return 0, errors.Wrapf(model.ErrNotFound, "no override found for flag with key, '%s', in project with key, '%s'", projectKey, flagKey)
346+
return 0, errors.Wrapf(model.NewErrNotFound("flag", flagKey), "no override in project %s", projectKey)
347347
}
348348
return 0, err
349349
}

internal/dev_server/db/sqlite_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ func TestDBFunctions(t *testing.T) {
103103

104104
t.Run("InsertProject returns ErrAlreadyExists if the project already exists", func(t *testing.T) {
105105
err := store.InsertProject(ctx, projects[0])
106-
assert.Equal(t, model.ErrAlreadyExists, err)
106+
assert.ErrorAs(t, err, &model.ErrAlreadyExists{})
107107
})
108108

109109
t.Run("GetDevProjectKeys returns keys in projects", func(t *testing.T) {
@@ -120,7 +120,7 @@ func TestDBFunctions(t *testing.T) {
120120
t.Run("GetDevProject returns ErrNotFound for fake project keys", func(t *testing.T) {
121121
p, err := store.GetDevProject(ctx, "THIS-DOES-NOT-EXIST")
122122
assert.Nil(t, p)
123-
assert.ErrorIs(t, err, model.ErrNotFound)
123+
assert.ErrorAs(t, err, &model.ErrNotFound{})
124124
})
125125

126126
t.Run("GetDevProject returns project", func(t *testing.T) {
@@ -303,7 +303,7 @@ func TestDBFunctions(t *testing.T) {
303303

304304
t.Run("DeactivateOverride returns error when override not found", func(t *testing.T) {
305305
_, err := store.DeactivateOverride(ctx, projects[0].Key, "nope")
306-
assert.ErrorIs(t, err, model.ErrNotFound)
306+
assert.ErrorAs(t, err, &model.ErrNotFound{})
307307
})
308308

309309
t.Run("DeactivateOverride sets the override inactive and returns the current version", func(t *testing.T) {
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package model
2+
3+
import "fmt"
4+
5+
type ErrAlreadyExists struct {
6+
kind string
7+
key string
8+
}
9+
10+
func (e ErrAlreadyExists) Error() string {
11+
return fmt.Sprintf("%s %s already exists", e.kind, e.key)
12+
}
13+
14+
func NewErrAlreadyExists(kind, key string) ErrAlreadyExists {
15+
return ErrAlreadyExists{
16+
kind: kind,
17+
key: key,
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package model
2+
3+
import "fmt"
4+
5+
type ErrNotFound struct {
6+
kind string
7+
key string
8+
}
9+
10+
func (e ErrNotFound) Error() string {
11+
return fmt.Sprintf("%s %s not found", e.kind, e.key)
12+
}
13+
14+
func NewErrNotFound(kind, key string) ErrNotFound {
15+
return ErrNotFound{
16+
kind: kind,
17+
key: key,
18+
}
19+
}

internal/dev_server/model/error.go

Lines changed: 0 additions & 23 deletions
This file was deleted.

internal/dev_server/model/override.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func getFlagStateForFlagAndProject(ctx context.Context, projectKey, flagKey stri
3333
}
3434
}
3535
if !flagExists {
36-
return FlagState{}, ErrNotFound
36+
return FlagState{}, NewErrNotFound("flag", flagKey)
3737
}
3838
return project.AllFlagsState[flagKey], nil
3939
}

internal/dev_server/model/override_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func TestUpsertOverride(t *testing.T) {
5858

5959
_, err := model.UpsertOverride(ctx, projKey, flagKey, ldValue)
6060
assert.Error(t, err)
61-
assert.ErrorIs(t, model.ErrNotFound, err)
61+
assert.ErrorAs(t, err, &model.ErrNotFound{})
6262
})
6363

6464
t.Run("store fails to upsert, returns error", func(t *testing.T) {

0 commit comments

Comments
 (0)