From 58b35a21e8060a404cc563b4e09cb36fb74c7383 Mon Sep 17 00:00:00 2001 From: Simon Martens Date: Fri, 2 Jan 2026 16:23:03 +0100 Subject: [PATCH] +REWORK: migrations --- migrations/01_tables.go | 438 +++++++++++++++++++ migrations/{1738936649_fts5.go => 02_fts.go} | 1 + migrations/1738936553_places.go | 52 --- migrations/1738936568_agents.go | 56 --- migrations/1738936584_series.go | 51 --- migrations/1738936647_entries.go | 130 ------ migrations/1738936648_items.go | 75 ---- migrations/1738936829_r_entries_series.go | 27 -- migrations/1738942133_contents.go | 138 ------ migrations/1738951458_r_contents_agents.go | 25 -- migrations/1738952826_r_entries_agents.go | 25 -- 11 files changed, 439 insertions(+), 579 deletions(-) create mode 100644 migrations/01_tables.go rename migrations/{1738936649_fts5.go => 02_fts.go} (97%) delete mode 100644 migrations/1738936553_places.go delete mode 100644 migrations/1738936568_agents.go delete mode 100644 migrations/1738936584_series.go delete mode 100644 migrations/1738936647_entries.go delete mode 100644 migrations/1738936648_items.go delete mode 100644 migrations/1738936829_r_entries_series.go delete mode 100644 migrations/1738942133_contents.go delete mode 100644 migrations/1738951458_r_contents_agents.go delete mode 100644 migrations/1738952826_r_entries_agents.go diff --git a/migrations/01_tables.go b/migrations/01_tables.go new file mode 100644 index 0000000..12addf3 --- /dev/null +++ b/migrations/01_tables.go @@ -0,0 +1,438 @@ +package migrations + +import ( + "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" + "maps" + "slices" +) + +func init() { + m.Register(func(app core.App) error { + err := app.Save(places()) + if err != nil { + return err + } + + err = app.Save(agents()) + if err != nil { + return err + } + + err = app.Save(series()) + if err != nil { + return err + } + + err = app.Save(entries(app)) + if err != nil { + return err + } + + err = app.Save(items(app)) + if err != nil { + return err + } + + err = app.Save(contents(app)) + if err != nil { + return err + } + + r_entries_agents, err := dbmodels.BasicRelationCollection(app, dbmodels.ENTRIES_TABLE, dbmodels.AGENTS_TABLE, dbmodels.AGENT_RELATIONS) + if err != nil { + return err + } + err = app.Save(r_entries_agents) + if err != nil { + return err + } + + r_contents_agents, err := dbmodels.BasicRelationCollection(app, dbmodels.CONTENTS_TABLE, dbmodels.AGENTS_TABLE, dbmodels.AGENT_RELATIONS) + if err != nil { + return err + } + err = app.Save(r_contents_agents) + if err != nil { + return err + } + + r_entries_series, err := dbmodels.BasicRelationCollection(app, dbmodels.ENTRIES_TABLE, dbmodels.SERIES_TABLE, dbmodels.SERIES_RELATIONS) + if err != nil { + return err + } + err = app.Save(r_entries_series) + if err != nil { + return err + } + + err = app.Save(r_entries_agents) + if err != nil { + return err + } + + return nil + }, func(app core.App) error { + places, err := app.FindCollectionByNameOrId(dbmodels.PLACES_TABLE) + if err != nil { + return nil + } + + return app.Delete(places) + }) +} + +func series() *core.Collection { + collection := core.NewBaseCollection(dbmodels.SERIES_TABLE) + dbmodels.SetBasicPublicRules(collection) + collection.Fields = seriesFields() + seriesIndexes(collection) + return collection +} + +func seriesFields() core.FieldsList { + fields := core.NewFieldsList( + &core.TextField{Name: dbmodels.SERIES_TITLE_FIELD, Required: true, Presentable: true}, + &core.TextField{Name: dbmodels.SERIES_PSEUDONYMS_FIELD, Required: false}, + &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, + &core.TextField{Name: dbmodels.SERIES_FREQUENCY_FIELD, Required: false}, + ) + + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetMusenalmIDField(&fields) + dbmodels.SetEditorStateField(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + + return fields +} + +func seriesIndexes(collection *core.Collection) { + dbmodels.AddMusenalmIDIndex(collection) + dbmodels.AddIndex(collection, dbmodels.SERIES_TITLE_FIELD, false) +} + +func agents() *core.Collection { + collection := core.NewBaseCollection(dbmodels.AGENTS_TABLE) + dbmodels.SetBasicPublicRules(collection) + collection.Fields = agentsFields() + agentsIndexes(collection) + return collection +} + +func agentsFields() core.FieldsList { + fields := core.NewFieldsList( + &core.TextField{Name: dbmodels.AGENTS_NAME_FIELD, Required: true, Presentable: true}, + &core.BoolField{Name: dbmodels.AGENTS_CORP_FIELD, Required: false}, + &core.BoolField{Name: dbmodels.AGENTS_FICTIONAL_FIELD, Required: false}, + &core.URLField{Name: dbmodels.URI_FIELD, Required: false}, + &core.TextField{Name: dbmodels.AGENTS_BIOGRAPHICAL_DATA_FIELD, Required: false, Presentable: true}, + &core.TextField{Name: dbmodels.AGENTS_PROFESSION_FIELD, Required: false}, + &core.TextField{Name: dbmodels.AGENTS_PSEUDONYMS_FIELD, Required: false}, + &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, + ) + + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetMusenalmIDField(&fields) + dbmodels.SetEditorStateField(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + + return fields +} + +func agentsIndexes(collection *core.Collection) { + dbmodels.AddMusenalmIDIndex(collection) + dbmodels.AddIndex(collection, dbmodels.AGENTS_NAME_FIELD, false) + dbmodels.AddIndexNoCollate(collection, dbmodels.URI_FIELD, false) +} + +func places() *core.Collection { + places := core.NewBaseCollection(dbmodels.PLACES_TABLE) + dbmodels.SetBasicPublicRules(places) + places.Fields = placesFields() + placesIndexes(places) + return places +} + +func placesFields() core.FieldsList { + fields := core.NewFieldsList( + &core.TextField{Name: dbmodels.PLACES_NAME_FIELD, Required: true, Presentable: true}, + &core.TextField{Name: dbmodels.PLACES_PSEUDONYMS_FIELD, Required: false, Presentable: true}, + &core.BoolField{Name: dbmodels.AGENTS_FICTIONAL_FIELD, Required: false}, + &core.URLField{Name: dbmodels.URI_FIELD, Required: false, OnlyDomains: []string{"geonames.org"}}, + ) + + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetMusenalmIDField(&fields) + dbmodels.SetEditorStateField(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + + return fields +} + +func placesIndexes(collection *core.Collection) { + dbmodels.AddMusenalmIDIndex(collection) + dbmodels.AddIndex(collection, dbmodels.PLACES_NAME_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.URI_FIELD, false) +} + +func items(app core.App) *core.Collection { + collection := core.NewBaseCollection(dbmodels.ITEMS_TABLE) + dbmodels.SetBasicPublicRules(collection) + collection.Fields = itemsFields(app) + itemsIndexes(collection) + return collection +} + +func itemsFields(app core.App) core.FieldsList { + bcoll, err := app.FindCollectionByNameOrId(dbmodels.ENTRIES_TABLE) + if err != nil { + panic(err) + } + + fields := core.NewFieldsList( + &core.RelationField{Name: dbmodels.ENTRIES_TABLE, CollectionId: bcoll.Id, Required: false}, + &core.TextField{Name: dbmodels.ITEMS_IDENTIFIER_FIELD, Required: true, Presentable: true}, + &core.TextField{Name: dbmodels.ITEMS_LOCATION_FIELD, Required: false, Presentable: true}, + &core.TextField{Name: dbmodels.ITEMS_OWNER_FIELD, Required: false, Presentable: false}, + &core.SelectField{ + Name: dbmodels.ITEMS_MEDIA_FIELD, + Required: false, + Presentable: true, + Values: dbmodels.ITEM_TYPE_VALUES, + MaxSelect: len(dbmodels.ITEM_TYPE_VALUES) - 1, + }, + &core.TextField{Name: dbmodels.ITEMS_CONDITION_FIELD, Required: false, Presentable: true}, + &core.FileField{ + Name: dbmodels.SCAN_FIELD, + Required: false, + MaxSize: 100 * 1024 * 1024, + MaxSelect: 1000, + MimeTypes: dbmodels.MUSENALM_MIME_TYPES, + Thumbs: []string{"0x300", "0x500", "0x1000", "300x0", "500x0", "1000x0"}, + }, // 100 MB a file + &core.URLField{Name: dbmodels.URI_FIELD, Required: false, Presentable: false}, + ) + + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + dbmodels.SetEditorStateField(&fields) + + return fields +} + +func itemsIndexes(collection *core.Collection) { + dbmodels.AddIndex(collection, dbmodels.ITEMS_CONDITION_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.ITEMS_OWNER_FIELD, false) + dbmodels.AddIndexNoCollate(collection, dbmodels.ITEMS_LOCATION_FIELD, false) + dbmodels.AddIndexNoCollate(collection, dbmodels.ITEMS_IDENTIFIER_FIELD, false) + dbmodels.AddIndexNoCollate(collection, dbmodels.URI_FIELD, false) +} + +func entries(app core.App) *core.Collection { + collection := core.NewBaseCollection(dbmodels.ENTRIES_TABLE) + dbmodels.SetBasicPublicRules(collection) + collection.Fields = entriesFields(app) + entriesIndexes(collection) + return collection +} + +func entriesFields(app core.App) core.FieldsList { + places, err := app.FindCollectionByNameOrId(dbmodels.PLACES_TABLE) + if err != nil { + return nil + } + + fields := core.NewFieldsList( + // Title information + &core.TextField{Name: dbmodels.PREFERRED_TITLE_FIELD, Required: true, Presentable: true}, + &core.TextField{Name: dbmodels.VARIANT_TITLE_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PARALLEL_TITLE_FIELD, Required: false}, + + // Transcribed information + &core.TextField{Name: dbmodels.TITLE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.SUBTITLE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.INCIPIT_STMT_FIELD, Required: false, Presentable: false}, + + &core.TextField{Name: dbmodels.RESPONSIBILITY_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PLACE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PUBLICATION_STMT_FIELD, Required: false, Presentable: false}, + + // Other discerning Information + &core.NumberField{Name: dbmodels.YEAR_FIELD, Required: false}, + &core.TextField{Name: dbmodels.EDITION_FIELD, Required: false}, + + // Media Information + &core.SelectField{ + Name: dbmodels.LANGUAGE_FIELD, + Required: false, + Values: dbmodels.LANGUAGE_VALUES, + MaxSelect: len(dbmodels.LANGUAGE_VALUES), + }, + &core.SelectField{ + Name: dbmodels.CONTENT_TYPE_FIELD, + Required: false, + Values: dbmodels.CONTENT_TYPE_VALUES, + MaxSelect: len(dbmodels.CONTENT_TYPE_VALUES), + }, + + // Physical Description + &core.TextField{Name: dbmodels.EXTENT_FIELD, Required: false}, + &core.TextField{Name: dbmodels.DIMENSIONS_FIELD, Required: false}, + &core.SelectField{ + Name: dbmodels.CARRIER_TYPE_FIELD, + Required: false, + Values: dbmodels.MEDIA_TYPE_VALUES, + MaxSelect: len(dbmodels.MEDIA_TYPE_VALUES), + }, + &core.SelectField{ + Name: dbmodels.CARRIER_TYPE_FIELD, + Required: false, + Values: dbmodels.CARRIER_TYPE_VALUES, + MaxSelect: len(dbmodels.CARRIER_TYPE_VALUES), + }, + + // Norm Data + &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, + &core.RelationField{ + Name: dbmodels.PLACES_TABLE, + Required: false, + CollectionId: places.Id, + CascadeDelete: false, + MaxSelect: 5000, + }, + + // EDIT DATA: + &core.JSONField{Name: dbmodels.META_FIELD, Required: false}, + &core.JSONField{Name: dbmodels.MUSENALM_DEPRECATED_FIELD, Required: false}, + ) + + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetMusenalmIDField(&fields) + dbmodels.SetEditorStateField(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + + return fields +} + +func entriesIndexes(collection *core.Collection) { + dbmodels.AddMusenalmIDIndex(collection) + dbmodels.AddIndex(collection, dbmodels.PREFERRED_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.VARIANT_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PARALLEL_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.TITLE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.SUBTITLE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.INCIPIT_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.RESPONSIBILITY_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PLACE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PUBLICATION_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.YEAR_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.EDITION_FIELD, false) +} + +func contents(app core.App) *core.Collection { + collection := core.NewBaseCollection(dbmodels.CONTENTS_TABLE) + dbmodels.SetBasicPublicRules(collection) + collection.Fields = contentsFields(app) + contentsIndexes(collection) + return collection +} + +func contentsFields(app core.App) core.FieldsList { + entries, err := app.FindCollectionByNameOrId(dbmodels.ENTRIES_TABLE) + if err != nil { + return nil + } + + fields := core.NewFieldsList( + // Title information + &core.TextField{Name: dbmodels.PREFERRED_TITLE_FIELD, Required: true, Presentable: true}, + &core.TextField{Name: dbmodels.VARIANT_TITLE_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PARALLEL_TITLE_FIELD, Required: false}, + + // Transcribed information + &core.TextField{Name: dbmodels.TITLE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.SUBTITLE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.INCIPIT_STMT_FIELD, Required: false, Presentable: false}, + + &core.TextField{Name: dbmodels.RESPONSIBILITY_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PLACE_STMT_FIELD, Required: false, Presentable: false}, + &core.TextField{Name: dbmodels.PUBLICATION_STMT_FIELD, Required: false, Presentable: false}, + + // Other discerning Information + &core.NumberField{Name: dbmodels.YEAR_FIELD, Required: false}, + + // Media Information + &core.SelectField{ + Name: dbmodels.LANGUAGE_FIELD, + Required: false, + Values: dbmodels.LANGUAGE_VALUES, + MaxSelect: len(dbmodels.LANGUAGE_VALUES), + }, + &core.SelectField{ + Name: dbmodels.CONTENT_TYPE_FIELD, + Required: false, + Values: dbmodels.CONTENT_TYPE_VALUES, + MaxSelect: len(dbmodels.CONTENT_TYPE_VALUES), + }, + + // Physical Description + &core.TextField{Name: dbmodels.EXTENT_FIELD, Required: false}, + &core.TextField{Name: dbmodels.DIMENSIONS_FIELD, Required: false}, + + // Musenalm specific data + &core.SelectField{ + Name: dbmodels.MUSENALM_INHALTE_TYPE_FIELD, + Required: false, + Values: dbmodels.MUSENALM_TYPE_VALUES, + MaxSelect: len(dbmodels.MUSENALM_TYPE_VALUES), + }, + &core.SelectField{ + Name: dbmodels.MUSENALM_PAGINATION_FIELD, + Required: false, + Values: slices.Collect(maps.Values(dbmodels.MUSENALM_PAGINATION_VALUES)), + MaxSelect: len(dbmodels.MUSENALM_PAGINATION_VALUES), + }, + &core.FileField{ + Name: dbmodels.SCAN_FIELD, + Required: false, + MaxSize: 100 * 1024 * 1024, + MaxSelect: 1000, + MimeTypes: dbmodels.MUSENALM_MIME_TYPES, + Thumbs: []string{"0x300", "0x500", "0x1000", "300x0", "500x0", "1000x0"}, + }, // 100 MB a file + + // Band: + &core.NumberField{Name: dbmodels.NUMBERING_FIELD, Required: false}, + &core.RelationField{ + Name: dbmodels.ENTRIES_TABLE, + Required: true, + CollectionId: entries.Id, + CascadeDelete: false, + MaxSelect: 1, + MinSelect: 1, + }, + ) + + dbmodels.SetMusenalmIDField(&fields) + dbmodels.SetCreatedUpdatedFields(&fields) + dbmodels.SetEditorStateField(&fields) + dbmodels.SetNotesAndAnnotationsField(&fields) + + return fields +} + +func contentsIndexes(collection *core.Collection) { + dbmodels.AddMusenalmIDIndex(collection) + dbmodels.AddIndex(collection, dbmodels.PREFERRED_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.VARIANT_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PARALLEL_TITLE_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.TITLE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.SUBTITLE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.INCIPIT_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.RESPONSIBILITY_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PLACE_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.PUBLICATION_STMT_FIELD, false) + dbmodels.AddIndex(collection, dbmodels.YEAR_FIELD, false) + dbmodels.AddIndexNoCollate(collection, dbmodels.ENTRIES_TABLE, false) +} diff --git a/migrations/1738936649_fts5.go b/migrations/02_fts.go similarity index 97% rename from migrations/1738936649_fts5.go rename to migrations/02_fts.go index 7780371..e6343ef 100644 --- a/migrations/1738936649_fts5.go +++ b/migrations/02_fts.go @@ -8,6 +8,7 @@ import ( func init() { m.Register(func(app core.App) error { + app.Logger().Info("Migrating database to accomodate FTS5") err := createFTS5(app, dbmodels.AGENTS_TABLE, dbmodels.AGENTS_FTS5_FIELDS) if err != nil { app.Logger().Error("Error creating FTS5 table for agents", "error", err) diff --git a/migrations/1738936553_places.go b/migrations/1738936553_places.go deleted file mode 100644 index febfa52..0000000 --- a/migrations/1738936553_places.go +++ /dev/null @@ -1,52 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - places := placesTable() - places.Fields = placesFields() - placesIndexes(places) - - return app.Save(places) - }, func(app core.App) error { - places, err := app.FindCollectionByNameOrId(dbmodels.PLACES_TABLE) - if err != nil { - return nil - } - - return app.Delete(places) - }) -} - -func placesTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.PLACES_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func placesFields() core.FieldsList { - fields := core.NewFieldsList( - &core.TextField{Name: dbmodels.PLACES_NAME_FIELD, Required: true, Presentable: true}, - &core.TextField{Name: dbmodels.PLACES_PSEUDONYMS_FIELD, Required: false, Presentable: true}, - &core.BoolField{Name: dbmodels.AGENTS_FICTIONAL_FIELD, Required: false}, - &core.URLField{Name: dbmodels.URI_FIELD, Required: false, OnlyDomains: []string{"geonames.org"}}, - ) - - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetMusenalmIDField(&fields) - dbmodels.SetEditorStateField(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - - return fields -} - -func placesIndexes(collection *core.Collection) { - dbmodels.AddMusenalmIDIndex(collection) - dbmodels.AddIndex(collection, dbmodels.PLACES_NAME_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.URI_FIELD, false) -} diff --git a/migrations/1738936568_agents.go b/migrations/1738936568_agents.go deleted file mode 100644 index cc95fbd..0000000 --- a/migrations/1738936568_agents.go +++ /dev/null @@ -1,56 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - agents := agentsTable() - agents.Fields = agentsFields() - agentsIndexes(agents) - - return app.Save(agents) - }, func(app core.App) error { - agents, err := app.FindCollectionByNameOrId(dbmodels.AGENTS_TABLE) - if err != nil { - return nil - } - - return app.Delete(agents) - }) -} - -func agentsTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.AGENTS_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func agentsFields() core.FieldsList { - fields := core.NewFieldsList( - &core.TextField{Name: dbmodels.AGENTS_NAME_FIELD, Required: true, Presentable: true}, - &core.BoolField{Name: dbmodels.AGENTS_CORP_FIELD, Required: false}, - &core.BoolField{Name: dbmodels.AGENTS_FICTIONAL_FIELD, Required: false}, - &core.URLField{Name: dbmodels.URI_FIELD, Required: false}, - &core.TextField{Name: dbmodels.AGENTS_BIOGRAPHICAL_DATA_FIELD, Required: false, Presentable: true}, - &core.TextField{Name: dbmodels.AGENTS_PROFESSION_FIELD, Required: false}, - &core.TextField{Name: dbmodels.AGENTS_PSEUDONYMS_FIELD, Required: false}, - &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, - ) - - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetMusenalmIDField(&fields) - dbmodels.SetEditorStateField(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - - return fields -} - -func agentsIndexes(collection *core.Collection) { - dbmodels.AddMusenalmIDIndex(collection) - dbmodels.AddIndex(collection, dbmodels.AGENTS_NAME_FIELD, false) - dbmodels.AddIndexNoCollate(collection, dbmodels.URI_FIELD, false) -} diff --git a/migrations/1738936584_series.go b/migrations/1738936584_series.go deleted file mode 100644 index 2c8090b..0000000 --- a/migrations/1738936584_series.go +++ /dev/null @@ -1,51 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - series := seriesTable() - series.Fields = seriesFields() - seriesIndexes(series) - - return app.Save(series) - }, func(app core.App) error { - series, err := app.FindCollectionByNameOrId(dbmodels.SERIES_TABLE) - if err != nil { - return nil - } - - return app.Delete(series) - }) -} - -func seriesTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.SERIES_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func seriesFields() core.FieldsList { - fields := core.NewFieldsList( - &core.TextField{Name: dbmodels.SERIES_TITLE_FIELD, Required: true, Presentable: true}, - &core.TextField{Name: dbmodels.SERIES_PSEUDONYMS_FIELD, Required: false}, - &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, - &core.TextField{Name: dbmodels.SERIES_FREQUENCY_FIELD, Required: false}, - ) - - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetMusenalmIDField(&fields) - dbmodels.SetEditorStateField(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - - return fields -} - -func seriesIndexes(collection *core.Collection) { - dbmodels.AddMusenalmIDIndex(collection) - dbmodels.AddIndex(collection, dbmodels.SERIES_TITLE_FIELD, false) -} diff --git a/migrations/1738936647_entries.go b/migrations/1738936647_entries.go deleted file mode 100644 index 7113a98..0000000 --- a/migrations/1738936647_entries.go +++ /dev/null @@ -1,130 +0,0 @@ -package migrations - -import ( - "errors" - - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - entries := entriesTable() - fields := entriesFields(app) - if fields == nil { - return errors.New("Could not find places collection") - } - - entries.Fields = *fields - entriesIndexes(entries) - - return app.Save(entries) - }, func(app core.App) error { - entries, err := app.FindCollectionByNameOrId(dbmodels.ENTRIES_TABLE) - if err != nil { - return nil - } - - return app.Delete(entries) - }) -} - -func entriesTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.ENTRIES_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func entriesFields(app core.App) *core.FieldsList { - places, err := app.FindCollectionByNameOrId(dbmodels.PLACES_TABLE) - if err != nil { - return nil - } - - fields := core.NewFieldsList( - // Title information - &core.TextField{Name: dbmodels.PREFERRED_TITLE_FIELD, Required: true, Presentable: true}, - &core.TextField{Name: dbmodels.VARIANT_TITLE_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PARALLEL_TITLE_FIELD, Required: false}, - - // Transcribed information - &core.TextField{Name: dbmodels.TITLE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.SUBTITLE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.INCIPIT_STMT_FIELD, Required: false, Presentable: false}, - - &core.TextField{Name: dbmodels.RESPONSIBILITY_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PLACE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PUBLICATION_STMT_FIELD, Required: false, Presentable: false}, - - // Other discerning Information - &core.NumberField{Name: dbmodels.YEAR_FIELD, Required: false}, - &core.TextField{Name: dbmodels.EDITION_FIELD, Required: false}, - - // Media Information - &core.SelectField{ - Name: dbmodels.LANGUAGE_FIELD, - Required: false, - Values: dbmodels.LANGUAGE_VALUES, - MaxSelect: len(dbmodels.LANGUAGE_VALUES), - }, - &core.SelectField{ - Name: dbmodels.CONTENT_TYPE_FIELD, - Required: false, - Values: dbmodels.CONTENT_TYPE_VALUES, - MaxSelect: len(dbmodels.CONTENT_TYPE_VALUES), - }, - - // Physical Description - &core.TextField{Name: dbmodels.EXTENT_FIELD, Required: false}, - &core.TextField{Name: dbmodels.DIMENSIONS_FIELD, Required: false}, - &core.SelectField{ - Name: dbmodels.CARRIER_TYPE_FIELD, - Required: false, - Values: dbmodels.MEDIA_TYPE_VALUES, - MaxSelect: len(dbmodels.MEDIA_TYPE_VALUES), - }, - &core.SelectField{ - Name: dbmodels.CARRIER_TYPE_FIELD, - Required: false, - Values: dbmodels.CARRIER_TYPE_VALUES, - MaxSelect: len(dbmodels.CARRIER_TYPE_VALUES), - }, - - // Norm Data - &core.TextField{Name: dbmodels.REFERENCES_FIELD, Required: false}, - &core.RelationField{ - Name: dbmodels.PLACES_TABLE, - Required: false, - CollectionId: places.Id, - CascadeDelete: false, - MaxSelect: 5000, - }, - - // EDIT DATA: - &core.JSONField{Name: dbmodels.META_FIELD, Required: false}, - &core.JSONField{Name: dbmodels.MUSENALM_DEPRECATED_FIELD, Required: false}, - ) - - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetMusenalmIDField(&fields) - dbmodels.SetEditorStateField(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - - return &fields -} - -func entriesIndexes(collection *core.Collection) { - dbmodels.AddMusenalmIDIndex(collection) - dbmodels.AddIndex(collection, dbmodels.PREFERRED_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.VARIANT_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PARALLEL_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.TITLE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.SUBTITLE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.INCIPIT_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.RESPONSIBILITY_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PLACE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PUBLICATION_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.YEAR_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.EDITION_FIELD, false) -} diff --git a/migrations/1738936648_items.go b/migrations/1738936648_items.go deleted file mode 100644 index 5eda61d..0000000 --- a/migrations/1738936648_items.go +++ /dev/null @@ -1,75 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - items := itemsTable() - items.Fields = itemsFields(app) - itemsIndexes(items) - - return app.Save(items) - }, func(app core.App) error { - items, err := app.FindCollectionByNameOrId(dbmodels.ITEMS_TABLE) - if err != nil { - return nil - } - - return app.Delete(items) - }) -} - -func itemsTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.ITEMS_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func itemsFields(app core.App) core.FieldsList { - bcoll, err := app.FindCollectionByNameOrId(dbmodels.ENTRIES_TABLE) - if err != nil { - panic(err) - } - - fields := core.NewFieldsList( - &core.RelationField{Name: dbmodels.ENTRIES_TABLE, CollectionId: bcoll.Id, Required: false}, - &core.TextField{Name: dbmodels.ITEMS_IDENTIFIER_FIELD, Required: true, Presentable: true}, - &core.TextField{Name: dbmodels.ITEMS_LOCATION_FIELD, Required: false, Presentable: true}, - &core.TextField{Name: dbmodels.ITEMS_OWNER_FIELD, Required: false, Presentable: false}, - &core.SelectField{ - Name: dbmodels.ITEMS_MEDIA_FIELD, - Required: false, - Presentable: true, - Values: dbmodels.ITEM_TYPE_VALUES, - MaxSelect: len(dbmodels.ITEM_TYPE_VALUES) - 1, - }, - &core.TextField{Name: dbmodels.ITEMS_CONDITION_FIELD, Required: false, Presentable: true}, - &core.FileField{ - Name: dbmodels.SCAN_FIELD, - Required: false, - MaxSize: 100 * 1024 * 1024, - MaxSelect: 1000, - MimeTypes: dbmodels.MUSENALM_MIME_TYPES, - Thumbs: []string{"0x300", "0x500", "0x1000", "300x0", "500x0", "1000x0"}, - }, // 100 MB a file - &core.URLField{Name: dbmodels.URI_FIELD, Required: false, Presentable: false}, - ) - - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - dbmodels.SetEditorStateField(&fields) - - return fields -} - -func itemsIndexes(collection *core.Collection) { - dbmodels.AddIndex(collection, dbmodels.ITEMS_CONDITION_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.ITEMS_OWNER_FIELD, false) - dbmodels.AddIndexNoCollate(collection, dbmodels.ITEMS_LOCATION_FIELD, false) - dbmodels.AddIndexNoCollate(collection, dbmodels.ITEMS_IDENTIFIER_FIELD, false) - dbmodels.AddIndexNoCollate(collection, dbmodels.URI_FIELD, false) -} diff --git a/migrations/1738936829_r_entries_series.go b/migrations/1738936829_r_entries_series.go deleted file mode 100644 index 6f74479..0000000 --- a/migrations/1738936829_r_entries_series.go +++ /dev/null @@ -1,27 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - collection, err := dbmodels.BasicRelationCollection(app, dbmodels.ENTRIES_TABLE, dbmodels.SERIES_TABLE, dbmodels.SERIES_RELATIONS) - if err != nil { - return err - } - - collection.Fields.Add(&core.TextField{Name: dbmodels.NUMBERING_FIELD, Required: false, Presentable: true}) - - return app.Save(collection) - }, func(app core.App) error { - collection, err := app.FindCollectionByNameOrId(dbmodels.RelationTableName(dbmodels.ENTRIES_TABLE, dbmodels.SERIES_TABLE)) - if err != nil { - return nil - } - - return app.Delete(collection) - }) -} diff --git a/migrations/1738942133_contents.go b/migrations/1738942133_contents.go deleted file mode 100644 index ffdf8ec..0000000 --- a/migrations/1738942133_contents.go +++ /dev/null @@ -1,138 +0,0 @@ -package migrations - -import ( - "errors" - "maps" - "slices" - - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - partials := partialsTable() - fields := partialsFields(app) - if fields == nil { - return errors.New("Could not find places collection") - } - - partials.Fields = *fields - partialsIndexes(partials) - - return app.Save(partials) - }, func(app core.App) error { - partials, err := app.FindCollectionByNameOrId(dbmodels.CONTENTS_TABLE) - if err != nil { - return nil - } - - return app.Delete(partials) - }) -} - -func partialsTable() *core.Collection { - collection := core.NewBaseCollection(dbmodels.CONTENTS_TABLE) - dbmodels.SetBasicPublicRules(collection) - return collection -} - -func partialsFields(app core.App) *core.FieldsList { - entries, err := app.FindCollectionByNameOrId(dbmodels.ENTRIES_TABLE) - if err != nil { - return nil - } - - fields := core.NewFieldsList( - // Title information - &core.TextField{Name: dbmodels.PREFERRED_TITLE_FIELD, Required: true, Presentable: true}, - &core.TextField{Name: dbmodels.VARIANT_TITLE_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PARALLEL_TITLE_FIELD, Required: false}, - - // Transcribed information - &core.TextField{Name: dbmodels.TITLE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.SUBTITLE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.INCIPIT_STMT_FIELD, Required: false, Presentable: false}, - - &core.TextField{Name: dbmodels.RESPONSIBILITY_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PLACE_STMT_FIELD, Required: false, Presentable: false}, - &core.TextField{Name: dbmodels.PUBLICATION_STMT_FIELD, Required: false, Presentable: false}, - - // Other discerning Information - &core.NumberField{Name: dbmodels.YEAR_FIELD, Required: false}, - - // Media Information - &core.SelectField{ - Name: dbmodels.LANGUAGE_FIELD, - Required: false, - Values: dbmodels.LANGUAGE_VALUES, - MaxSelect: len(dbmodels.LANGUAGE_VALUES), - }, - &core.SelectField{ - Name: dbmodels.CONTENT_TYPE_FIELD, - Required: false, - Values: dbmodels.CONTENT_TYPE_VALUES, - MaxSelect: len(dbmodels.CONTENT_TYPE_VALUES), - }, - - // Physical Description - &core.TextField{Name: dbmodels.EXTENT_FIELD, Required: false}, - &core.TextField{Name: dbmodels.DIMENSIONS_FIELD, Required: false}, - - // Musenalm specific data - &core.SelectField{ - Name: dbmodels.MUSENALM_INHALTE_TYPE_FIELD, - Required: false, - Values: dbmodels.MUSENALM_TYPE_VALUES, - MaxSelect: len(dbmodels.MUSENALM_TYPE_VALUES), - }, - &core.SelectField{ - Name: dbmodels.MUSENALM_PAGINATION_FIELD, - Required: false, - Values: slices.Collect(maps.Values(dbmodels.MUSENALM_PAGINATION_VALUES)), - MaxSelect: len(dbmodels.MUSENALM_PAGINATION_VALUES), - }, - &core.FileField{ - Name: dbmodels.SCAN_FIELD, - Required: false, - MaxSize: 100 * 1024 * 1024, - MaxSelect: 1000, - MimeTypes: dbmodels.MUSENALM_MIME_TYPES, - Thumbs: []string{"0x300", "0x500", "0x1000", "300x0", "500x0", "1000x0"}, - }, // 100 MB a file - - // Band: - &core.NumberField{Name: dbmodels.NUMBERING_FIELD, Required: false}, - &core.RelationField{ - Name: dbmodels.ENTRIES_TABLE, - Required: true, - CollectionId: entries.Id, - CascadeDelete: false, - MaxSelect: 1, - MinSelect: 1, - }, - ) - - dbmodels.SetMusenalmIDField(&fields) - dbmodels.SetCreatedUpdatedFields(&fields) - dbmodels.SetEditorStateField(&fields) - dbmodels.SetNotesAndAnnotationsField(&fields) - - return &fields -} - -func partialsIndexes(collection *core.Collection) { - dbmodels.AddMusenalmIDIndex(collection) - dbmodels.AddIndex(collection, dbmodels.PREFERRED_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.VARIANT_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PARALLEL_TITLE_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.TITLE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.SUBTITLE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.INCIPIT_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.RESPONSIBILITY_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PLACE_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.PUBLICATION_STMT_FIELD, false) - dbmodels.AddIndex(collection, dbmodels.YEAR_FIELD, false) - dbmodels.AddIndexNoCollate(collection, dbmodels.ENTRIES_TABLE, false) -} diff --git a/migrations/1738951458_r_contents_agents.go b/migrations/1738951458_r_contents_agents.go deleted file mode 100644 index 1c0e571..0000000 --- a/migrations/1738951458_r_contents_agents.go +++ /dev/null @@ -1,25 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - collections, err := dbmodels.BasicRelationCollection(app, dbmodels.CONTENTS_TABLE, dbmodels.AGENTS_TABLE, dbmodels.AGENT_RELATIONS) - if err != nil { - return err - } - - return app.Save(collections) - }, func(app core.App) error { - collection, err := app.FindCollectionByNameOrId(dbmodels.RelationTableName(dbmodels.CONTENTS_TABLE, dbmodels.AGENTS_TABLE)) - if err != nil { - return nil - } - - return app.Delete(collection) - }) -} diff --git a/migrations/1738952826_r_entries_agents.go b/migrations/1738952826_r_entries_agents.go deleted file mode 100644 index 283937d..0000000 --- a/migrations/1738952826_r_entries_agents.go +++ /dev/null @@ -1,25 +0,0 @@ -package migrations - -import ( - "github.com/Theodor-Springmann-Stiftung/musenalm/dbmodels" - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - collections, err := dbmodels.BasicRelationCollection(app, dbmodels.ENTRIES_TABLE, dbmodels.AGENTS_TABLE, dbmodels.AGENT_RELATIONS) - if err != nil { - return err - } - - return app.Save(collections) - }, func(app core.App) error { - collection, err := app.FindCollectionByNameOrId(dbmodels.RelationTableName(dbmodels.ENTRIES_TABLE, dbmodels.AGENTS_TABLE)) - if err != nil { - return nil - } - - return app.Delete(collection) - }) -}