diff --git a/forms/collection_upsert.go b/forms/collection_upsert.go index aa100d4a..072f96ea 100644 --- a/forms/collection_upsert.go +++ b/forms/collection_upsert.go @@ -245,7 +245,28 @@ func (form *CollectionUpsert) checkRelationFields(value any) error { options, _ := field.Options.(*schema.RelationOptions) if options == nil { - continue + return validation.Errors{fmt.Sprint(i): validation.Errors{ + "options": validation.NewError( + "validation_schema_invalid_relation_field_options", + "The relation field has invalid field options.", + )}, + } + } + + // prevent collectionId change + oldField := form.collection.Schema.GetFieldById(field.Id) + if oldField != nil { + oldOptions, _ := oldField.Options.(*schema.RelationOptions) + if oldOptions != nil && oldOptions.CollectionId != options.CollectionId { + return validation.Errors{fmt.Sprint(i): validation.Errors{ + "options": validation.Errors{ + "collectionId": validation.NewError( + "validation_field_relation_change", + "The relation collection cannot be changed.", + ), + }}, + } + } } collection, err := form.dao.FindCollectionByNameOrId(options.CollectionId) diff --git a/forms/collection_upsert_test.go b/forms/collection_upsert_test.go index 39d4cc3c..20d22c08 100644 --- a/forms/collection_upsert_test.go +++ b/forms/collection_upsert_test.go @@ -291,6 +291,26 @@ func TestCollectionUpsertValidateAndSubmit(t *testing.T) { }`, []string{"type"}, }, + { + "update failure - changing relation collection", + "users", + `{ + "schema": [ + { + "id": "lkeigvv3", + "name": "rel", + "type": "relation", + "options": { + "collectionId": "wzlqyes4orhoygb", + "cascadeDelete": false, + "maxSelect": 1, + "displayFields": null + } + } + ] + }`, + []string{"schema"}, + }, { "update failure - all fields", "demo2",