From abe93d371e506870bb37b75816f1668fd4d0d291 Mon Sep 17 00:00:00 2001
From: Anton Sattarov <dirty.mew@gmail.com>
Date: Tue, 14 Nov 2023 09:58:09 +0100
Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?=
 =?UTF-8?q?=D1=8B=20=D1=82=D0=B8=D0=BF=D1=8B=20`extension.ActionRequest/Re?=
 =?UTF-8?q?sponse`=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83=D1=80?=
 =?UTF-8?q?=D1=8B=20=D0=BE=D0=BF=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD?=
 =?UTF-8?q?=D1=8B=20=D1=81=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?=
 =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B2=D0=BD=D1=83?=
 =?UTF-8?q?=D1=82=D1=80=D0=B5=D0=BD=D0=BD=D0=B8=D1=85=20=D1=82=D0=B8=D0=BF?=
 =?UTF-8?q?=D0=BE=D0=B2=20perxis.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/extension/action.go                 | 249 ++++++++++++------------
 pkg/extension/client.go                 |   4 +-
 pkg/extension/schema_test.go            |   1 +
 pkg/extension/server.go                 |   4 +-
 pkg/extension/server_test.go            |  28 +--
 pkg/extension/service/extension_test.go |   6 +-
 pkg/extension/storage.go                |   6 +-
 pkg/references/reference.go             |  28 ++-
 8 files changed, 169 insertions(+), 157 deletions(-)

diff --git a/pkg/extension/action.go b/pkg/extension/action.go
index d4839a8a..31b76e93 100644
--- a/pkg/extension/action.go
+++ b/pkg/extension/action.go
@@ -9,34 +9,30 @@ import (
 type (
 	ActionKind    = pb.Action_Kind
 	ResponseState = pb.ActionResponse_State
+	ActionTarget  = pb.Target
 
-	ActionRequest  = pb.ActionRequest
-	ActionResponse = pb.ActionResponse
-
-	ActionTarget = pb.Target
-
-	//ActionRequest struct {
-	//	Extension    string
-	//	Action       string
-	//	SpaceID      string
-	//	EnvID        string
-	//	CollectionID string
-	//	ItemID       string
-	//	ItemIDs      []string
-	//	Fields       []string
-	//	Metadata     map[string]string
-	//	Refs         []*references.Reference
-	//	Params       *references.Reference
-	//}
-	//
-	//ActionResponse struct {
-	//	State    ResponseState
-	//	Msg      string
-	//	Error    string
-	//	Next     []*Action
-	//	Metadata map[string]string
-	//	Refs     []*references.Reference
-	//}
+	ActionRequest struct {
+		Extension    string
+		Action       string
+		SpaceID      string
+		EnvID        string
+		CollectionID string
+		ItemID       string
+		ItemIDs      []string
+		Fields       []string
+		Metadata     map[string]string
+		Refs         []*references.Reference
+		Params       *references.Reference
+	}
+
+	ActionResponse struct {
+		State    ResponseState
+		Msg      string
+		Error    string
+		Next     []*Action
+		Metadata map[string]string
+		Refs     []*references.Reference
+	}
 )
 
 const (
@@ -90,82 +86,82 @@ func ActionFromMap(d map[string]interface{}) (*Action, error) {
 	return &action, err
 }
 
-//func ActionRequestToPB(req *ActionRequest) *pb.ActionRequest {
-//	if req == nil {
-//		return nil
-//	}
-//	return &pb.ActionRequest{
-//		Extension:    req.Extension,
-//		Action:       req.Action,
-//		SpaceId:      req.SpaceID,
-//		EnvId:        req.EnvID,
-//		CollectionId: req.CollectionID,
-//		ItemId:       req.ItemID,
-//		ItemIds:      req.ItemIDs,
-//		Fields:       req.Fields,
-//		Metadata:     req.Metadata,
-//		Refs:         references.ReferenceListToPB(req.Refs),
-//		Params:       references.ReferenceToPB(req.Params),
-//	}
-//}
-//
-//func ActionRequestFromPB(req *pb.ActionRequest) *ActionRequest {
-//	if req == nil {
-//		return nil
-//	}
-//	return &ActionRequest{
-//		Extension:    req.Extension,
-//		Action:       req.Action,
-//		SpaceID:      req.SpaceId,
-//		EnvID:        req.EnvId,
-//		CollectionID: req.CollectionId,
-//		ItemID:       req.ItemId,
-//		ItemIDs:      req.ItemIds,
-//		Fields:       req.Fields,
-//		Metadata:     req.Metadata,
-//		Refs:         references.ReferenceListFromPB(req.Refs),
-//		Params:       references.ReferenceFromPB(req.Params),
-//	}
-//}
-//func ActionResponseToPB(out *ActionResponse) *pb.ActionResponse {
-//	if out == nil {
-//		return nil
-//	}
-//
-//	var next []*pb.Action
-//	for _, a := range out.Next {
-//		next = append(next, ActionToPB(a))
-//	}
-//
-//	return &pb.ActionResponse{
-//		State:    out.State,
-//		Msg:      out.Msg,
-//		Error:    out.Error,
-//		Next:     next,
-//		Metadata: out.Metadata,
-//		Refs:     references.ReferenceListToPB(out.Refs),
-//	}
-//}
-//
-//func ActionResponseFromPB(out *pb.ActionResponse) *ActionResponse {
-//	if out == nil {
-//		return nil
-//	}
-//
-//	var next []*Action
-//	for _, a := range out.Next {
-//		next = append(next, ActionFromPB(a))
-//	}
-//
-//	return &ActionResponse{
-//		State:    out.State,
-//		Msg:      out.Msg,
-//		Error:    out.Error,
-//		Next:     next,
-//		Metadata: out.Metadata,
-//		Refs:     references.ReferenceListFromPB(out.Refs),
-//	}
-//}
+func ActionRequestToPB(req *ActionRequest) *pb.ActionRequest {
+	if req == nil {
+		return nil
+	}
+	return &pb.ActionRequest{
+		Extension:    req.Extension,
+		Action:       req.Action,
+		SpaceId:      req.SpaceID,
+		EnvId:        req.EnvID,
+		CollectionId: req.CollectionID,
+		ItemId:       req.ItemID,
+		ItemIds:      req.ItemIDs,
+		Fields:       req.Fields,
+		Metadata:     req.Metadata,
+		Refs:         references.ReferenceListToPB(req.Refs),
+		Params:       references.ReferenceToPB(req.Params),
+	}
+}
+
+func ActionRequestFromPB(req *pb.ActionRequest) *ActionRequest {
+	if req == nil {
+		return nil
+	}
+	return &ActionRequest{
+		Extension:    req.Extension,
+		Action:       req.Action,
+		SpaceID:      req.SpaceId,
+		EnvID:        req.EnvId,
+		CollectionID: req.CollectionId,
+		ItemID:       req.ItemId,
+		ItemIDs:      req.ItemIds,
+		Fields:       req.Fields,
+		Metadata:     req.Metadata,
+		Refs:         references.ReferenceListFromPB(req.Refs),
+		Params:       references.ReferenceFromPB(req.Params),
+	}
+}
+func ActionResponseToPB(out *ActionResponse) *pb.ActionResponse {
+	if out == nil {
+		return nil
+	}
+
+	var next []*pb.Action
+	for _, a := range out.Next {
+		next = append(next, ActionToPB(a))
+	}
+
+	return &pb.ActionResponse{
+		State:    out.State,
+		Msg:      out.Msg,
+		Error:    out.Error,
+		Next:     next,
+		Metadata: out.Metadata,
+		Refs:     references.ReferenceListToPB(out.Refs),
+	}
+}
+
+func ActionResponseFromPB(out *pb.ActionResponse) *ActionResponse {
+	if out == nil {
+		return nil
+	}
+
+	var next []*Action
+	for _, a := range out.Next {
+		next = append(next, ActionFromPB(a))
+	}
+
+	return &ActionResponse{
+		State:    out.State,
+		Msg:      out.Msg,
+		Error:    out.Error,
+		Next:     next,
+		Metadata: out.Metadata,
+		Refs:     references.ReferenceListFromPB(out.Refs),
+	}
+}
 
 func ActionFromPB(a *pb.Action) *Action {
 	if a == nil {
@@ -185,8 +181,7 @@ func ActionFromPB(a *pb.Action) *Action {
 		Classes:          a.Classes,
 		Refs:             references.ReferenceListFromPB(a.Refs),
 		ParamsCollection: a.ParamsCollection,
-		Request:          a.Request,
-		//Request:          ActionRequestFromPB(a.Request),
+		Request:          ActionRequestFromPB(a.Request),
 		NavigationAction: a.NavigationAction,
 		NavigationRoute:  a.NavigationRoute,
 		Autorun:          a.Autorun,
@@ -194,26 +189,24 @@ func ActionFromPB(a *pb.Action) *Action {
 	}
 }
 
-//
-//func ActionToPB(a *Action) *pb.Action {
-//	if a == nil {
-//		return nil
-//	}
-//	return &pb.Action{
-//		Extension:        a.Extension,
-//		Action:           a.Action,
-//		Name:             a.Name,
-//		Description:      a.Description,
-//		Icon:             a.Icon,
-//		Image:            references.ReferenceToPB(a.Image),
-//		Groups:           a.Groups,
-//		Kind:             a.Kind,
-//		Classes:          a.Classes,
-//		Refs:             references.ReferenceListToPB(a.Refs),
-//		ParamsCollection: a.ParamsCollection,
-//		Request:          a.Request,
-//		//Request:          ActionRequestToPB(a.Request),
-//		NavigationAction: a.NavigationAction,
-//		NavigationRoute:  a.NavigationRoute,
-//	}
-//}
+func ActionToPB(a *Action) *pb.Action {
+	if a == nil {
+		return nil
+	}
+	return &pb.Action{
+		Extension:        a.Extension,
+		Action:           a.Action,
+		Name:             a.Name,
+		Description:      a.Description,
+		Icon:             a.Icon,
+		Image:            references.ReferenceToPB(a.Image),
+		Groups:           a.Groups,
+		Kind:             a.Kind,
+		Classes:          a.Classes,
+		Refs:             references.ReferenceListToPB(a.Refs),
+		ParamsCollection: a.ParamsCollection,
+		Request:          ActionRequestToPB(a.Request),
+		NavigationAction: a.NavigationAction,
+		NavigationRoute:  a.NavigationRoute,
+	}
+}
diff --git a/pkg/extension/client.go b/pkg/extension/client.go
index 3f8d8bcb..00aa3859 100644
--- a/pkg/extension/client.go
+++ b/pkg/extension/client.go
@@ -83,6 +83,6 @@ func (c *Client) Check(ctx context.Context, req *CheckRequest) error {
 }
 
 func (c Client) Action(ctx context.Context, in *ActionRequest) (*ActionResponse, error) {
-	out, err := c.client.Action(ctx, in)
-	return out, err
+	out, err := c.client.Action(ctx, ActionRequestToPB(in))
+	return ActionResponseFromPB(out), err
 }
diff --git a/pkg/extension/schema_test.go b/pkg/extension/schema_test.go
index 9892ba10..20648678 100644
--- a/pkg/extension/schema_test.go
+++ b/pkg/extension/schema_test.go
@@ -47,6 +47,7 @@ func TestEqualSchema(t *testing.T) {
 		require.NoError(t, err)
 		s2 := schema.New()
 		err = json.Unmarshal(b, s2)
+		require.NoError(t, err)
 		require.Equal(t, s1.Field, s2.Field)
 	}
 }
diff --git a/pkg/extension/server.go b/pkg/extension/server.go
index 4ddb3143..90d3db41 100644
--- a/pkg/extension/server.go
+++ b/pkg/extension/server.go
@@ -183,7 +183,7 @@ func (s *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.ActionRe
 		return nil, err
 	}
 
-	out, err := svc[0].Action(ctx, in)
+	out, err := svc[0].Action(ctx, ActionRequestFromPB(in))
 
 	if out == nil {
 		out = &ActionResponse{}
@@ -195,7 +195,7 @@ func (s *Server) Action(ctx context.Context, in *pb.ActionRequest) (*pb.ActionRe
 		out.Msg += errors.GetDetail(err)
 	}
 
-	return out, nil
+	return ActionResponseToPB(out), nil
 }
 
 func (s *Server) Start() error {
diff --git a/pkg/extension/server_test.go b/pkg/extension/server_test.go
index 5a0a1691..137fdb82 100644
--- a/pkg/extension/server_test.go
+++ b/pkg/extension/server_test.go
@@ -55,8 +55,8 @@ func TestServer_Action(t *testing.T) {
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
 				Action:  "grpc:///test-extension/test-action",
-				SpaceId: "sp",
-				EnvId:   "env",
+				SpaceID: "sp",
+				EnvID:   "env",
 			},
 			want: &ActionResponse{State: ResponseDone},
 		},
@@ -65,8 +65,8 @@ func TestServer_Action(t *testing.T) {
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
 				Action:  "some:///space/env/coll",
-				SpaceId: "sp",
-				EnvId:   "env",
+				SpaceID: "sp",
+				EnvID:   "env",
 			},
 			want:    &ActionResponse{State: ResponseDone},
 			wantErr: "invalid action",
@@ -76,8 +76,8 @@ func TestServer_Action(t *testing.T) {
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
 				Action:    "test-action",
-				SpaceId:   "sp",
-				EnvId:     "env",
+				SpaceID:   "sp",
+				EnvID:     "env",
 				Extension: "test-extension",
 			},
 			want: &ActionResponse{State: ResponseDone},
@@ -87,8 +87,8 @@ func TestServer_Action(t *testing.T) {
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
 				Action:  "grpc:///test-extension-2/test-action",
-				SpaceId: "sp",
-				EnvId:   "env",
+				SpaceID: "sp",
+				EnvID:   "env",
 			},
 			want:    nil,
 			wantErr: errors.Wrap(ErrUnknownExtension, "test-extension-2").Error(),
@@ -98,8 +98,8 @@ func TestServer_Action(t *testing.T) {
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
 				Action:  "test-action",
-				SpaceId: "sp",
-				EnvId:   "env",
+				SpaceID: "sp",
+				EnvID:   "env",
 			},
 			want:    nil,
 			wantErr: "invalid action",
@@ -108,8 +108,8 @@ func TestServer_Action(t *testing.T) {
 			name:      "Deprecated call, without action and extension)",
 			extension: getDummyExtension("test-extension"),
 			in: &ActionRequest{
-				SpaceId: "sp",
-				EnvId:   "env",
+				SpaceID: "sp",
+				EnvID:   "env",
 			},
 			want:    nil,
 			wantErr: "invalid action",
@@ -119,14 +119,14 @@ func TestServer_Action(t *testing.T) {
 		t.Run(tt.name, func(t *testing.T) {
 
 			srv := NewServer(NamedExtensions(tt.extension))
-			got, err := srv.Action(context.Background(), tt.in)
+			got, err := srv.Action(context.Background(), ActionRequestToPB(tt.in))
 			if tt.wantErr != "" {
 				require.Error(t, err)
 				assert.EqualErrorf(t, err, tt.wantErr, fmt.Sprintf("Action(%v)", tt.in))
 				return
 			}
 			require.NoError(t, err)
-			assert.Equalf(t, tt.want, got, "Action(%v)", tt.in)
+			assert.Equalf(t, tt.want, ActionResponseFromPB(got), "Action(%v)", tt.in)
 		})
 	}
 }
diff --git a/pkg/extension/service/extension_test.go b/pkg/extension/service/extension_test.go
index e0582966..d96712dd 100644
--- a/pkg/extension/service/extension_test.go
+++ b/pkg/extension/service/extension_test.go
@@ -20,7 +20,7 @@ func TestExtension_Action(t *testing.T) {
 		{
 			name: "Router with 1 named action",
 			desc: &extension.ExtensionDescriptor{Extension: "test", Title: "Test Extension", Description: "desc", Version: "v.0.0.1"},
-			in:   &extension.ActionRequest{Action: "grpc:///test/action", SpaceId: "sp", EnvId: "env", CollectionId: "coll"},
+			in:   &extension.ActionRequest{Action: "grpc:///test/action", SpaceID: "sp", EnvID: "env", CollectionID: "coll"},
 			want: "Called action",
 			router: extension.Named("action", func(ctx context.Context, url *extension.ActionURL, req *extension.ActionRequest) (*extension.ActionResponse, error) {
 				return &extension.ActionResponse{State: extension.ResponseDone, Msg: "Called action"}, nil
@@ -30,7 +30,7 @@ func TestExtension_Action(t *testing.T) {
 		{
 			name: "Router with 2 named actions",
 			desc: &extension.ExtensionDescriptor{Extension: "test", Title: "Test Extension", Description: "desc", Version: "v.0.0.1"},
-			in:   &extension.ActionRequest{Action: "grpc:///test/action2", SpaceId: "sp", EnvId: "env", CollectionId: "coll"},
+			in:   &extension.ActionRequest{Action: "grpc:///test/action2", SpaceID: "sp", EnvID: "env", CollectionID: "coll"},
 			want: "Called action2",
 			router: extension.Chain(extension.Named("action", func(ctx context.Context, url *extension.ActionURL, req *extension.ActionRequest) (*extension.ActionResponse, error) {
 				return &extension.ActionResponse{State: extension.ResponseDone}, nil
@@ -42,7 +42,7 @@ func TestExtension_Action(t *testing.T) {
 		{
 			name: "Error (no extension)",
 			desc: &extension.ExtensionDescriptor{Extension: "test", Title: "Test Extension", Description: "desc", Version: "v.0.0.1"},
-			in:   &extension.ActionRequest{Action: "grpc:///test2/action2", SpaceId: "sp", EnvId: "env", CollectionId: "coll"},
+			in:   &extension.ActionRequest{Action: "grpc:///test2/action2", SpaceID: "sp", EnvID: "env", CollectionID: "coll"},
 			router: extension.Chain(extension.Named("action", func(ctx context.Context, url *extension.ActionURL, req *extension.ActionRequest) (*extension.ActionResponse, error) {
 				return &extension.ActionResponse{State: extension.ResponseDone}, nil
 			}), extension.Named("action2", func(ctx context.Context, url *extension.ActionURL, req *extension.ActionRequest) (*extension.ActionResponse, error) {
diff --git a/pkg/extension/storage.go b/pkg/extension/storage.go
index 3da54fec..c23a7d40 100644
--- a/pkg/extension/storage.go
+++ b/pkg/extension/storage.go
@@ -2,7 +2,6 @@ package extension
 
 import (
 	"context"
-	"fmt"
 	"strings"
 
 	"git.perx.ru/perxis/perxis-go/pkg/collections"
@@ -80,10 +79,7 @@ func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, exten
 func (s *storage) FindExtensions(ctx context.Context, spaceID, envID string, extensions ...string) ([]*Info, error) {
 	var itemsFilter *items.Filter
 	if len(extensions) != 0 {
-		q := make([]interface{}, 0, len(extensions)+1)
-		for _, e := range extensions {
-			q = append(q, fmt.Sprintf("id contains '%s'", e))
-		}
+		itemsFilter.ID = extensions
 	}
 
 	itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, itemsFilter)
diff --git a/pkg/references/reference.go b/pkg/references/reference.go
index 12dac186..5740c929 100644
--- a/pkg/references/reference.go
+++ b/pkg/references/reference.go
@@ -26,6 +26,9 @@ func (r *Reference) MarshalBSON() ([]byte, error) {
 }
 
 func ReferenceFromPB(refPB *pb.Reference) *Reference {
+	if refPB == nil {
+		return nil
+	}
 	return &Reference{
 		ID:           refPB.Id,
 		CollectionID: refPB.CollectionId,
@@ -45,6 +48,9 @@ func ReferenceFromItem(item *items.Item) *Reference {
 }
 
 func ReferenceToPB(ref *Reference) *pb.Reference {
+	if ref == nil {
+		return nil
+	}
 	return &pb.Reference{
 		Id:           ref.ID,
 		CollectionId: ref.CollectionID,
@@ -52,14 +58,30 @@ func ReferenceToPB(ref *Reference) *pb.Reference {
 	}
 }
 
-func ReferenceListFromPB(listPB []*pb.Reference) []*Reference {
-	list := make([]*Reference, 0, len(listPB))
-	for _, refPB := range listPB {
+func ReferenceListFromPB(refsPB []*pb.Reference) []*Reference {
+	if refsPB == nil {
+		return nil
+	}
+
+	list := make([]*Reference, 0, len(refsPB))
+	for _, refPB := range refsPB {
 		list = append(list, ReferenceFromPB(refPB))
 	}
 	return list
 }
 
+func ReferenceListToPB(refs []*Reference) []*pb.Reference {
+	if refs == nil {
+		return nil
+	}
+
+	list := make([]*pb.Reference, 0, len(refs))
+	for _, ref := range refs {
+		list = append(list, ReferenceToPB(ref))
+	}
+	return list
+}
+
 func (r *Reference) String() string {
 	if r == nil {
 		return ""
-- 
GitLab