This is an automated email from the ASF dual-hosted git repository.

juzhiyuan pushed a commit to branch refactor
in repository https://gitbox.apache.org/repos/asf/apisix-dashboard.git


The following commit(s) were added to refs/heads/refactor by this push:
     new c3dcefb  feat: support search for resource list (#557)
c3dcefb is described below

commit c3dcefb45a20c41e7869ffaa3c22ae602add6f50
Author: nic-chen <[email protected]>
AuthorDate: Thu Oct 15 09:34:45 2020 +0800

    feat: support search for resource list (#557)
    
    * feat: support search for resource list
    
    * fix ci
---
 api/internal/handler/consumer/consumer.go      |  2 +-
 api/internal/handler/consumer/consumer_test.go | 18 ++++++++++++++++
 api/internal/handler/route/route.go            | 10 ++++++++-
 api/internal/handler/route/route_test.go       | 30 ++++++++++++++++++++++++++
 api/internal/handler/service/service.go        |  5 ++++-
 api/internal/handler/service/service_test.go   | 24 +++++++++++++++++++++
 api/internal/handler/ssl/ssl.go                | 15 ++++++++++---
 api/internal/handler/ssl/ssl_test.go           | 20 +++++++++++++++++
 api/internal/handler/upstream/upstream.go      |  6 +++---
 9 files changed, 121 insertions(+), 9 deletions(-)

diff --git a/api/internal/handler/consumer/consumer.go 
b/api/internal/handler/consumer/consumer.go
index 372a765..1fdf3b3 100644
--- a/api/internal/handler/consumer/consumer.go
+++ b/api/internal/handler/consumer/consumer.go
@@ -79,7 +79,7 @@ func (h *Handler) List(c droplet.Context) (interface{}, 
error) {
        ret, err := h.consumerStore.List(store.ListInput{
                Predicate: func(obj interface{}) bool {
                        if input.Username != "" {
-                               return 
strings.Index(obj.(*entity.Consumer).Username, input.Username) > 0
+                               return 
strings.Contains(obj.(*entity.Consumer).Username, input.Username)
                        }
                        return true
                },
diff --git a/api/internal/handler/consumer/consumer_test.go 
b/api/internal/handler/consumer/consumer_test.go
index 3a3a43d..567c796 100644
--- a/api/internal/handler/consumer/consumer_test.go
+++ b/api/internal/handler/consumer/consumer_test.go
@@ -147,6 +147,24 @@ func TestConsumer(t *testing.T) {
        dataPage2 := retPage2.(*store.ListOutput)
        assert.Equal(t, len(dataPage2.Rows), 1)
 
+       //list search match
+       listInput3 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "username": "pony"}`
+       json.Unmarshal([]byte(reqBody), listInput3)
+       ctx.SetInput(listInput3)
+       retPage, err := handler.List(ctx)
+       dataPage := retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 1)
+
+       //list search not match
+       listInput4 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "username": "not-exists"}`
+       json.Unmarshal([]byte(reqBody), listInput4)
+       ctx.SetInput(listInput4)
+       retPage, err = handler.List(ctx)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 0)
+
        //delete consumer
        inputDel := &BatchDelete{}
        reqBody = `{"usernames": "jack"}`
diff --git a/api/internal/handler/route/route.go 
b/api/internal/handler/route/route.go
index 8f1b409..870eb06 100644
--- a/api/internal/handler/route/route.go
+++ b/api/internal/handler/route/route.go
@@ -93,6 +93,7 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) 
{
 
 type ListInput struct {
        Name string `auto_read:"name,query"`
+       URI  string `auto_read:"uri,query"`
        store.Pagination
 }
 
@@ -101,8 +102,15 @@ func (h *Handler) List(c droplet.Context) (interface{}, 
error) {
 
        ret, err := h.routeStore.List(store.ListInput{
                Predicate: func(obj interface{}) bool {
+                       if input.Name != "" && input.URI != "" {
+                               return 
strings.Contains(obj.(*entity.Route).Name, input.Name) &&
+                                       
strings.Contains(obj.(*entity.Route).URI, input.URI)
+                       }
                        if input.Name != "" {
-                               return strings.Index(obj.(*entity.Route).Name, 
input.Name) > 0
+                               return 
strings.Contains(obj.(*entity.Route).Name, input.Name)
+                       }
+                       if input.URI != "" {
+                               return 
strings.Contains(obj.(*entity.Route).URI, input.URI)
                        }
                        return true
                },
diff --git a/api/internal/handler/route/route_test.go 
b/api/internal/handler/route/route_test.go
index 5c7d0e3..abed058 100644
--- a/api/internal/handler/route/route_test.go
+++ b/api/internal/handler/route/route_test.go
@@ -755,6 +755,36 @@ func TestRoute(t *testing.T) {
        dataPage := retPage.(*store.ListOutput)
        assert.Equal(t, len(dataPage.Rows), 1)
 
+       //list search match
+       listInput2 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "name": "a", "uri": "index"}`
+       json.Unmarshal([]byte(reqBody), listInput2)
+       ctx.SetInput(listInput2)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 1)
+
+       //list search name not match
+       listInput3 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "name": "not-exists", "uri": 
"index"}`
+       json.Unmarshal([]byte(reqBody), listInput3)
+       ctx.SetInput(listInput3)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 0)
+
+       //list search uri not match
+       listInput4 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "name": "a", "uri": 
"not-exists"}`
+       json.Unmarshal([]byte(reqBody), listInput4)
+       ctx.SetInput(listInput4)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 0)
+
        //delete test data
        inputDel := &BatchDelete{}
        reqBody = `{"ids": "1"}`
diff --git a/api/internal/handler/service/service.go 
b/api/internal/handler/service/service.go
index a85eda2..7ee3c0f 100644
--- a/api/internal/handler/service/service.go
+++ b/api/internal/handler/service/service.go
@@ -71,7 +71,7 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) 
{
 }
 
 type ListInput struct {
-       ID string `auto_read:"id,query"`
+       Name string `auto_read:"name,query"`
        store.Pagination
 }
 
@@ -80,6 +80,9 @@ func (h *Handler) List(c droplet.Context) (interface{}, 
error) {
 
        ret, err := h.serviceStore.List(store.ListInput{
                Predicate: func(obj interface{}) bool {
+                       if input.Name != "" {
+                               return 
strings.Contains(obj.(*entity.Service).Name, input.Name)
+                       }
                        return true
                },
                PageSize:   input.PageSize,
diff --git a/api/internal/handler/service/service_test.go 
b/api/internal/handler/service/service_test.go
index ffce7fc..a433e80 100644
--- a/api/internal/handler/service/service_test.go
+++ b/api/internal/handler/service/service_test.go
@@ -85,6 +85,7 @@ func TestService(t *testing.T) {
        service2 := &UpdateInput{}
        service2.ID = "1"
        reqBody = `{
+      "name": "test-service",
       "plugins": {
           "limit-count": {
               "count": 2,
@@ -107,6 +108,9 @@ func TestService(t *testing.T) {
        _, err = handler.Update(ctx)
        assert.Nil(t, err)
 
+  //sleep
+  time.Sleep(time.Duration(100) * time.Millisecond)
+
        //list
        listInput := &ListInput{}
        reqBody = `{"page_size": 1, "page": 1}`
@@ -117,6 +121,26 @@ func TestService(t *testing.T) {
        dataPage := retPage.(*store.ListOutput)
        assert.Equal(t, len(dataPage.Rows), 1)
 
+       //list search match
+       listInput2 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "name": "test"}`
+       json.Unmarshal([]byte(reqBody), listInput2)
+       ctx.SetInput(listInput2)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 1)
+
+       //list search not match
+       listInput3 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "name": "not-exists"}`
+       json.Unmarshal([]byte(reqBody), listInput3)
+       ctx.SetInput(listInput3)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 0)
+
        //delete test data
        inputDel := &BatchDelete{}
        reqBody = `{"ids": "1"}`
diff --git a/api/internal/handler/ssl/ssl.go b/api/internal/handler/ssl/ssl.go
index 494eaea..a7f5701 100644
--- a/api/internal/handler/ssl/ssl.go
+++ b/api/internal/handler/ssl/ssl.go
@@ -88,7 +88,7 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) 
{
 }
 
 type ListInput struct {
-       ID string `auto_read:"id,query"`
+       SNI string `auto_read:"sni,query"`
        store.Pagination
 }
 
@@ -97,8 +97,17 @@ func (h *Handler) List(c droplet.Context) (interface{}, 
error) {
 
        ret, err := h.sslStore.List(store.ListInput{
                Predicate: func(obj interface{}) bool {
-                       if input.ID != "" {
-                               return strings.Index(obj.(*entity.SSL).ID, 
input.ID) > 0
+                       if input.SNI != "" {
+                               if strings.Contains(obj.(*entity.SSL).Sni, 
input.SNI) {
+                                       return true
+                               }
+                               for _, str := range obj.(*entity.SSL).Snis {
+                                       result := strings.Contains(str, 
input.SNI)
+                                       if result {
+                                               return true
+                                       }
+                               }
+                               return false
                        }
                        return true
                },
diff --git a/api/internal/handler/ssl/ssl_test.go 
b/api/internal/handler/ssl/ssl_test.go
index d50208d..53d26a8 100644
--- a/api/internal/handler/ssl/ssl_test.go
+++ b/api/internal/handler/ssl/ssl_test.go
@@ -90,6 +90,26 @@ func TestSSL(t *testing.T) {
        dataPage := retPage.(*store.ListOutput)
        assert.Equal(t, len(dataPage.Rows), 1)
 
+       //list search match
+       listInput2 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "sni": "route"}`
+       json.Unmarshal([]byte(reqBody), listInput2)
+       ctx.SetInput(listInput2)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 1)
+
+       //list search not match
+       listInput3 := &ListInput{}
+       reqBody = `{"page_size": 1, "page": 1, "sni": "not-exists"}`
+       json.Unmarshal([]byte(reqBody), listInput3)
+       ctx.SetInput(listInput3)
+       retPage, err = handler.List(ctx)
+       assert.Nil(t, err)
+       dataPage = retPage.(*store.ListOutput)
+       assert.Equal(t, len(dataPage.Rows), 0)
+
        //delete test data
        inputDel := &BatchDelete{}
        reqBody = `{"ids": "1"}`
diff --git a/api/internal/handler/upstream/upstream.go 
b/api/internal/handler/upstream/upstream.go
index 3727eb7..5071ff2 100644
--- a/api/internal/handler/upstream/upstream.go
+++ b/api/internal/handler/upstream/upstream.go
@@ -75,7 +75,7 @@ func (h *Handler) Get(c droplet.Context) (interface{}, error) 
{
 }
 
 type ListInput struct {
-       ID string `auto_read:"id,query"`
+       Name string `auto_read:"name,query"`
        store.Pagination
 }
 
@@ -84,8 +84,8 @@ func (h *Handler) List(c droplet.Context) (interface{}, 
error) {
 
        ret, err := h.upstreamStore.List(store.ListInput{
                Predicate: func(obj interface{}) bool {
-                       if input.ID != "" {
-                               return strings.Index(obj.(*entity.Upstream).ID, 
input.ID) > 0
+                       if input.Name != "" {
+                               return 
strings.Contains(obj.(*entity.Upstream).Name, input.Name)
                        }
                        return true
                },

Reply via email to