Skip to content
Snippets Groups Projects
Commit bb6ca6e9 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'feature/PRXS-1102-ActionRequestGoType' into 'master'

Изменены типы `extension.ActionRequest/Response` структуры определены с использованием внутренних типов perxis.

See merge request perxis/perxis-go!112
parents c438913c 29e06702
No related branches found
No related tags found
No related merge requests found
......@@ -8,44 +8,41 @@ import (
type (
ActionKind = pb.Action_Kind
ActionTarget = pb.Target
ActionView = pb.Action_View
ResponseState = pb.ActionResponse_State
ResponseFormat = pb.ActionResponse_Format
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
}
//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
//}
ActionResponse struct {
State ResponseState
Target ActionTarget
Format ResponseFormat
Msg string
Title string
Image string
Error string
Next []*Action
Metadata map[string]string
Refs []*references.Reference
}
)
const (
ResponseDone = pb.ActionResponse_DONE
ResponseError = pb.ActionResponse_ERROR
ResponsePending = pb.ActionResponse_PENDING
ResponseInProgress = pb.ActionResponse_IN_PROGRESS
ResponseParametersRequired = pb.ActionResponse_PARAMETERS_REQUIRED
ActionKindDefault = pb.Action_DEFAULT
ActionKindSpace = pb.Action_SPACE
ActionKindEnvironment = pb.Action_ENVIRONMENT
ActionKindCollection = pb.Action_COLLECTION
......@@ -53,6 +50,43 @@ const (
ActionKindItems = pb.Action_ITEMS
ActionKindRevision = pb.Action_REVISION
ActionKindCreate = pb.Action_CREATE
ActionTargetDefault = pb.Target_DEFAULT
ActionTargetModal = pb.Target_MODAL
ActionTargetWide = pb.Target_WIDE
ActionTargetMain = pb.Target_MAIN
ActionTargetDrawer = pb.Target_DRAWER
ActionTargetNotification = pb.Target_NOTIFICATION
ActionTargetBlank = pb.Target_BLANK
ActionTargetNone = pb.Target_NONE
ActionViewDefault = pb.Action_DEFAULT_VIEW
ActionViewHidden = pb.Action_HIDDEN_VIEW
ActionViewMainMenu = pb.Action_MAIN_MENU_VIEW
ActionViewMainMenuBottom = pb.Action_MAIN_MENU_BOTTOM_VIEW
ResponseDone = pb.ActionResponse_DONE
ResponseError = pb.ActionResponse_ERROR
ResponsePending = pb.ActionResponse_PENDING
ResponseInProgress = pb.ActionResponse_IN_PROGRESS
ResponseParametersRequired = pb.ActionResponse_PARAMETERS_REQUIRED
ResponseFormatPlain = pb.ActionResponse_PLAIN
ResponseFormatHtml = pb.ActionResponse_HTML
ResponseFormatMarkdown = pb.ActionResponse_MARKDOWN
)
var (
ActionKindName = pb.Action_Kind_name
ActionKindValue = pb.Action_Kind_value
ActionTargetName = pb.Target_name
ActionTargetValue = pb.Target_value
ActionViewName = pb.Action_View_name
ActionViewValue = pb.Action_View_value
ResponseStateName = pb.ActionResponse_State_name
ResponseStateValue = pb.ActionResponse_State_value
ResponseFormatName = pb.ActionResponse_Format_name
ResponseFormatValue = pb.ActionResponse_Format_value
)
type Action struct {
......@@ -90,82 +124,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 +219,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 +227,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,
}
}
......@@ -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
}
......@@ -5,6 +5,7 @@ package mocks
import (
context "context"
extension "git.perx.ru/perxis/perxis-go/pkg/extension"
extensions "git.perx.ru/perxis/perxis-go/proto/extensions"
mock "github.com/stretchr/testify/mock"
......@@ -16,23 +17,23 @@ type Extension struct {
}
// Action provides a mock function with given fields: ctx, in
func (_m *Extension) Action(ctx context.Context, in *extensions.ActionRequest) (*extensions.ActionResponse, error) {
func (_m *Extension) Action(ctx context.Context, in *extension.ActionRequest) (*extension.ActionResponse, error) {
ret := _m.Called(ctx, in)
var r0 *extensions.ActionResponse
var r0 *extension.ActionResponse
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) (*extensions.ActionResponse, error)); ok {
if rf, ok := ret.Get(0).(func(context.Context, *extension.ActionRequest) (*extension.ActionResponse, error)); ok {
return rf(ctx, in)
}
if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) *extensions.ActionResponse); ok {
if rf, ok := ret.Get(0).(func(context.Context, *extension.ActionRequest) *extension.ActionResponse); ok {
r0 = rf(ctx, in)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*extensions.ActionResponse)
r0 = ret.Get(0).(*extension.ActionResponse)
}
}
if rf, ok := ret.Get(1).(func(context.Context, *extensions.ActionRequest) error); ok {
if rf, ok := ret.Get(1).(func(context.Context, *extension.ActionRequest) error); ok {
r1 = rf(ctx, in)
} else {
r1 = ret.Error(1)
......
......@@ -17,23 +17,23 @@ type Manager struct {
}
// Action provides a mock function with given fields: ctx, in
func (_m *Manager) Action(ctx context.Context, in *extensions.ActionRequest) (*extensions.ActionResponse, error) {
func (_m *Manager) Action(ctx context.Context, in *extension.ActionRequest) (*extension.ActionResponse, error) {
ret := _m.Called(ctx, in)
var r0 *extensions.ActionResponse
var r0 *extension.ActionResponse
var r1 error
if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) (*extensions.ActionResponse, error)); ok {
if rf, ok := ret.Get(0).(func(context.Context, *extension.ActionRequest) (*extension.ActionResponse, error)); ok {
return rf(ctx, in)
}
if rf, ok := ret.Get(0).(func(context.Context, *extensions.ActionRequest) *extensions.ActionResponse); ok {
if rf, ok := ret.Get(0).(func(context.Context, *extension.ActionRequest) *extension.ActionResponse); ok {
r0 = rf(ctx, in)
} else {
if ret.Get(0) != nil {
r0 = ret.Get(0).(*extensions.ActionResponse)
r0 = ret.Get(0).(*extension.ActionResponse)
}
}
if rf, ok := ret.Get(1).(func(context.Context, *extensions.ActionRequest) error); ok {
if rf, ok := ret.Get(1).(func(context.Context, *extension.ActionRequest) error); ok {
r1 = rf(ctx, in)
} else {
r1 = ret.Error(1)
......
......@@ -8,7 +8,6 @@ import (
"git.perx.ru/perxis/perxis-go/pkg/schema"
"git.perx.ru/perxis/perxis-go/pkg/schema/field"
"git.perx.ru/perxis/perxis-go/pkg/schema/validate"
pb "git.perx.ru/perxis/perxis-go/proto/extensions"
)
const (
......@@ -30,7 +29,7 @@ func NewActionsCollection(spaceID, envID string) *collections.Collection {
"image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
"kind", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Action_Kind_name)...),
validate.Enum(getEnumOpt(ActionKindName)...),
).SetTitle("Вид").WithUI(&field.UI{Widget: "Select"}),
"autorun", field.Bool().SetTitle("Автозапуск").
SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
......@@ -40,11 +39,11 @@ func NewActionsCollection(spaceID, envID string) *collections.Collection {
WithUI(&field.UI{Widget: "Checkbox"}),
"target", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Target_name)...),
validate.Enum(getEnumOpt(ActionTargetName)...),
).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
"view", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(pb.Action_View_name)...),
validate.Enum(getEnumOpt(ActionViewName)...),
).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
"parent", field.String().SetTitle("Идентификатор родительского действия"),
"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
......
......@@ -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)
}
}
......@@ -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 {
......
......@@ -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)
})
}
}
......@@ -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) {
......
......@@ -2,7 +2,6 @@ package extension
import (
"context"
"fmt"
"strings"
"git.perx.ru/perxis/perxis-go/pkg/collections"
......@@ -78,15 +77,7 @@ func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, exten
// FindExtensions возвращает состояния расширений в пространстве
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))
}
}
itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, itemsFilter)
itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, &items.Filter{ID: extensions})
if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) {
return nil, err
}
......
......@@ -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 ""
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment