Skip to content

Commit

Permalink
feat: return back the data just created via POST method in manager API (
Browse files Browse the repository at this point in the history
#1277)

* return saving object for store.Create

Signed-off-by: imjoey <majunjiev@gmail.com>

* Add backend e2e test for returning from Create-via-POST

Signed-off-by: imjoey <majunjiev@gmail.com>

* Fix incorrect HTTP method

Signed-off-by: imjoey <majunjiev@gmail.com>
  • Loading branch information
imjoey authored Jan 17, 2021
1 parent ce307f2 commit 754f559
Show file tree
Hide file tree
Showing 15 changed files with 233 additions and 45 deletions.
19 changes: 10 additions & 9 deletions api/internal/core/store/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ import (
type Interface interface {
Get(key string) (interface{}, error)
List(input ListInput) (*ListOutput, error)
Create(ctx context.Context, obj interface{}) error
Create(ctx context.Context, obj interface{}) (interface{}, error)
Update(ctx context.Context, obj interface{}, createIfNotExist bool) error
BatchDelete(ctx context.Context, keys []string) error
}
Expand Down Expand Up @@ -240,36 +240,36 @@ func (s *GenericStore) ingestValidate(obj interface{}) (err error) {
return err
}

func (s *GenericStore) Create(ctx context.Context, obj interface{}) error {
func (s *GenericStore) Create(ctx context.Context, obj interface{}) (interface{}, error) {
if setter, ok := obj.(entity.BaseInfoSetter); ok {
info := setter.GetBaseInfo()
info.Creating()
}

if err := s.ingestValidate(obj); err != nil {
return err
return nil, err
}

key := s.opt.KeyFunc(obj)
if key == "" {
return fmt.Errorf("key is required")
return nil, fmt.Errorf("key is required")
}
_, ok := s.cache.Load(key)
if ok {
log.Warnf("key: %s is conflicted", key)
return fmt.Errorf("key: %s is conflicted", key)
return nil, fmt.Errorf("key: %s is conflicted", key)
}

bs, err := json.Marshal(obj)
if err != nil {
log.Errorf("json marshal failed: %s", err)
return fmt.Errorf("json marshal failed: %s", err)
return nil, fmt.Errorf("json marshal failed: %s", err)
}
if err := s.Stg.Create(ctx, s.GetObjStorageKey(obj), string(bs)); err != nil {
return err
return nil, err
}

return nil
return obj, nil
}

func (s *GenericStore) Update(ctx context.Context, obj interface{}, createIfNotExist bool) error {
Expand All @@ -284,7 +284,8 @@ func (s *GenericStore) Update(ctx context.Context, obj interface{}, createIfNotE
storedObj, ok := s.cache.Load(key)
if !ok {
if createIfNotExist {
return s.Create(ctx, obj)
_, err := s.Create(ctx, obj)
return err
}
log.Warnf("key: %s is not found", key)
return fmt.Errorf("key: %s is not found", key)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/core/store/store_mock.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package store

import (
"context"

"github.com/stretchr/testify/mock"
)

Expand Down Expand Up @@ -48,9 +49,9 @@ func (m *MockInterface) List(input ListInput) (*ListOutput, error) {
return r0, r1
}

func (m *MockInterface) Create(ctx context.Context, obj interface{}) error {
func (m *MockInterface) Create(ctx context.Context, obj interface{}) (interface{}, error) {
ret := m.Mock.Called(ctx, obj)
return ret.Error(0)
return ret.Get(0), ret.Error(1)
}

func (m *MockInterface) Update(ctx context.Context, obj interface{}, createOnFail bool) error {
Expand Down
7 changes: 6 additions & 1 deletion api/internal/core/store/store_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -613,12 +613,17 @@ func TestGenericStore_Create(t *testing.T) {

tc.giveStore.Stg = mStorage
tc.giveStore.opt.Validator = mValidator
err := tc.giveStore.Create(context.TODO(), tc.giveObj)
ret, err := tc.giveStore.Create(context.TODO(), tc.giveObj)
assert.True(t, validateCalled, tc.caseDesc)
if err != nil {
assert.Equal(t, tc.wantErr, err, tc.caseDesc)
continue
}
retTs, ok := ret.(*TestStruct)
assert.True(t, ok)
// The returned value (retTs) should be the same as the input (tc.giveObj)
assert.Equal(t, tc.giveObj.Field1, retTs.Field1, tc.caseDesc)
assert.Equal(t, tc.giveObj.Field2, retTs.Field2, tc.caseDesc)
assert.True(t, createCalled, tc.caseDesc)
}
}
Expand Down
9 changes: 5 additions & 4 deletions api/internal/handler/route/route.go
Original file line number Diff line number Diff line change
Expand Up @@ -348,16 +348,17 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
}

//save original conf
if err = h.scriptStore.Create(c.Context(), script); err != nil {
if _, err = h.scriptStore.Create(c.Context(), script); err != nil {
return nil, err
}
}

if err := h.routeStore.Create(c.Context(), input); err != nil {
ret, err := h.routeStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down Expand Up @@ -429,7 +430,7 @@ func (h *Handler) Update(c droplet.Context) (interface{}, error) {
if err = h.scriptStore.Update(c.Context(), script, true); err != nil {
//if not exists, create
if err.Error() == fmt.Sprintf("key: %s is not found", script.ID) {
if err := h.scriptStore.Create(c.Context(), script); err != nil {
if _, err := h.scriptStore.Create(c.Context(), script); err != nil {
return handler.SpecCodeResponse(err), err
}
} else {
Expand Down
27 changes: 20 additions & 7 deletions api/internal/handler/route/route_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -391,8 +391,12 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route)
assert.Nil(t, err)
ctx.SetInput(route)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
// check the returned valued
objRet, ok := ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -401,7 +405,7 @@ func TestRoute(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Route)
assert.Nil(t, err)
assert.Equal(t, stored.ID, route.ID)
Expand Down Expand Up @@ -938,7 +942,7 @@ func TestRoute(t *testing.T) {
dataPage = retPage.(*store.ListOutput)
assert.Equal(t, len(dataPage.Rows), 1)

//sleep
// sleep
time.Sleep(time.Duration(100) * time.Millisecond)

// list search and status not match
Expand Down Expand Up @@ -1024,8 +1028,11 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route3)
assert.Nil(t, err)
ctx.SetInput(route3)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "2", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down Expand Up @@ -1153,8 +1160,11 @@ func TestRoute(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route11)
assert.Nil(t, err)
ctx.SetInput(route11)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "11", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down Expand Up @@ -1288,8 +1298,11 @@ func Test_Route_With_Script_Dag2lua(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), route)
assert.Nil(t, err)
ctx.SetInput(route)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Route)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(20) * time.Millisecond)
Expand All @@ -1298,7 +1311,7 @@ func Test_Route_With_Script_Dag2lua(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Route)
assert.Nil(t, err)
assert.Equal(t, stored.ID, route.ID)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,12 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
}
}

if err := h.serviceStore.Create(c.Context(), input); err != nil {
ret, err := h.serviceStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
12 changes: 9 additions & 3 deletions api/internal/handler/service/service_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,11 @@ func TestService(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), service)
assert.Nil(t, err)
ctx.SetInput(service)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Service)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -78,7 +81,7 @@ func TestService(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.Service)
assert.Nil(t, err)
assert.Equal(t, stored.ID, service.ID)
Expand Down Expand Up @@ -173,8 +176,11 @@ func TestService(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), service11)
assert.Nil(t, err)
ctx.SetInput(service11)
_, err = handler.Create(ctx)
ret, err = handler.Create(ctx)
assert.Nil(t, err)
objRet, ok = ret.(*entity.Service)
assert.True(t, ok)
assert.Equal(t, "11", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/ssl/ssl.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,11 +189,12 @@ func (h *Handler) Create(c droplet.Context) (interface{}, error) {
ssl.ID = input.ID
//set default value for SSL status, if not set, it will be 0 which means disable.
ssl.Status = conf.SSLDefaultStatus
if err := h.sslStore.Create(c.Context(), ssl); err != nil {
ret, err := h.sslStore.Create(c.Context(), ssl)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
7 changes: 5 additions & 2 deletions api/internal/handler/ssl/ssl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,11 @@ func TestSSL(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), ssl)
assert.Nil(t, err)
ctx.SetInput(ssl)
_, err = handler.Create(ctx)
ret, err := handler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.SSL)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -64,7 +67,7 @@ func TestSSL(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := handler.Get(ctx)
ret, err = handler.Get(ctx)
stored := ret.(*entity.SSL)
assert.Nil(t, err)
assert.Equal(t, stored.ID, ssl.ID)
Expand Down
5 changes: 3 additions & 2 deletions api/internal/handler/upstream/upstream.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,12 @@ func (h *Handler) List(c droplet.Context) (interface{}, error) {
func (h *Handler) Create(c droplet.Context) (interface{}, error) {
input := c.Input().(*entity.Upstream)

if err := h.upstreamStore.Create(c.Context(), input); err != nil {
ret, err := h.upstreamStore.Create(c.Context(), input)
if err != nil {
return handler.SpecCodeResponse(err), err
}

return nil, nil
return ret, nil
}

type UpdateInput struct {
Expand Down
14 changes: 10 additions & 4 deletions api/internal/handler/upstream/upstream_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,11 @@ func TestUpstream(t *testing.T) {
err = json.Unmarshal([]byte(reqBody), upstream)
assert.Nil(t, err)
ctx.SetInput(upstream)
_, err = upstreamHandler.Create(ctx)
ret, err := upstreamHandler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Upstream)
assert.True(t, ok)
assert.Equal(t, "1", objRet.ID)

//sleep
time.Sleep(time.Duration(100) * time.Millisecond)
Expand All @@ -106,7 +109,7 @@ func TestUpstream(t *testing.T) {
input := &GetInput{}
input.ID = "1"
ctx.SetInput(input)
ret, err := upstreamHandler.Get(ctx)
ret, err = upstreamHandler.Get(ctx)
stored := ret.(*entity.Upstream)
assert.Nil(t, err)
assert.Equal(t, stored.ID, upstream.ID)
Expand Down Expand Up @@ -205,8 +208,11 @@ func TestUpstream_Pass_Host(t *testing.T) {
err := json.Unmarshal([]byte(reqBody), upstream)
assert.Nil(t, err)
ctx.SetInput(upstream)
_, err = upstreamHandler.Create(ctx)
ret, err := upstreamHandler.Create(ctx)
assert.Nil(t, err)
objRet, ok := ret.(*entity.Upstream)
assert.True(t, ok)
assert.Equal(t, "2", objRet.ID)

//sleep
time.Sleep(time.Duration(20) * time.Millisecond)
Expand All @@ -215,7 +221,7 @@ func TestUpstream_Pass_Host(t *testing.T) {
input := &GetInput{}
input.ID = "2"
ctx.SetInput(input)
ret, err := upstreamHandler.Get(ctx)
ret, err = upstreamHandler.Get(ctx)
stored := ret.(*entity.Upstream)
assert.Nil(t, err)
assert.Equal(t, stored.ID, upstream.ID)
Expand Down
Loading

0 comments on commit 754f559

Please sign in to comment.