diff --git a/CHANGELOG.md b/CHANGELOG.md index 226f2f3b..df551ee0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -73,6 +73,8 @@ - Soft-deprecated `security.NewToken()` in favor of `security.NewJWT()`. +- Allowed `0` as `RelationOptions.MinSelect` value to avoid the ambiguity between 0 and non-filled input value ([#2817](https://github.com/pocketbase/pocketbase/discussions/2817)). + ## v0.16.6 diff --git a/models/schema/schema_field.go b/models/schema/schema_field.go index 6ff303ef..17cde507 100644 --- a/models/schema/schema_field.go +++ b/models/schema/schema_field.go @@ -653,7 +653,7 @@ func (o RelationOptions) Validate() error { return validation.ValidateStruct(&o, validation.Field(&o.CollectionId, validation.Required), - validation.Field(&o.MinSelect, validation.NilOrNotEmpty, validation.Min(1)), + validation.Field(&o.MinSelect, validation.Min(0)), validation.Field(&o.MaxSelect, validation.NilOrNotEmpty, validation.Min(minVal)), ) } diff --git a/models/schema/schema_field_test.go b/models/schema/schema_field_test.go index 2984ba9a..750906c1 100644 --- a/models/schema/schema_field_test.go +++ b/models/schema/schema_field_test.go @@ -2112,6 +2112,22 @@ func TestRelationOptionsValidate(t *testing.T) { }, []string{"collectionId"}, }, + { + "MinSelect < 0", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: types.Pointer(-1), + }, + []string{"minSelect"}, + }, + { + "MinSelect >= 0", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: types.Pointer(0), + }, + []string{}, + }, { "MaxSelect <= 0", schema.RelationOptions{ @@ -2128,6 +2144,42 @@ func TestRelationOptionsValidate(t *testing.T) { }, []string{}, }, + { + "MinSelect < MaxSelect", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: nil, + MaxSelect: types.Pointer(1), + }, + []string{}, + }, + { + "MinSelect = MaxSelect (non-zero)", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: types.Pointer(1), + MaxSelect: types.Pointer(1), + }, + []string{}, + }, + { + "MinSelect = MaxSelect (both zero)", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: types.Pointer(0), + MaxSelect: types.Pointer(0), + }, + []string{"maxSelect"}, + }, + { + "MinSelect > MaxSelect", + schema.RelationOptions{ + CollectionId: "abc", + MinSelect: types.Pointer(2), + MaxSelect: types.Pointer(1), + }, + []string{"maxSelect"}, + }, } checkFieldOptionsScenarios(t, scenarios)