Skip to content
Snippets Groups Projects
Commit 0b470109 authored by Alena Petraki's avatar Alena Petraki
Browse files

Merge branch 'master' into feaature/PRXS-1619-SyncAsyncOperations

# Conflicts:
#	perxis-proto
parents 1d9ec625 7605d499
Branches
Tags
No related merge requests found
...@@ -69,6 +69,7 @@ var SystemFields = []string{ ...@@ -69,6 +69,7 @@ var SystemFields = []string{
"updated_at", "updated_at",
"updated_by", "updated_by",
"revision_id", "revision_id",
"revision_description",
"data", "data",
"translations", "translations",
"locale", "locale",
...@@ -100,6 +101,7 @@ type Item struct { ...@@ -100,6 +101,7 @@ type Item struct {
Locale string `json:"locale" bson:"-"` Locale string `json:"locale" bson:"-"`
Translations map[string]map[string]interface{} `json:"translations" bson:"translations,omitempty"` Translations map[string]map[string]interface{} `json:"translations" bson:"translations,omitempty"`
RevisionID string `json:"revId,omitempty" bson:"revision_id"` RevisionID string `json:"revId,omitempty" bson:"revision_id"`
RevisionDescription string `json:"revDescription,omitempty" bson:"revision_description"`
Permissions *Permissions `json:"permissions,omitempty" bson:"-"` Permissions *Permissions `json:"permissions,omitempty" bson:"-"`
// Флаги записи // Флаги записи
...@@ -146,6 +148,7 @@ func (i *Item) ToMap() map[string]interface{} { ...@@ -146,6 +148,7 @@ func (i *Item) ToMap() map[string]interface{} {
"updated_at": i.UpdatedAt, "updated_at": i.UpdatedAt,
"updated_by": i.UpdatedBy, "updated_by": i.UpdatedBy,
"revision_id": i.RevisionID, "revision_id": i.RevisionID,
"revision_description": i.RevisionDescription,
"data": i.Data, "data": i.Data,
"translations": i.Translations, "translations": i.Translations,
"locale": i.Locale, "locale": i.Locale,
...@@ -304,6 +307,8 @@ func (i *Item) SetSystemField(field string, value interface{}) error { ...@@ -304,6 +307,8 @@ func (i *Item) SetSystemField(field string, value interface{}) error {
i.UpdatedAt, ok = value.(time.Time) i.UpdatedAt, ok = value.(time.Time)
case "revision_id": case "revision_id":
i.RevisionID, ok = value.(string) i.RevisionID, ok = value.(string)
case "revision_description":
i.RevisionDescription, ok = value.(string)
case "hidden": case "hidden":
i.Hidden, ok = value.(bool) i.Hidden, ok = value.(bool)
case "deleted": case "deleted":
...@@ -344,6 +349,8 @@ func (i *Item) GetSystem(field string) (any, error) { ...@@ -344,6 +349,8 @@ func (i *Item) GetSystem(field string) (any, error) {
return i.UpdatedAt, nil return i.UpdatedAt, nil
case "revision_id": case "revision_id":
return i.RevisionID, nil return i.RevisionID, nil
case "revision_description":
return i.RevisionDescription, nil
case "hidden": case "hidden":
return i.Hidden, nil return i.Hidden, nil
case "deleted": case "deleted":
...@@ -394,7 +401,7 @@ func (i *Item) Get(field string) (any, error) { ...@@ -394,7 +401,7 @@ func (i *Item) Get(field string) (any, error) {
// GetSystemField возвращает описание поля для системных аттрибутов Item // GetSystemField возвращает описание поля для системных аттрибутов Item
func GetSystemField(fld string) (*field.Field, error) { func GetSystemField(fld string) (*field.Field, error) {
switch fld { switch fld {
case "id", "space_id", "env_id", "collection_id", "revision_id": case "id", "space_id", "env_id", "collection_id", "revision_id", "revision_description":
return field.String(), nil return field.String(), nil
case "created_rev_at", "created_at", "updated_at", "published_at": case "created_rev_at", "created_at", "updated_at", "published_at":
return field.Time(), nil return field.Time(), nil
...@@ -447,6 +454,7 @@ func ItemToProto(item *Item) *pb.Item { ...@@ -447,6 +454,7 @@ func ItemToProto(item *Item) *pb.Item {
CreatedBy: item.CreatedBy, CreatedBy: item.CreatedBy,
UpdatedBy: item.UpdatedBy, UpdatedBy: item.UpdatedBy,
RevisionId: item.RevisionID, RevisionId: item.RevisionID,
RevisionDescription: item.RevisionDescription,
Locale: item.Locale, Locale: item.Locale,
Hidden: item.Hidden, Hidden: item.Hidden,
Template: item.Template, Template: item.Template,
...@@ -495,6 +503,7 @@ func ItemFromProto(protoItem *pb.Item) *Item { ...@@ -495,6 +503,7 @@ func ItemFromProto(protoItem *pb.Item) *Item {
CreatedBy: protoItem.CreatedBy, CreatedBy: protoItem.CreatedBy,
UpdatedBy: protoItem.UpdatedBy, UpdatedBy: protoItem.UpdatedBy,
RevisionID: protoItem.RevisionId, RevisionID: protoItem.RevisionId,
RevisionDescription: protoItem.RevisionDescription,
Locale: protoItem.Locale, Locale: protoItem.Locale,
Hidden: protoItem.Hidden, Hidden: protoItem.Hidden,
Template: protoItem.Template, Template: protoItem.Template,
......
package walk package walk
import "reflect"
func GenericMerge(c *WalkContext) (err error) { func GenericMerge(c *WalkContext) (err error) {
return return
} }
func KeepSrc(c *WalkContext) (err error) { func KeepSrc(c *WalkContext) (err error) {
if reflect.DeepEqual(c.Src, c.Dst) {
return
}
c.Dst = c.Src c.Dst = c.Src
c.Changed = true c.Changed = true
return return
......
...@@ -46,6 +46,54 @@ func TestWalker_DataWalk(t *testing.T) { ...@@ -46,6 +46,54 @@ func TestWalker_DataWalk(t *testing.T) {
wantErr bool wantErr bool
}{ }{
{"generic", {"generic",
&WalkConfig{
Fields: map[string]FieldConfig{},
},
map[string]interface{}{
"a": "src_a",
"b": "src_b",
"obj1": map[string]interface{}{
"a": "src_obj1_a",
"b": "src_obj1_b",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
"obj3": map[string]interface{}{
"e": "dst_obj1_obj3_e",
},
},
"inline_str_1": "src_inline_1",
"inline_str_2": "src_inline_2",
"slice": []interface{}{"src_s1", "src_s2"},
},
map[string]interface{}{
"a": "dst_a",
"field_not_extists": "remove",
"obj1": map[string]interface{}{
"a": "dst_obj1_a",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
},
"inline_str_1": "dst_inline_1",
"inline_str_2": "dst_inline_2",
"slice": []interface{}{"dst_s1", "dst_s2", "dst_s3"},
},
map[string]interface{}{
"a": "dst_a",
"obj1": map[string]interface{}{
"a": "dst_obj1_a",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
},
"inline_str_1": "dst_inline_1",
"inline_str_2": "dst_inline_2",
"slice": []interface{}{"dst_s1", "dst_s2", "dst_s3"},
},
false, false,
},
{"keep src changed",
&WalkConfig{ &WalkConfig{
Fields: map[string]FieldConfig{ Fields: map[string]FieldConfig{
"obj1.a": {Fn: KeepSrc}, "obj1.a": {Fn: KeepSrc},
...@@ -96,6 +144,68 @@ func TestWalker_DataWalk(t *testing.T) { ...@@ -96,6 +144,68 @@ func TestWalker_DataWalk(t *testing.T) {
"inline_str_2": "src_inline_2", "inline_str_2": "src_inline_2",
"slice": []interface{}{"dst_s1", "src_s2", "dst_s3"}, "slice": []interface{}{"dst_s1", "src_s2", "dst_s3"},
}, },
true, false,
},
{"keep src not changed",
&WalkConfig{
Fields: map[string]FieldConfig{
"obj1.a": {Fn: KeepSrc},
"slice.1": {Fn: KeepSrc},
"inline_str_1": {Fn: KeepSrc},
"inline_str_2": {Fn: KeepSrc},
},
},
map[string]interface{}{
"a": "src_a",
"b": "src_b",
"obj1": map[string]interface{}{
"a": "src_obj1_a",
"b": "src_obj1_b",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
"obj3": map[string]interface{}{
"e": "dst_obj1_obj3_e",
},
},
"inline_str_1": "src_inline_1",
"inline_str_2": "src_inline_2",
"slice": []interface{}{"src_s1", "src_s2"},
},
map[string]interface{}{
"a": "src_a",
"b": "src_b",
"obj1": map[string]interface{}{
"a": "src_obj1_a",
"b": "src_obj1_b",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
"obj3": map[string]interface{}{
"e": "dst_obj1_obj3_e",
},
},
"inline_str_1": "src_inline_1",
"inline_str_2": "src_inline_2",
"slice": []interface{}{"src_s1", "src_s2"},
},
map[string]interface{}{
"a": "src_a",
"b": "src_b",
"obj1": map[string]interface{}{
"a": "src_obj1_a",
"b": "src_obj1_b",
"obj2": map[string]interface{}{
"a": "dst_obj1_obj2_a",
},
"obj3": map[string]interface{}{
"e": "dst_obj1_obj3_e",
},
},
"inline_str_1": "src_inline_1",
"inline_str_2": "src_inline_2",
"slice": []interface{}{"src_s1", "src_s2"},
},
false, false, false, false,
}, },
} }
...@@ -103,11 +213,12 @@ func TestWalker_DataWalk(t *testing.T) { ...@@ -103,11 +213,12 @@ func TestWalker_DataWalk(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
m := NewWalker(s, tt.config) m := NewWalker(s, tt.config)
dst := tt.dst dst := tt.dst
res, _, err := m.DataWalk(context.Background(), dst, tt.src) res, chg, err := m.DataWalk(context.Background(), dst, tt.src)
assert.Equal(t, tt.res, res)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
} else { } else {
assert.Equal(t, tt.res, res)
assert.Equal(t, tt.wantChanged, chg)
require.NoError(t, err) require.NoError(t, err)
} }
}) })
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment