Something went wrong on our end
-
Anton Sattarov authoredfb53f6ec
action.go 9.45 KiB
package extension
import (
"git.perx.ru/perxis/perxis-go/pkg/references"
pb "git.perx.ru/perxis/perxis-go/proto/extensions"
"github.com/mitchellh/mapstructure"
)
type (
ActionKind = pb.Action_Kind
ActionTarget = pb.Target
ActionView = pb.Action_View
ResponseState = pb.ActionResponse_State
ResponseFormat = pb.ActionResponse_Format
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
Target ActionTarget
Format ResponseFormat
Msg string
Title string
Image string
Error string
Next []*Action
Metadata map[string]string
Refs []*references.Reference
}
)
const (
ActionKindDefault = pb.Action_DEFAULT
ActionKindSpace = pb.Action_SPACE
ActionKindEnvironment = pb.Action_ENVIRONMENT
ActionKindCollection = pb.Action_COLLECTION
ActionKindItem = pb.Action_ITEM
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 {
Extension string `mapstructure:"extension,omitempty"` // Расширение
Action string `mapstructure:"action,omitempty"` // Идентификатор действия
Target ActionTarget `mapstructure:"target,omitempty"` // Отображение результата действия
Parent string `mapstructure:"parent,omitempty"` // Идентификатор родительского действия (для отображения в меню)
Name string `mapstructure:"name,omitempty"` // Название действия для отображения в интерфейсе (пункт меню, кнопка).
Description string `mapstructure:"description,omitempty"` // Описание действия для отображения в интерфейсе
Icon string `mapstructure:"icon,omitempty"` // Название иконки для отображения действия в интерфейсе
Image *references.Reference `mapstructure:"image,omitempty"` // Изображение для отображения в действия в интерфейсе
Groups []string `mapstructure:"groups,omitempty"` // Группы отображения действия в интерфейсе
Kind ActionKind `mapstructure:"kind,omitempty"` // Указывает на что направлено действие
Classes []string `mapstructure:"classes,omitempty"` // Классы данных к которым применимо действие (название коллекций или специальных групп в рамках которых данное действие применимо)
Refs []*references.Reference `mapstructure:"refs,omitempty"` // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
ParamsCollection string `mapstructure:"params_collection,omitempty"`
Request *ActionRequest `mapstructure:"request,omitempty"` // Параметры запроса (используется в случае `ActionResponse.next`)
NavigationAction bool `mapstructure:"navigation_action,omitempty"` // Флаг указывающий, что действие должно переносить пользователя в другую часть интерфейса, а не отправлять запрос на сервер
NavigationRoute string `mapstructure:"navigation_route,omitempty"`
Autorun bool `mapstructure:"autorun,omitempty"` // Параметр указывающий, что действие выполняется автоматически
Confirm bool `mapstructure:"confirm,omitempty"` // Параметр указывающий, что действие требует подтверждения пользователя
}
func ActionToMap(action *Action) map[string]interface{} {
res := make(map[string]interface{})
_ = mapstructure.Decode(action, &res)
res["kind"] = int64(action.Kind.Number())
res["target"] = int64(action.Target.Number())
return res
}
func ActionFromMap(d map[string]interface{}) (*Action, error) {
var action Action
err := mapstructure.Decode(d, &action)
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 ActionFromPB(a *pb.Action) *Action {
if a == nil {
return nil
}
return &Action{
Extension: a.Extension,
Action: a.Action,
Target: a.Target,
Parent: a.Parent,
Name: a.Name,
Description: a.Description,
Icon: a.Icon,
Image: references.ReferenceFromPB(a.Image),
Groups: a.Groups,
Kind: a.Kind,
Classes: a.Classes,
Refs: references.ReferenceListFromPB(a.Refs),
ParamsCollection: a.ParamsCollection,
Request: ActionRequestFromPB(a.Request),
NavigationAction: a.NavigationAction,
NavigationRoute: a.NavigationRoute,
Autorun: a.Autorun,
Confirm: a.Confirm,
}
}
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,
}
}