diff --git a/CHANGELOG.md b/CHANGELOG.md index 91ddec34..9a5c8b7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ - Bumped the default request read and write timeouts to 5mins (_old 3mins_) to accommodate slower internet connections and larger file uploads/downloads. _If you want to change them you can modify the `OnServe` hook's `ServeEvent.ReadTimeout/WriteTimeout` fields as shown in [#6550](https://github.com/pocketbase/pocketbase/discussions/6550#discussioncomment-12364515)._ +- Normalized the `@request.auth.*` and `@request.body.*` back relations resolver to always return `null` when the relation field is pointing to a different collection ([#6590](https://github.com/pocketbase/pocketbase/discussions/6590#discussioncomment-12496581)). + - Updatated `modernc.org/sqlite` to 1.36.0 (SQLite 3.49.0). diff --git a/core/record_field_resolver_runner.go b/core/record_field_resolver_runner.go index 6403649a..c1bfaacd 100644 --- a/core/record_field_resolver_runner.go +++ b/core/record_field_resolver_runner.go @@ -479,7 +479,11 @@ func (r *runner) processActiveProps() (*search.ResolverResult, error) { } return nil, fmt.Errorf("missing back relation field %q", parts[2]) } + if backField.Type() != FieldTypeRelation { + if r.nullifyMisingField { + return &search.ResolverResult{Identifier: "NULL"}, nil + } return nil, fmt.Errorf("invalid back relation field %q", parts[2]) } @@ -492,7 +496,11 @@ func (r *runner) processActiveProps() (*search.ResolverResult, error) { return nil, fmt.Errorf("failed to initialize back relation field %q", backField.GetName()) } if backRelField.CollectionId != collection.Id { - return nil, fmt.Errorf("invalid back relation field %q collection reference", backField.GetName()) + // https://github.com/pocketbase/pocketbase/discussions/6590#discussioncomment-12496581 + if r.nullifyMisingField { + return &search.ResolverResult{Identifier: "NULL"}, nil + } + return nil, fmt.Errorf("invalid collection reference of a back relation field %q", backField.GetName()) } // join the back relation to the main query diff --git a/core/record_field_resolver_test.go b/core/record_field_resolver_test.go index 10fa537c..3a45f64c 100644 --- a/core/record_field_resolver_test.go +++ b/core/record_field_resolver_test.go @@ -601,7 +601,8 @@ func TestRecordFieldResolverResolveCollectionFields(t *testing.T) { {"self_rel_many.self_rel_many.self_rel_many.self_rel_many.self_rel_many.self_rel_many.self_rel_many.id", true, ""}, // back relations - {"rel_one_cascade.demo4_via_title.id", true, ""}, // non-relation via field + {"rel_one_cascade.demo4_via_title.id", true, ""}, // not a relation field + {"rel_one_cascade.demo4_via_self_rel_one.id", true, ""}, // relation field but to a different collection {"rel_one_cascade.demo4_via_rel_one_cascade.id", false, "[[demo4_rel_one_cascade_demo4_via_rel_one_cascade.id]]"}, {"rel_one_cascade.demo4_via_rel_one_cascade.rel_one_cascade.demo4_via_rel_one_cascade.id", false, "[[demo4_rel_one_cascade_demo4_via_rel_one_cascade_rel_one_cascade_demo4_via_rel_one_cascade.id]]"}, @@ -615,8 +616,11 @@ func TestRecordFieldResolverResolveCollectionFields(t *testing.T) { // @request.auth relation join {"@request.auth.rel", false, "[[__auth_users.rel]]"}, {"@request.auth.rel.title", false, "[[__auth_users_rel.title]]"}, + {"@request.auth.demo1_via_rel_many.id", false, "[[__auth_users_demo1_via_rel_many.id]]"}, {"@request.auth.rel.missing", false, "NULL"}, {"@request.auth.missing_via_rel", false, "NULL"}, + {"@request.auth.demo1_via_file_one.id", false, "NULL"}, // not a relation field + {"@request.auth.demo1_via_rel_one.id", false, "NULL"}, // relation field but to a different collection // @collection fieds {"@collect", true, ""},