From f3bfae44381ee743631464bde11a764c59e0d56e Mon Sep 17 00:00:00 2001 From: Alena Petraki <a.petraki@perx.ru> Date: Fri, 28 Jun 2024 17:36:13 +0000 Subject: [PATCH] =?UTF-8?q?Revert=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20=D1=81=D0=B8=D0=B3=D0=BD=D0=B0=D1=82=D1=83?= =?UTF-8?q?=D1=80=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20Item=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20localizer'=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pkg/items/item.go | 66 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/pkg/items/item.go b/pkg/items/item.go index 52cc0e36..c0a0ef93 100644 --- a/pkg/items/item.go +++ b/pkg/items/item.go @@ -3,14 +3,13 @@ package items import ( "context" "fmt" + "reflect" "time" "git.perx.ru/perxis/perxis-go/pkg/data" "git.perx.ru/perxis/perxis-go/pkg/errors" - "git.perx.ru/perxis/perxis-go/pkg/locales" "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/localizer" pb "git.perx.ru/perxis/perxis-go/proto/items" "google.golang.org/protobuf/types/known/structpb" "google.golang.org/protobuf/types/known/timestamppb" @@ -162,21 +161,23 @@ func (i *Item) ToMap() map[string]interface{} { } } -func (i *Item) SetData(data map[string]interface{}, localizer *localizer.Localizer) (err error) { - if localizer != nil && localizer.LocaleID != locales.DefaultID { - i.Translations[localizer.LocaleID], err = localizer.ExtractTranslation(i.Data, i.Translations) +func (i *Item) SetData(locale string, data map[string]interface{}) { + if locale != "" { + if i.Translations == nil { + i.Translations = make(map[string]map[string]interface{}) + } + i.Translations[locale] = data return } - i.Data = data - return } -func (i *Item) GetData(localizer *localizer.Localizer) (map[string]interface{}, error) { - if localizer != nil { - return localizer.Localize(i.Data, i.Translations) +func (i *Item) GetData(locale string) map[string]interface{} { + if locale != "" && i.Translations != nil { + translation := i.Translations[locale] + return MergeData(i.Data, translation) } - return i.Data, nil + return i.Data } func (i Item) Encode(ctx context.Context, s *schema.Schema) (*Item, error) { @@ -214,9 +215,40 @@ func (i Item) Decode(ctx context.Context, s *schema.Schema) (res *Item, err erro return &i, nil } +// MergeData дополняет отсутствующие данные из оригинальных данных +func MergeData(data ...map[string]interface{}) map[string]interface{} { + merge := make(map[string]interface{}) + for _, d := range data { + for k, v := range d { + merge[k] = v + } + } + return merge +} + +// ClearData убирает данные которые не изменились по сравнению с оригинальными данными +func ClearData(data ...map[string]interface{}) map[string]interface{} { + var clear map[string]interface{} + + for _, d := range data { + if clear == nil { + clear = d + continue + } + + for k, v := range d { + if reflect.DeepEqual(clear[k], v) { + delete(clear, k) + } + } + } + + return clear +} + type ProcessDataFunc func(ctx context.Context, sch *schema.Schema, data map[string]interface{}) (map[string]interface{}, error) -func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...*locales.Locale) (*Item, error) { +func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...string) (*Item, error) { if i.Data != nil { dt, err := fn(ctx, sch, i.Data) if err != nil { @@ -227,16 +259,14 @@ func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDat tr := make(map[string]map[string]interface{}) for _, l := range locales { - data, err := i.GetData(localizer.NewLocalizer(sch, locales, l.ID)) - if err != nil { - return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l.ID)) - } + + data := i.GetData(l) dt, err := fn(ctx, sch, data) if err != nil { - return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l.ID)) + return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l)) } - tr[l.ID] = dt + tr[l] = dt } -- GitLab