From 976388baa98ac20eed503eaebae2cc8778857c50 Mon Sep 17 00:00:00 2001
From: Semyon Krestyaninov <krestyaninov@perx.ru>
Date: Fri, 20 Jun 2025 08:36:29 +0000
Subject: [PATCH] =?UTF-8?q?chore:=20=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5?=
 =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82?=
 =?UTF-8?q?=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D1=8C=20=D0=BE=D1=88=D0=B8?=
 =?UTF-8?q?=D0=B1=D0=BE=D0=BA=20=D0=B2=20middleware'=D1=8F=D1=85=20=D1=81?=
 =?UTF-8?q?=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20Items?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/items/middleware/caching_middleware.go    |  6 +-
 .../middleware/client_encode_middleware.go    | 80 +++++++++++--------
 .../client_encode_middleware_test.go          |  4 +-
 3 files changed, 50 insertions(+), 40 deletions(-)

diff --git a/pkg/items/middleware/caching_middleware.go b/pkg/items/middleware/caching_middleware.go
index f2d9bce6..a9c3e79b 100644
--- a/pkg/items/middleware/caching_middleware.go
+++ b/pkg/items/middleware/caching_middleware.go
@@ -58,7 +58,7 @@ func (m cachingMiddleware) Get(ctx context.Context, spaceId, envId, collectionId
 	if err == nil {
 		env, err := m.envs.Get(ctx, itm.SpaceID, itm.EnvID)
 		if err != nil {
-			return nil, errors.Wrap(err, "get environment")
+			return nil, errors.Wrapf(err, "failed to get environment %q", itm.EnvID)
 		}
 
 		// Сохраняем в кэш запись без Translations, поскольку значение из кэша также
@@ -78,7 +78,7 @@ func (m cachingMiddleware) Get(ctx context.Context, spaceId, envId, collectionId
 func (m cachingMiddleware) invalidateCache(ctx context.Context, item *service.Item) (err error) {
 	env, err := m.envs.Get(ctx, item.SpaceID, item.EnvID)
 	if err != nil {
-		return errors.Wrap(err, "get environment")
+		return errors.Wrapf(err, "failed to get environment %q", item.EnvID)
 	}
 	for _, a := range append(env.Aliases, env.ID) {
 		key := makeKey(item.SpaceID, a, item.CollectionID, item.ID)
@@ -148,7 +148,7 @@ func (m cachingMiddleware) GetPublished(ctx context.Context, spaceId, envId, col
 	if err == nil {
 		env, err := m.envs.Get(ctx, itm.SpaceID, itm.EnvID)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrapf(err, "failed to get environment %q", itm.EnvID)
 		}
 
 		// Сохраняем в кэш запись без Translations, поскольку значение из кэша также
diff --git a/pkg/items/middleware/client_encode_middleware.go b/pkg/items/middleware/client_encode_middleware.go
index 476687b8..0af96b75 100644
--- a/pkg/items/middleware/client_encode_middleware.go
+++ b/pkg/items/middleware/client_encode_middleware.go
@@ -28,11 +28,12 @@ type encodeDecodeMiddleware struct {
 func (m *encodeDecodeMiddleware) Introspect(ctx context.Context, item *items.Item, opts ...*items.IntrospectOptions) (itm *items.Item, sch *schema.Schema, err error) {
 	coll, err := m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 	if err != nil {
-		return nil, nil, err
+		return nil, nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 	}
 
 	encoded, err := item.Encode(ctx, coll.Schema)
 	if err != nil {
+		err = errors.Wrap(err, "failed to encode item")
 		// Возвращаем исходные данные для возможности обработки полей с ошибками.
 		return item, coll.Schema, err
 	}
@@ -42,7 +43,7 @@ func (m *encodeDecodeMiddleware) Introspect(ctx context.Context, item *items.Ite
 		var err error
 		if introspected, err = introspected.Decode(ctx, sch); err != nil {
 			// Возвращаем исходные данные для возможности обработки полей с ошибками.
-			return item, coll.Schema, err
+			return item, coll.Schema, errors.Wrap(err, "failed to decode item")
 		}
 	}
 	return introspected, sch, err
@@ -57,11 +58,11 @@ func (m *encodeDecodeMiddleware) Create(ctx context.Context, item *items.Item, o
 
 		col, err = m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 
 		if item, err = item.Encode(ctx, col.Schema); err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "failed to encode item")
 		}
 	}
 
@@ -71,11 +72,12 @@ func (m *encodeDecodeMiddleware) Create(ctx context.Context, item *items.Item, o
 		if col == nil {
 			col, err = m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 			if err != nil {
-				return nil, err
+				return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 			}
 		}
 
 		res, err = res.Decode(ctx, col.Schema)
+		err = errors.Wrap(err, "failed to decode item")
 	}
 
 	return res, err
@@ -86,10 +88,10 @@ func (m *encodeDecodeMiddleware) Update(ctx context.Context, upd *items.Item, op
 	if upd != nil && (upd.Data != nil || upd.Translations != nil) {
 		col, err = m.colls.Get(ctx, upd.SpaceID, upd.EnvID, upd.CollectionID)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "failed to get collection %q", upd.CollectionID)
 		}
 		if upd, err = upd.Encode(ctx, col.Schema); err != nil {
-			return err
+			return errors.Wrap(err, "failed to encode item")
 		}
 	}
 	return m.next.Update(ctx, upd, options...)
@@ -100,12 +102,13 @@ func (m *encodeDecodeMiddleware) Find(ctx context.Context, spaceId, envId, colle
 	if err == nil && total > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, 0, err
+			return nil, 0, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		for i, itm := range items {
+			itemID := itm.ID
 			itm, err = itm.Decode(ctx, col.Schema)
 			if err != nil {
-				return nil, 0, err
+				return nil, 0, errors.Wrapf(err, "failed to decode item %q", itemID)
 			}
 
 			items[i] = itm
@@ -119,11 +122,11 @@ func (m *encodeDecodeMiddleware) Get(ctx context.Context, spaceId, envId, collec
 	if err == nil && item != nil {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 		item, err = item.Decode(ctx, col.Schema)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "failed to decode item")
 
 		}
 	}
@@ -134,11 +137,11 @@ func (m *encodeDecodeMiddleware) Publish(ctx context.Context, item *items.Item,
 	if item != nil && (item.Data != nil || item.Translations != nil) {
 		col, err := m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 
 		if item, err = item.Encode(ctx, col.Schema); err != nil {
-			return err
+			return errors.Wrap(err, "failed to encode item")
 		}
 	}
 
@@ -149,11 +152,11 @@ func (m *encodeDecodeMiddleware) Unpublish(ctx context.Context, item *items.Item
 	if item != nil && (item.Data != nil || item.Translations != nil) {
 		col, err := m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 
 		if item, err = item.Encode(ctx, col.Schema); err != nil {
-			return err
+			return errors.Wrap(err, "failed to encode item")
 		}
 	}
 
@@ -165,11 +168,11 @@ func (m *encodeDecodeMiddleware) GetPublished(ctx context.Context, spaceId, envI
 	if err == nil && item != nil {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 		item, err = item.Decode(ctx, col.Schema)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "failed to decode item")
 
 		}
 	}
@@ -181,12 +184,13 @@ func (m *encodeDecodeMiddleware) FindPublished(ctx context.Context, spaceId, env
 	if err == nil && total > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, 0, err
+			return nil, 0, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		for i, itm := range items {
+			itemID := itm.ID
 			itm, err = itm.Decode(ctx, col.Schema)
 			if err != nil {
-				return nil, 0, err
+				return nil, 0, errors.Wrapf(err, "failed to decode item %q", itemID)
 			}
 
 			items[i] = itm
@@ -200,11 +204,11 @@ func (m *encodeDecodeMiddleware) GetRevision(ctx context.Context, spaceId, envId
 	if err == nil && item != nil {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 		item, err = item.Decode(ctx, col.Schema)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "failed to decode item")
 
 		}
 	}
@@ -216,12 +220,13 @@ func (m *encodeDecodeMiddleware) ListRevisions(ctx context.Context, spaceId, env
 	if err == nil && len(items) > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, 0, err
+			return nil, 0, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		for i, itm := range items {
+			itemID := itm.ID
 			itm, err = itm.Decode(ctx, col.Schema)
 			if err != nil {
-				return nil, 0, err
+				return nil, 0, errors.Wrapf(err, "failed to decode item %q", itemID)
 			}
 
 			items[i] = itm
@@ -239,9 +244,13 @@ func (m *encodeDecodeMiddleware) GetArchived(ctx context.Context, spaceID, envID
 
 	col, err := m.colls.Get(ctx, spaceID, envID, collectionID)
 	if err != nil {
-		return nil, err
+		return nil, errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
+	}
+	item, err = item.Decode(ctx, col.Schema)
+	if err != nil {
+		return nil, errors.Wrap(err, "failed to decode item")
 	}
-	return item.Decode(ctx, col.Schema)
+	return item, nil
 }
 
 func (m *encodeDecodeMiddleware) FindArchived(ctx context.Context, spaceId, envId, collectionId string, filter *items.Filter, options ...*items.FindArchivedOptions) (items []*items.Item, total int, err error) {
@@ -249,12 +258,13 @@ func (m *encodeDecodeMiddleware) FindArchived(ctx context.Context, spaceId, envI
 	if err == nil && total > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, 0, err
+			return nil, 0, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		for i, itm := range items {
+			itemID := itm.ID
 			itm, err = itm.Decode(ctx, col.Schema)
 			if err != nil {
-				return nil, 0, err
+				return nil, 0, errors.Wrapf(err, "failed to decode item %q", itemID)
 			}
 
 			items[i] = itm
@@ -267,11 +277,11 @@ func (m *encodeDecodeMiddleware) Archive(ctx context.Context, item *items.Item,
 	if item != nil && (item.Data != nil || item.Translations != nil) {
 		col, err := m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 
 		if item, err = item.Encode(ctx, col.Schema); err != nil {
-			return err
+			return errors.Wrap(err, "failed to encode item")
 		}
 	}
 
@@ -282,11 +292,11 @@ func (m *encodeDecodeMiddleware) Unarchive(ctx context.Context, item *items.Item
 	if item != nil && (item.Data != nil || item.Translations != nil) {
 		col, err := m.colls.Get(ctx, item.SpaceID, item.EnvID, item.CollectionID)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "failed to get collection %q", item.CollectionID)
 		}
 
 		if item, err = item.Encode(ctx, col.Schema); err != nil {
-			return err
+			return errors.Wrap(err, "failed to encode item")
 		}
 	}
 
@@ -318,12 +328,12 @@ func (m *encodeDecodeMiddleware) Aggregate(ctx context.Context, spaceId, envId,
 	if len(res) > 0 && len(options) > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, errors.Wrap(err, "encode aggregate result")
+			return nil, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		o := items.MergeAggregateOptions(options...)
 		res, err = items.DecodeAggregateResult(ctx, o.Fields, res, col.Schema)
 		if err != nil {
-			return nil, errors.Wrap(err, "encode aggregate result")
+			return nil, errors.Wrap(err, "failed to decode aggregated result")
 		}
 	}
 	return res, err
@@ -334,12 +344,12 @@ func (m *encodeDecodeMiddleware) AggregatePublished(ctx context.Context, spaceId
 	if len(res) > 0 && len(options) > 0 {
 		col, err := m.colls.Get(ctx, spaceId, envId, collectionId)
 		if err != nil {
-			return nil, errors.Wrap(err, "get collection")
+			return nil, errors.Wrapf(err, "failed to get collection %q", collectionId)
 		}
 		o := items.MergeAggregatePublishedOptions(options...)
 		res, err = items.DecodeAggregateResult(ctx, o.Fields, res, col.Schema)
 		if err != nil {
-			return nil, err
+			return nil, errors.Wrap(err, "failed to decode aggregated result")
 		}
 	}
 	return res, err
diff --git a/pkg/items/middleware/client_encode_middleware_test.go b/pkg/items/middleware/client_encode_middleware_test.go
index 4adbdb65..4f6ba625 100644
--- a/pkg/items/middleware/client_encode_middleware_test.go
+++ b/pkg/items/middleware/client_encode_middleware_test.go
@@ -80,7 +80,7 @@ func TestEncodeDecodeMiddleware_Introspect(t *testing.T) {
 		require.EqualError(
 			t,
 			err,
-			"encode error: 1 error occurred:\n\t* field 'date': TimeType: encode: unsupported value type : \"string\"\n\n",
+			"failed to encode item: encode error: 1 error occurred:\n\t* field 'date': TimeType: encode: unsupported value type : \"string\"\n\n",
 		)
 		assert.Equal(t,
 			map[string]any{
@@ -130,7 +130,7 @@ func TestEncodeDecodeMiddleware_Introspect(t *testing.T) {
 		require.EqualError(
 			t,
 			err,
-			"decode error: 1 error occurred:\n\t* field 'str': StringField decode error: unsupported value type : \"int\"\n\n",
+			"failed to decode item: decode error: 1 error occurred:\n\t* field 'str': StringField decode error: unsupported value type : \"int\"\n\n",
 		)
 		assert.Equal(t,
 			map[string]any{
-- 
GitLab