Skip to content
Snippets Groups Projects
Commit 70b9b400 authored by Alex Petraky's avatar Alex Petraky :basketball_player_tone1: Committed by Pavel Antonov
Browse files

chore: Коллекции менеджера расширений оформлены в yaml файлах

parent e58fe356
No related branches found
No related tags found
No related merge requests found
package extension_manager
import "embed"
//go:embed *
var FS embed.FS
id: space_actions
name: Настройки/Действия
hidden: true
schema:
ui:
options:
fields:
- action
- extension
- name
- description
- icon
- image
- kind
- autorun
- confirm
- target
- view
- parent
- order
- groups
- classes
- refs
- params_collection
- navigation_action
- navigation_route
title: name
subtitle: action
collection_icon: SettingOutlined/RocketOutlined
list_view:
options:
fields:
- icon
- name
- action
- kind
- updated_at
- updated_by
- state
sort:
- name
page_size: 50
includes:
- ref: hoop_item_options
optional: true
single_locale: true
type: object
params:
inline: false
fields:
navigation_action:
title: Навигация (Deprecated)
description: Выполняется переход пользователя в пользовательском интерфейсе
ui:
widget: Checkbox
type: bool
params: { }
navigation_route:
title: Путь в интерфейсе (Deprecated)
type: string
params: { }
image:
title: Изображение
ui:
widget: Media
type: reference
params:
allowedCollections:
- media
autorun:
title: Автозапуск
description: Действие выполняется автоматически каждый раз при загрузке приложения
ui:
widget: Checkbox
type: bool
params: { }
target:
title: Отображение результата действия
ui:
widget: Select
options:
enum:
- name: DEFAULT
value: 0
- name: MODAL
value: 1
- name: WIDE
value: 2
- name: MAIN
value: 4
- name: DRAWER
value: 5
- name: NOTIFICATION
value: 6
- name: BLANK
value: 7
- name: NONE
value: 100
type: number
params:
format: int
params_collection:
title: Коллекция параметров
description: ID коллекции для хранения параметров действия
ui:
widget: Collection
type: string
params: { }
classes:
title: Класс
description: Классы данных, к которым применимо действие
ui:
widget: SelectList
indexed: true
type: array
params:
item:
additional_values: true
type: string
params: { }
name:
title: Название
text_search: true
type: string
params: { }
confirm:
title: С подтверждением
description: Пользователь должен подтвердить запуск действия
ui:
widget: Checkbox
type: bool
params: { }
order:
title: Порядок отображения
description: Порядок отображения действия в интерфейсе (Для пунктов меню)
type: number
params:
format: int
groups:
title: Группы
description: Группировка действий в пользовательском интерфейсе
ui:
widget: SelectList
type: array
params:
item:
additional_values: true
type: string
params: { }
kind:
title: Вид
ui:
widget: Select
options:
enum:
- name: DEFAULT
value: 0
- name: SPACE
value: 1
- name: ENVIRONMENT
value: 2
- name: COLLECTION
value: 3
- name: ITEM
value: 4
- name: ITEMS
value: 5
- name: REVISION
value: 6
- name: CREATE
value: 7
type: number
params:
format: int
view:
title: Отображение действия в интерфейсе
ui:
widget: Select
options:
enum:
- name: DEFAULT_VIEW
value: 0
- name: HIDDEN_VIEW
value: 1
- name: MAIN_MENU_VIEW
value: 2
- name: MAIN_MENU_BOTTOM_VIEW
value: 3
type: number
params:
format: int
parent:
title: Идентификатор родительского действия
type: string
params: { }
refs:
title: Ссылки
ui:
widget: BlockList
type: array
params:
item:
type: reference
params:
allowedCollections:
action:
title: Действие
text_search: true
options:
required: true
type: string
params: { }
extension:
title: Расширение (Deprecated)
type: string
params: { }
description:
title: Описание
type: string
params: { }
icon:
title: Название иконки
ui:
widget: Icon
type: string
params: { }
id: space_extensions
name: Настройки/Расширения
hidden: true
schema:
ui:
options:
fields:
- id
- title
- version
- status_error
- status_msg
- extension_state
title: title
subtitle: id
key: id
collection_icon: SettingOutlined/ApiOutlined
list_view:
options:
fields:
- id
- title
- extension_state
- updated_at
- updated_by
sort:
- title
page_size: 50
single_locale: true
type: object
params:
inline: false
fields:
id:
title: Расширение
unique: true
options:
required: true
type: string
params: { }
title:
title: Название
type: string
params: { }
version:
title: Установленная версия
type: string
params: { }
status_error:
title: Ошибка
type: string
params: { }
status_msg:
title: Сообщение
type: string
params: { }
extension_state:
title: Состояние
ui:
widget: Select
options:
enum:
- name: INSTALLED
value: 1
- name: FAIL
value: 3
- name: PENDING
value: 4
- name: IN_PROGRESS
value: 2
type: number
params:
format: int
package extension package extension
import ( import (
"sort" assets "git.perx.ru/perxis/perxis-go/assets/extension-manager"
"git.perx.ru/perxis/perxis-go/pkg/setup"
"git.perx.ru/perxis/perxis-go/pkg/collections"
"git.perx.ru/perxis/perxis-go/pkg/references"
"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"
) )
const ( var (
ExtensionsCollectionID = "space_extensions" Config = setup.NewConfig().MustLoad(assets.FS)
ExtensionsCollectionName = "Настройки/Расширения" ExtensionsCollection = Config.Collections.Get("space_extensions").Value(nil)
ActionsCollection = Config.Collections.Get("space_actions").Value(nil)
ActionsCollectionID = "space_actions"
ActionsCollectionName = "Настройки/Действия"
) )
// NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
func NewActionsCollection(spaceID, envID string) *collections.Collection {
sch := schema.New(
"action", field.String(validate.Required()).SetTitle("Действие").SetTextSearch(true),
"extension", field.String().SetTitle("Расширение (Deprecated)"),
"name", field.String().SetTitle("Название").SetTextSearch(true),
"description", field.String().SetTitle("Описание"),
"icon", field.String().SetTitle("Название иконки").WithUI(&field.UI{Widget: "Icon"}),
"image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
"kind", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(ActionKindName)...),
).SetTitle("Вид").WithUI(&field.UI{Widget: "Select"}),
"autorun", field.Bool().SetTitle("Автозапуск").
SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
WithUI(&field.UI{Widget: "Checkbox"}),
"confirm", field.Bool().SetTitle("С подтверждением").
SetDescription("Пользователь должен подтвердить запуск действия").
WithUI(&field.UI{Widget: "Checkbox"}),
"target", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(ActionTargetName)...),
).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
"view", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(ActionViewName)...),
).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
"parent", field.String().SetTitle("Идентификатор родительского действия"),
"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
SetDescription("Группировка действий в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "SelectList"}),
"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
WithUI(&field.UI{Widget: "SelectList"}).
SetDescription("Классы данных, к которым применимо действие").
SetIndexed(true),
"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
WithUI(&field.UI{Widget: "BlockList"}),
"params_collection", field.String().SetTitle("Коллекция параметров").
SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
"navigation_action", field.Bool().SetTitle("Навигация (Deprecated)").
SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "Checkbox"}),
"navigation_route", field.String().SetTitle("Путь в интерфейсе (Deprecated)"),
).SetSingleLocale(true)
// Includes
sch.SetIncludes(
field.Include{Ref: "hoop_item_options", Optional: true},
)
// UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []interface{}{"icon", "name", "action", "kind", "updated_at", "updated_by", "state"},
"sort": []interface{}{"name"},
"page_size": float64(50),
}}
sch.Field.UI.Options["title"] = "name"
sch.Field.UI.Options["subtitle"] = "action"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
return &collections.Collection{
ID: ActionsCollectionID,
SpaceID: spaceID,
EnvID: envID,
Name: ActionsCollectionName,
Schema: sch,
Hidden: true,
}
}
func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
keys := make([]int32, 0, len(opts))
for k := range opts {
keys = append(keys, k)
}
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
})
enum := make([]validate.EnumOpt, len(opts))
for i, n := range keys {
enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
}
return enum
}
// NewExtensionsCollection - создает коллекцию для хранения статусов расширений в пространстве
func NewExtensionsCollection(spaceID, envID string) *collections.Collection {
sch := schema.New(
"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
"title", field.String().SetTitle("Название"),
"version", field.String().SetTitle("Установленная версия"),
"status_error", field.String().SetTitle("Ошибка"),
"status_msg", field.String().SetTitle("Сообщение"),
"extension_state", field.Number(
field.NumberFormatInt,
validate.Enum(
validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
),
).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
).SetSingleLocale(true)
// UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []interface{}{"id", "title", "extension_state", "updated_at", "updated_by"},
"sort": []interface{}{"title"},
"page_size": float64(50),
}}
sch.Field.UI.Options["title"] = "title"
sch.Field.UI.Options["subtitle"] = "id"
sch.Field.UI.Options["key"] = "id"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
return &collections.Collection{
ID: ExtensionsCollectionID,
SpaceID: spaceID,
EnvID: envID,
Name: ExtensionsCollectionName,
Schema: sch,
Hidden: true,
}
}
...@@ -2,45 +2,153 @@ package extension ...@@ -2,45 +2,153 @@ package extension
import ( import (
"encoding/json" "encoding/json"
"reflect" "sort"
"testing" "testing"
"git.perx.ru/perxis/perxis-go/pkg/collections" "git.perx.ru/perxis/perxis-go/pkg/collections"
"git.perx.ru/perxis/perxis-go/pkg/references"
"git.perx.ru/perxis/perxis-go/pkg/schema" "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" "git.perx.ru/perxis/perxis-go/pkg/schema/validate"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func Test_getEnumOpt(t *testing.T) { // NewActionsCollection и NewExtensionsCollection добавлены сюда для тестов
tests := []struct { // NewActionsCollection - создает коллекцию для хранения действий расширений в пространстве
name string func NewActionsCollection(spaceID, envID string) *collections.Collection {
opts map[int32]string sch := schema.New(
want []validate.EnumOpt "action", field.String(validate.Required()).SetTitle("Действие").SetTextSearch(true),
}{ "extension", field.String().SetTitle("Расширение (Deprecated)"),
{ "name", field.String().SetTitle("Название").SetTextSearch(true),
name: "#1", "description", field.String().SetTitle("Описание"),
opts: map[int32]string{1: "a", 2: "b", 3: "c", 1000: "w"}, "icon", field.String().SetTitle("Название иконки").WithUI(&field.UI{Widget: "Icon"}),
want: []validate.EnumOpt{ "image", references.Field([]string{"media"}).SetTitle("Изображение").WithUI(&field.UI{Widget: "Media"}),
{Name: "a", Value: float64(1)}, "kind", field.Number(
{Name: "b", Value: float64(2)}, field.NumberFormatInt,
{Name: "c", Value: float64(3)}, validate.Enum(getEnumOpt(ActionKindName)...),
{Name: "w", Value: float64(1000)}, ).SetTitle("Вид").WithUI(&field.UI{Widget: "Select"}),
}, "autorun", field.Bool().SetTitle("Автозапуск").
}, SetDescription("Действие выполняется автоматически каждый раз при загрузке приложения").
} WithUI(&field.UI{Widget: "Checkbox"}),
for _, tt := range tests { "confirm", field.Bool().SetTitle("С подтверждением").
t.Run(tt.name, func(t *testing.T) { SetDescription("Пользователь должен подтвердить запуск действия").
if got := getEnumOpt(tt.opts); !reflect.DeepEqual(got, tt.want) { WithUI(&field.UI{Widget: "Checkbox"}),
t.Errorf("getEnumOpt() = %v, want %v", got, tt.want) "target", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(ActionTargetName)...),
).SetTitle("Отображение результата действия").WithUI(&field.UI{Widget: "Select"}),
"view", field.Number(
field.NumberFormatInt,
validate.Enum(getEnumOpt(ActionViewName)...),
).SetTitle("Отображение действия в интерфейсе").WithUI(&field.UI{Widget: "Select"}),
"parent", field.String().SetTitle("Идентификатор родительского действия"),
"order", field.Number(field.NumberFormatInt).SetTitle("Порядок отображения").
SetDescription("Порядок отображения действия в интерфейсе (Для пунктов меню)"),
"groups", field.Array(field.String().SetAdditionalValues()).SetTitle("Группы").
SetDescription("Группировка действий в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "SelectList"}),
"classes", field.Array(field.String().SetAdditionalValues()).SetTitle("Класс").
WithUI(&field.UI{Widget: "SelectList"}).
SetDescription("Классы данных, к которым применимо действие").
SetIndexed(true),
"refs", field.Array(references.Field(nil)).SetTitle("Ссылки").
WithUI(&field.UI{Widget: "BlockList"}),
"params_collection", field.String().SetTitle("Коллекция параметров").
SetDescription("ID коллекции для хранения параметров действия").WithUI(&field.UI{Widget: "Collection"}),
"navigation_action", field.Bool().SetTitle("Навигация (Deprecated)").
SetDescription("Выполняется переход пользователя в пользовательском интерфейсе").
WithUI(&field.UI{Widget: "Checkbox"}),
"navigation_route", field.String().SetTitle("Путь в интерфейсе (Deprecated)"),
).SetSingleLocale(true)
// Includes
sch.SetIncludes(
field.Include{Ref: "hoop_item_options", Optional: true},
)
// UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []interface{}{"icon", "name", "action", "kind", "updated_at", "updated_by", "state"},
"sort": []interface{}{"name"},
"page_size": float64(50),
}}
sch.Field.UI.Options["title"] = "name"
sch.Field.UI.Options["subtitle"] = "action"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/RocketOutlined"
return &collections.Collection{
ID: ActionsCollection.ID,
SpaceID: spaceID,
EnvID: envID,
Name: ActionsCollection.Name,
Schema: sch,
Hidden: true,
}
}
// NewExtensionsCollection - создает коллекцию для хранения статусов расширений в пространстве
func NewExtensionsCollection(spaceID, envID string) *collections.Collection {
sch := schema.New(
"id", field.String(validate.Required()).SetUnique(true).SetTitle("Расширение"),
"title", field.String().SetTitle("Название"),
"version", field.String().SetTitle("Установленная версия"),
"status_error", field.String().SetTitle("Ошибка"),
"status_msg", field.String().SetTitle("Сообщение"),
"extension_state", field.Number(
field.NumberFormatInt,
validate.Enum(
validate.EnumOpt{Name: StateInstalled.String(), Value: float64(StateInstalled)},
validate.EnumOpt{Name: StateFail.String(), Value: float64(StateFail)},
validate.EnumOpt{Name: StatePending.String(), Value: float64(StatePending)},
validate.EnumOpt{Name: StateInProgress.String(), Value: float64(StateInProgress)},
),
).SetTitle("Состояние").WithUI(&field.UI{Widget: "Select"}),
).SetSingleLocale(true)
// UI
sch.Field.UI.ListView = &field.View{Options: map[string]interface{}{
"fields": []interface{}{"id", "title", "extension_state", "updated_at", "updated_by"},
"sort": []interface{}{"title"},
"page_size": float64(50),
}}
sch.Field.UI.Options["title"] = "title"
sch.Field.UI.Options["subtitle"] = "id"
sch.Field.UI.Options["key"] = "id"
sch.Field.UI.Options["collection_icon"] = "SettingOutlined/ApiOutlined"
return &collections.Collection{
ID: ExtensionsCollection.ID,
SpaceID: spaceID,
EnvID: envID,
Name: ExtensionsCollection.Name,
Schema: sch,
Hidden: true,
}
}
func getEnumOpt(opts map[int32]string) []validate.EnumOpt {
keys := make([]int32, 0, len(opts))
for k := range opts {
keys = append(keys, k)
} }
sort.Slice(keys, func(i, j int) bool {
return keys[i] < keys[j]
}) })
enum := make([]validate.EnumOpt, len(opts))
for i, n := range keys {
enum[i] = validate.EnumOpt{Name: opts[n], Value: float64(n)}
} }
return enum
} }
func TestEqualSchema(t *testing.T) { func TestEqualSchema(t *testing.T) {
t.Run("After marshal", func(t *testing.T) {
for _, collection := range []*collections.Collection{ for _, collection := range []*collections.Collection{
NewActionsCollection("", ""), ActionsCollection,
NewExtensionsCollection("", ""), ExtensionsCollection,
} { } {
s1 := collection.Schema s1 := collection.Schema
b, err := s1.MarshalJSON() b, err := s1.MarshalJSON()
...@@ -52,4 +160,25 @@ func TestEqualSchema(t *testing.T) { ...@@ -52,4 +160,25 @@ func TestEqualSchema(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, s1.Field, s2.Field) require.Equal(t, s1.Field, s2.Field)
} }
})
t.Run("ActionsCollection", func(t *testing.T) {
coll := NewActionsCollection("", "")
schOld := coll.Schema
schNew := ActionsCollection.Schema
_ = schOld.ConvertTypes()
schOld.ClearState()
_ = schNew.ConvertTypes()
schNew.ClearState()
assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Действия должны совпадать")
})
t.Run("ExtensionsCollection", func(t *testing.T) {
coll := NewExtensionsCollection("", "")
schOld := coll.Schema
schNew := ExtensionsCollection.Schema
_ = schOld.ConvertTypes()
schOld.ClearState()
_ = schNew.ConvertTypes()
schNew.ClearState()
assert.Equal(t, schOld, schNew, "схемы коллекции Настройки/Расширения должны совпадать")
})
} }
...@@ -68,7 +68,7 @@ func infoFromItem(extension string, item *items.Item) *Info { ...@@ -68,7 +68,7 @@ func infoFromItem(extension string, item *items.Item) *Info {
// GetExtension возвращает состояние расширения в пространстве // GetExtension возвращает состояние расширения в пространстве
func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, extension string) (*Info, error) { func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, extension string) (*Info, error) {
res, err := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension) res, err := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollection.ID, extension)
if err != nil && !strings.Contains(err.Error(), "not found") { if err != nil && !strings.Contains(err.Error(), "not found") {
return nil, err return nil, err
} }
...@@ -77,7 +77,7 @@ func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, exten ...@@ -77,7 +77,7 @@ func (s *storage) GetExtension(ctx context.Context, spaceID, envID string, exten
// FindExtensions возвращает состояния расширений в пространстве // FindExtensions возвращает состояния расширений в пространстве
func (s *storage) FindExtensions(ctx context.Context, spaceID, envID string, extensions ...string) ([]*Info, error) { func (s *storage) FindExtensions(ctx context.Context, spaceID, envID string, extensions ...string) ([]*Info, error) {
itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollectionID, &items.Filter{ID: extensions}) itms, _, err := s.content.Items.Find(ctx, spaceID, envID, ExtensionsCollection.ID, &items.Filter{ID: extensions})
if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) { if err != nil && !strings.Contains(err.Error(), collections.ErrNotFound.Error()) {
return nil, err return nil, err
} }
...@@ -99,7 +99,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten ...@@ -99,7 +99,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
ID: extension, ID: extension,
SpaceID: spaceID, SpaceID: spaceID,
EnvID: envID, EnvID: envID,
CollectionID: ExtensionsCollectionID, CollectionID: ExtensionsCollection.ID,
Data: make(map[string]interface{}), Data: make(map[string]interface{}),
} }
...@@ -110,7 +110,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten ...@@ -110,7 +110,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten
_ = item.Set("status_msg", status.Msg) _ = item.Set("status_msg", status.Msg)
_ = item.Set("status_error", status.Error) _ = item.Set("status_error", status.Error)
i, _ := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollectionID, extension) i, _ := s.content.Items.Get(ctx, spaceID, envID, ExtensionsCollection.ID, extension)
if i == nil { if i == nil {
_, err := s.content.Items.Create(ctx, item) _, err := s.content.Items.Create(ctx, item)
return err return err
...@@ -125,7 +125,7 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex ...@@ -125,7 +125,7 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex
ID: extension, ID: extension,
SpaceID: spaceID, SpaceID: spaceID,
EnvID: envID, EnvID: envID,
CollectionID: ExtensionsCollectionID, CollectionID: ExtensionsCollection.ID,
} }
return s.content.Items.Delete(ctx, item) return s.content.Items.Delete(ctx, item)
} }
...@@ -133,9 +133,8 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex ...@@ -133,9 +133,8 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex
func (s *storage) init(ctx context.Context, spaceID, envID string) error { func (s *storage) init(ctx context.Context, spaceID, envID string) error {
// миграция окружения не должна запуститься, поскольку окружение может быть сломано // миграция окружения не должна запуститься, поскольку окружение может быть сломано
// расширениями - нужно дать возможность восстановиться // расширениями - нужно дать возможность восстановиться
stp := setup.NewSetup(s.content, spaceID, envID, s.logger).AddCollections([]*collections.Collection{ cfg := Config.Clone()
NewExtensionsCollection(spaceID, envID), cfg.Collections.WithOptions(func(c *collections.Collection) bool { return true }, setup.SkipMigration())
NewActionsCollection(spaceID, envID), stp := setup.NewSetup(s.content, spaceID, envID, s.logger).WithConfig(cfg)
}, setup.SkipMigration())
return stp.Install(ctx) return stp.Install(ctx)
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment