diff --git a/pkg/files/field.go b/pkg/files/field.go index bd237bd622f657861cef5bf608fcf5bf2aba1898..ff4e7db1b4640e3be2cc587059a83171cdf662d5 100644 --- a/pkg/files/field.go +++ b/pkg/files/field.go @@ -33,14 +33,21 @@ func (p FileParameters) GetField(f *field.Field, name string) *field.Field { } func (p FileParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field { - return []*field.Field{ + var res []*field.Field + + for _, fld := range []*field.Field{ f.SetFieldState("id", field.String()), f.SetFieldState("name", field.String()), f.SetFieldState("mimeType", field.String()), f.SetFieldState("size", field.Number(field.NumberFormatInt)), f.SetFieldState("url", field.String()), f.SetFieldState("key", field.String()), + } { + if field.ApplyFilterFunc(filter, fld) { + res = append(res, fld) + } } + return res } type FileType struct { diff --git a/pkg/files/field_test.go b/pkg/files/field_test.go index 7b6317309654c9027ca0b373b2362b7d3aad54af..a51fbe46b582a8118fb4acc1afd96c80f35f6e97 100644 --- a/pkg/files/field_test.go +++ b/pkg/files/field_test.go @@ -6,6 +6,7 @@ import ( "git.perx.ru/perxis/perxis-go/pkg/schema" "git.perx.ru/perxis/perxis-go/pkg/schema/field" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestFileField_Get(t *testing.T) { @@ -32,3 +33,43 @@ func TestFileField_Get(t *testing.T) { assert.Equal(t, field.String(), sch.GetField("b.file.key")) assert.Equal(t, field.Number(field.NumberFormatInt), sch.GetField("b.file.size")) } + +func TestFileField_ListFields(t *testing.T) { + tests := []struct { + name string + file *field.Field + filter field.FieldFilterFunc + want []*field.Field + }{ + { + name: "Without filter", + file: Field(), + want: []*field.Field{ + field.String(), // id + field.String(), // name + field.String(), // mimeType + field.Number(field.NumberFormatInt), // size + field.String(), // url + field.String(), // key + }, + }, + { + name: "With filter", + file: Field(), + filter: func(f *field.Field) bool { return f.GetType().Name() == "number" }, + want: []*field.Field{ + field.Number(field.NumberFormatInt), // size + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []field.FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.file.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/references/field.go b/pkg/references/field.go index f80e7b5a564efe81df2969fb35f14d69fd23a1c8..f64143cee3d3814dec0fb735f82ad05dd4c3079e 100644 --- a/pkg/references/field.go +++ b/pkg/references/field.go @@ -37,11 +37,18 @@ func (p ReferenceParameters) GetField(f *field.Field, name string) *field.Field return f.SetFieldState(name, fld) } func (p ReferenceParameters) ListFields(f *field.Field, filter ...field.FieldFilterFunc) []*field.Field { - return []*field.Field{ + var res []*field.Field + + for _, fld := range []*field.Field{ f.SetFieldState("id", field.String()), f.SetFieldState("collection_id", field.String()), f.SetFieldState("disabled", field.Bool()), + } { + if field.ApplyFilterFunc(filter, fld) { + res = append(res, fld) + } } + return res } type ReferenceType struct{} diff --git a/pkg/references/field_test.go b/pkg/references/field_test.go index ac9d5c03db107ed8f284cab3c9205afe95f1502b..8f2458c8820bfb2d5ad8d6a024bb97c65bb88b1d 100644 --- a/pkg/references/field_test.go +++ b/pkg/references/field_test.go @@ -318,3 +318,40 @@ func TestReferenceField_Get(t *testing.T) { assert.Equal(t, field.Bool(), sch.GetField("b.ref.disabled")) } + +func TestReferenceField_ListFields(t *testing.T) { + tests := []struct { + name string + file *field.Field + filter field.FieldFilterFunc + want []*field.Field + }{ + { + name: "Without filter", + file: Field([]string{}), + want: []*field.Field{ + field.String(), // id + field.String(), // collection_id + field.Bool(), // disabled + }, + }, + { + name: "With filter", + file: Field([]string{}), + filter: func(f *field.Field) bool { return f.GetType().Name() == "bool" }, + want: []*field.Field{ + field.Bool(), // disabled + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []field.FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.file.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +} diff --git a/pkg/schema/field/array.go b/pkg/schema/field/array.go index 682b6e5e7774cbf98e93fc31261e114b574049e7..b804dd92dbecfa880a43de9fc1c48b3aa854eece 100644 --- a/pkg/schema/field/array.go +++ b/pkg/schema/field/array.go @@ -35,7 +35,10 @@ func (a ArrayParameters) GetField(f *Field, name string) *Field { func (a ArrayParameters) ListFields(f *Field, filterFunc ...FieldFilterFunc) []*Field { f.SetFieldState("Item", a.Item) - return []*Field{a.Item} + if ApplyFilterFunc(filterFunc, a.Item) { + return []*Field{a.Item} + } + return nil } type ArrayType struct{} diff --git a/pkg/schema/field/array_test.go b/pkg/schema/field/array_test.go index ab8eae74376154ba89ce5a41ebc885da7bc15a1a..976c0d52377b5d4ce7052f8cd01f4904fd88c99e 100644 --- a/pkg/schema/field/array_test.go +++ b/pkg/schema/field/array_test.go @@ -267,3 +267,40 @@ func TestArrayField_WithType(t *testing.T) { assert.ElementsMatch(t, got, []interface{}{map[string]interface{}{"a": "1", "b": "2"}}) }) } + +func TestArrayField_ListFields(t *testing.T) { + tests := []struct { + name string + field *Field + filter FieldFilterFunc + want []*Field + }{ + { + name: "Without filter", + field: Array(Number("number")), + want: []*Field{Number("number")}, + }, + { + name: "With filter positive", + field: Array(Number("number").SetTextSearch(true)), + filter: func(f *Field) bool { return f.TextSearch }, + want: []*Field{Number("number").SetTextSearch(true)}, + }, + { + name: "With filter negative", + field: Array(Number("float")), + filter: func(f *Field) bool { return f.TextSearch }, + want: nil, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var filters []FieldFilterFunc + if tt.filter != nil { + filters = append(filters, tt.filter) + } + got := tt.field.ListFields(filters...) + require.Equal(t, tt.want, got) + }) + } +}