From 70b9b400d678655c0fb163997525af8b1b45b44c Mon Sep 17 00:00:00 2001 From: Alex Petraky <petraky@perx.ru> Date: Thu, 10 Oct 2024 09:52:56 +0000 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=9A=D0=BE=D0=BB=D0=BB=D0=B5=D0=BA?= =?UTF-8?q?=D1=86=D0=B8=D0=B8=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=20=D1=80=D0=B0=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BE=D1=84=D0=BE=D1=80=D0=BC=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=B2=20yaml=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/extension-manager/assets.go | 6 + .../collections/actions.yaml | 226 ++++++++++++++++++ .../collections/extensions.yaml | 73 ++++++ pkg/extension/schema.go | 149 +----------- pkg/extension/schema_test.go | 203 +++++++++++++--- pkg/extension/storage.go | 17 +- 6 files changed, 485 insertions(+), 189 deletions(-) create mode 100644 assets/extension-manager/assets.go create mode 100644 assets/extension-manager/collections/actions.yaml create mode 100644 assets/extension-manager/collections/extensions.yaml diff --git a/assets/extension-manager/assets.go b/assets/extension-manager/assets.go new file mode 100644 index 00000000..1fe221bb --- /dev/null +++ b/assets/extension-manager/assets.go @@ -0,0 +1,6 @@ +package extension_manager + +import "embed" + +//go:embed * +var FS embed.FS diff --git a/assets/extension-manager/collections/actions.yaml b/assets/extension-manager/collections/actions.yaml new file mode 100644 index 00000000..80f4ac1c --- /dev/null +++ b/assets/extension-manager/collections/actions.yaml @@ -0,0 +1,226 @@ +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: { } diff --git a/assets/extension-manager/collections/extensions.yaml b/assets/extension-manager/collections/extensions.yaml new file mode 100644 index 00000000..ec04234c --- /dev/null +++ b/assets/extension-manager/collections/extensions.yaml @@ -0,0 +1,73 @@ +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 diff --git a/pkg/extension/schema.go b/pkg/extension/schema.go index 83a0f142..fce794b2 100644 --- a/pkg/extension/schema.go +++ b/pkg/extension/schema.go @@ -1,149 +1,12 @@ package extension import ( - "sort" - - "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" + assets "git.perx.ru/perxis/perxis-go/assets/extension-manager" + "git.perx.ru/perxis/perxis-go/pkg/setup" ) -const ( - ExtensionsCollectionID = "space_extensions" - ExtensionsCollectionName = "Настройки/Расширения" - - ActionsCollectionID = "space_actions" - ActionsCollectionName = "Настройки/Действия" +var ( + Config = setup.NewConfig().MustLoad(assets.FS) + ExtensionsCollection = Config.Collections.Get("space_extensions").Value(nil) + ActionsCollection = Config.Collections.Get("space_actions").Value(nil) ) - -// 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, - } -} diff --git a/pkg/extension/schema_test.go b/pkg/extension/schema_test.go index 4b4f235a..e17e891e 100644 --- a/pkg/extension/schema_test.go +++ b/pkg/extension/schema_test.go @@ -2,54 +2,183 @@ package extension import ( "encoding/json" - "reflect" + "sort" "testing" "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" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) -func Test_getEnumOpt(t *testing.T) { - tests := []struct { - name string - opts map[int32]string - want []validate.EnumOpt - }{ - { - name: "#1", - opts: map[int32]string{1: "a", 2: "b", 3: "c", 1000: "w"}, - want: []validate.EnumOpt{ - {Name: "a", Value: float64(1)}, - {Name: "b", Value: float64(2)}, - {Name: "c", Value: float64(3)}, - {Name: "w", Value: float64(1000)}, - }, - }, +// NewActionsCollection Рё NewExtensionsCollection добавлены СЃСЋРґР° для тестов +// 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: 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, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := getEnumOpt(tt.opts); !reflect.DeepEqual(got, tt.want) { - t.Errorf("getEnumOpt() = %v, want %v", got, tt.want) - } - }) +} +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) { - for _, collection := range []*collections.Collection{ - NewActionsCollection("", ""), - NewExtensionsCollection("", ""), - } { - s1 := collection.Schema - b, err := s1.MarshalJSON() - require.NoError(t, err) - s2 := schema.New() - err = json.Unmarshal(b, s2) - s1.ClearState() - s2.ClearState() - require.NoError(t, err) - require.Equal(t, s1.Field, s2.Field) - } + t.Run("After marshal", func(t *testing.T) { + for _, collection := range []*collections.Collection{ + ActionsCollection, + ExtensionsCollection, + } { + s1 := collection.Schema + b, err := s1.MarshalJSON() + require.NoError(t, err) + s2 := schema.New() + err = json.Unmarshal(b, s2) + s1.ClearState() + s2.ClearState() + require.NoError(t, err) + 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, "схемы коллекции Настройки/Расширения должны совпадать") + }) } diff --git a/pkg/extension/storage.go b/pkg/extension/storage.go index 6cb8055c..c7dd6285 100644 --- a/pkg/extension/storage.go +++ b/pkg/extension/storage.go @@ -68,7 +68,7 @@ func infoFromItem(extension string, item *items.Item) *Info { // GetExtension возвращает состояние расширения РІ пространстве 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") { return nil, err } @@ -77,7 +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) { - 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()) { return nil, err } @@ -99,7 +99,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten ID: extension, SpaceID: spaceID, EnvID: envID, - CollectionID: ExtensionsCollectionID, + CollectionID: ExtensionsCollection.ID, Data: make(map[string]interface{}), } @@ -110,7 +110,7 @@ func (s *storage) SetExtension(ctx context.Context, spaceID, envID string, exten _ = item.Set("status_msg", status.Msg) _ = 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 { _, err := s.content.Items.Create(ctx, item) return err @@ -125,7 +125,7 @@ func (s *storage) DeleteExtension(ctx context.Context, spaceID, envID string, ex ID: extension, SpaceID: spaceID, EnvID: envID, - CollectionID: ExtensionsCollectionID, + CollectionID: ExtensionsCollection.ID, } return s.content.Items.Delete(ctx, item) } @@ -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 { // миграция окружения РЅРµ должна запуститься, поскольку окружение может быть сломано // расширениями - РЅСѓР¶РЅРѕ дать возможность восстановиться - stp := setup.NewSetup(s.content, spaceID, envID, s.logger).AddCollections([]*collections.Collection{ - NewExtensionsCollection(spaceID, envID), - NewActionsCollection(spaceID, envID), - }, setup.SkipMigration()) + cfg := Config.Clone() + cfg.Collections.WithOptions(func(c *collections.Collection) bool { return true }, setup.SkipMigration()) + stp := setup.NewSetup(s.content, spaceID, envID, s.logger).WithConfig(cfg) return stp.Install(ctx) } -- GitLab