mirror of
https://github.com/pocketbase/pocketbase.git
synced 2024-11-28 10:03:42 +02:00
62 lines
1.4 KiB
Go
62 lines
1.4 KiB
Go
package migrations
|
|
|
|
import (
|
|
"github.com/pocketbase/dbx"
|
|
"github.com/pocketbase/pocketbase/daos"
|
|
"github.com/pocketbase/pocketbase/models"
|
|
"github.com/pocketbase/pocketbase/models/schema"
|
|
)
|
|
|
|
// Transform the relation fields to views from non-view collections to json or text fields
|
|
// (see https://github.com/pocketbase/pocketbase/issues/3000).
|
|
func init() {
|
|
AppMigrations.Register(func(db dbx.Builder) error {
|
|
dao := daos.New(db)
|
|
|
|
views, err := dao.FindCollectionsByType(models.CollectionTypeView)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, view := range views {
|
|
refs, err := dao.FindCollectionReferences(view)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
for collection, fields := range refs {
|
|
if collection.IsView() {
|
|
continue // view-view relations are allowed
|
|
}
|
|
|
|
for _, f := range fields {
|
|
opt, ok := f.Options.(schema.MultiValuer)
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
if opt.IsMultiple() {
|
|
f.Type = schema.FieldTypeJson
|
|
f.Options = &schema.JsonOptions{}
|
|
} else {
|
|
f.Type = schema.FieldTypeText
|
|
f.Options = &schema.TextOptions{}
|
|
}
|
|
|
|
// replace the existing field
|
|
// (this usually is not necessary since it is a pointer,
|
|
// but it is better to be explicit in case FindCollectionReferences changes)
|
|
collection.Schema.AddField(f)
|
|
}
|
|
|
|
// "raw" save without records table sync
|
|
if err := dao.Save(collection); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}, nil)
|
|
}
|