diff --git a/migrations/1692609521_copy_display_fields.go b/migrations/1692609521_copy_display_fields.go new file mode 100644 index 00000000..b2a20f59 --- /dev/null +++ b/migrations/1692609521_copy_display_fields.go @@ -0,0 +1,62 @@ +package migrations + +import ( + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" + "github.com/pocketbase/pocketbase/models" + "github.com/pocketbase/pocketbase/models/schema" +) + +// Copy the now deprecated RelationOptions.DisplayFields values from +// all relation fields and register its value as Presentable under +// the specific field in the related collection. +// +// If there is more than one relation to a single collection with explicitly +// set DisplayFields only one of the configuration will be copied. +func init() { + AppMigrations.Register(func(db dbx.Builder) error { + dao := daos.New(db) + + collections := []*models.Collection{} + if err := dao.CollectionQuery().All(&collections); err != nil { + return err + } + + indexedCollections := make(map[string]*models.Collection, len(collections)) + for _, collection := range collections { + indexedCollections[collection.Id] = collection + } + + for _, collection := range indexedCollections { + for _, f := range collection.Schema.Fields() { + if f.Type != schema.FieldTypeRelation { + continue + } + + options, ok := f.Options.(*schema.RelationOptions) + if !ok || len(options.DisplayFields) == 0 { + continue + } + + relCollection, ok := indexedCollections[options.CollectionId] + if !ok { + continue + } + + for _, name := range options.DisplayFields { + relField := relCollection.Schema.GetFieldByName(name) + if relField != nil { + relField.Presentable = true + } + } + + // only raw model save + if err := dao.Save(relCollection); err != nil { + return err + } + } + } + + return nil + }, nil) +}