diff --git a/object/object.go b/object/object.go index af16128..472e6fd 100644 --- a/object/object.go +++ b/object/object.go @@ -3,7 +3,10 @@ package object import ( "errors" "fmt" + "slices" + "strings" + "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container" "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object" "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs" v2session "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/session" @@ -312,6 +315,26 @@ func (o *Object) Attributes() []Attribute { return res } +// UserAttributes returns object user attributes. +func (o *Object) UserAttributes() []Attribute { + attrs := (*object.Object)(o). + GetHeader(). + GetAttributes() + + res := make([]Attribute, 0, len(attrs)) + + for _, attr := range attrs { + key := attr.GetKey() + + if !strings.HasPrefix(key, container.SysAttributePrefix) && + !strings.HasPrefix(key, container.SysAttributePrefixNeoFS) { + res = append(res, *NewAttributeFromV2(&attr)) + } + } + + return slices.Clip(res) +} + // SetAttributes sets object attributes. func (o *Object) SetAttributes(v ...Attribute) { attrs := make([]object.Attribute, len(v)) diff --git a/object/object_test.go b/object/object_test.go index 5e42352..c082173 100644 --- a/object/object_test.go +++ b/object/object_test.go @@ -3,8 +3,10 @@ package object_test import ( "testing" + v2container "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/container" cidtest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/container/id/test" "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object" + objecttest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/test" usertest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/user/test" "github.com/stretchr/testify/require" ) @@ -24,3 +26,26 @@ func TestInitCreation(t *testing.T) { require.Equal(t, cnr, cID) require.Equal(t, own, o.OwnerID()) } + +func Test_Attributes(t *testing.T) { + obj := objecttest.Object() + + t.Run("get user attributes", func(t *testing.T) { + // See how we create a test object. It's created with two attributes. + require.Len(t, obj.UserAttributes(), 2) + }) + + userAttrs := obj.UserAttributes() + + sysAttr := *object.NewAttribute() + sysAttr.SetKey(v2container.SysAttributePrefix + "key") + sysAttr.SetValue("value") + + attr := append(userAttrs, sysAttr) + obj.SetAttributes(attr...) + + t.Run("get attributes", func(t *testing.T) { + require.ElementsMatch(t, obj.UserAttributes(), userAttrs) + require.ElementsMatch(t, obj.Attributes(), attr) + }) +}