diff --git a/pkg/collections/collection.go b/pkg/collections/collection.go index dfe5d66ed4a5b96f4f99118a6842488a2bc94735..ddb73ecad0151b3f185f069ed503f0b4ba4d9165 100644 --- a/pkg/collections/collection.go +++ b/pkg/collections/collection.go @@ -176,6 +176,10 @@ func (c Collection) IsNoData() bool { return c.NoData != nil && *c.NoData } +func (c Collection) IsSystem() bool { + return c.System != nil && *c.System +} + func (c Collection) IsView() bool { return c.View != nil } diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go index d1c354d330ad10f866852286d9e4354e775673ac..b52c32d18c95acbba856d8280473f02f8824c4be 100644 --- a/pkg/setup/collection.go +++ b/pkg/setup/collection.go @@ -6,6 +6,7 @@ import ( "strings" "git.perx.ru/perxis/perxis-go/pkg/collections" + "git.perx.ru/perxis/perxis-go/pkg/data" "git.perx.ru/perxis/perxis-go/pkg/environments" "git.perx.ru/perxis/perxis-go/pkg/errors" "git.perx.ru/perxis/perxis-go/pkg/extension" @@ -31,7 +32,7 @@ type CollectionConfig struct { func NewCollectionConfig(collection *collections.Collection, opt ...CollectionsOption) CollectionConfig { c := CollectionConfig{collection: collection} - DefaultUpdateCollStrategy()(&c) + DefaultUpdateCollectionStrategy()(&c) DeleteCollectionIfRemove()(&c) for _, o := range opt { @@ -69,20 +70,29 @@ func DeleteCollectionIfRemove() CollectionsOption { } } -func DefaultUpdateCollStrategy() CollectionsOption { +func DefaultUpdateCollectionStrategy() CollectionsOption { return func(c *CollectionConfig) { c.UpdateFn = func(s *Setup, exist, collection *collections.Collection) (*collections.Collection, bool, bool, error) { - if len(exist.Tags) > 0 { - collection.Tags = append(exist.Tags, collection.Tags...) - } - if !s.IsForce() && !collection.IsView() && !exist.IsView() && collection.Schema.Metadata != nil && collection.Schema.Metadata[extension.ExtensionMetadataKey] != "" { if exist.Schema.Metadata == nil || exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] { return nil, false, false, collections.ErrAlreadyExists } } - return collection, true, !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema), nil + if len(exist.Tags) > 0 { + collection.Tags = data.SetFromSlice(append(exist.Tags, collection.Tags...)) + } + + var update, setSchema bool + update = collection.Name != exist.Name || collection.IsSingle() != exist.IsSingle() || collection.IsSystem() != exist.IsSystem() || + collection.IsNoData() != exist.IsNoData() || collection.Hidden != exist.Hidden || collection.IsView() != exist.IsView() && data.ElementsMatch(exist.Tags, collection.Tags) + + if exist.View != nil && collection.View != nil { + update = update && *exist.View == *collection.View + } + setSchema = !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema) + + return collection, update, setSchema, nil } } } diff --git a/pkg/setup/setup_test.go b/pkg/setup/setup_test.go index 162c5188bed62bcedc0be8afcfc462962ed43e86..99c11e7a122b1f45df501bbf405936ee00750f7f 100644 --- a/pkg/setup/setup_test.go +++ b/pkg/setup/setup_test.go @@ -181,15 +181,9 @@ func TestSetupInstall(t *testing.T) { envMocks := &environmentMock.Environments{} collsMock := &collectionMock.Collections{} - for _, collection := range getCollections() { - collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID). - Return(collection, nil). - Once() - - collsMock.On("Update", mock.Anything, collection). - Return(nil). - Once() - } + collsMock.On("Get", mock.Anything, spaceID, envID, "coll1"). + Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once() + collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once() rMock := &rolesMock.Roles{} for _, role := range getRoles() { @@ -247,15 +241,9 @@ func TestSetupInstall(t *testing.T) { t.Run("Success, with force", func(t *testing.T) { collsMock := &collectionMock.Collections{} - for _, collection := range getCollections() { - collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID). - Return(collection, nil). - Once() - - collsMock.On("Update", mock.Anything, collection). - Return(nil). - Once() - } + collsMock.On("Get", mock.Anything, spaceID, envID, "coll1"). + Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once() + collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once() rMock := &rolesMock.Roles{} for _, role := range getRoles() { @@ -453,15 +441,8 @@ func TestSetupInstall(t *testing.T) { t.Run("Can't update collection, storage returns error", func(t *testing.T) { collsMock := &collectionMock.Collections{} - for _, collection := range getCollections() { - collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID). - Return(collection, nil). - Once() - - collsMock.On("Update", mock.Anything, collection). - Return(errors.New("can't update collection")). - Once() - } + collsMock.On("Get", mock.Anything, spaceID, envID, "coll1").Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция 00"}, nil).Once() + collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(errors.New("can't update collection")).Once() rMock := &rolesMock.Roles{} for _, role := range getRoles() {