// Package migrations contains the system PocketBase DB migrations. package migrations import ( "path/filepath" "runtime" "github.com/pocketbase/dbx" "github.com/pocketbase/pocketbase/daos" "github.com/pocketbase/pocketbase/models" "github.com/pocketbase/pocketbase/models/schema" "github.com/pocketbase/pocketbase/tools/migrate" "github.com/pocketbase/pocketbase/tools/types" ) var AppMigrations migrate.MigrationsList // Register is a short alias for `AppMigrations.Register()` // that is usually used in external/user defined migrations. func Register( up func(db dbx.Builder) error, down func(db dbx.Builder) error, optFilename ...string, ) { var optFiles []string if len(optFilename) > 0 { optFiles = optFilename } else { _, path, _, _ := runtime.Caller(1) optFiles = append(optFiles, filepath.Base(path)) } AppMigrations.Register(up, down, optFiles...) } func init() { AppMigrations.Register(func(db dbx.Builder) error { _, tablesErr := db.NewQuery(` CREATE TABLE {{_admins}} ( [[id]] TEXT PRIMARY KEY NOT NULL, [[avatar]] INTEGER DEFAULT 0 NOT NULL, [[email]] TEXT UNIQUE NOT NULL, [[tokenKey]] TEXT UNIQUE NOT NULL, [[passwordHash]] TEXT NOT NULL, [[lastResetSentAt]] TEXT DEFAULT "" NOT NULL, [[created]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL, [[updated]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL ); CREATE TABLE {{_collections}} ( [[id]] TEXT PRIMARY KEY NOT NULL, [[system]] BOOLEAN DEFAULT FALSE NOT NULL, [[type]] TEXT DEFAULT "base" NOT NULL, [[name]] TEXT UNIQUE NOT NULL, [[schema]] JSON DEFAULT "[]" NOT NULL, [[indexes]] JSON DEFAULT "[]" NOT NULL, [[listRule]] TEXT DEFAULT NULL, [[viewRule]] TEXT DEFAULT NULL, [[createRule]] TEXT DEFAULT NULL, [[updateRule]] TEXT DEFAULT NULL, [[deleteRule]] TEXT DEFAULT NULL, [[options]] JSON DEFAULT "{}" NOT NULL, [[created]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL, [[updated]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL ); CREATE TABLE {{_params}} ( [[id]] TEXT PRIMARY KEY NOT NULL, [[key]] TEXT UNIQUE NOT NULL, [[value]] JSON DEFAULT NULL, [[created]] TEXT DEFAULT "" NOT NULL, [[updated]] TEXT DEFAULT "" NOT NULL ); CREATE TABLE {{_externalAuths}} ( [[id]] TEXT PRIMARY KEY NOT NULL, [[collectionId]] TEXT NOT NULL, [[recordId]] TEXT NOT NULL, [[provider]] TEXT NOT NULL, [[providerId]] TEXT NOT NULL, [[created]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL, [[updated]] TEXT DEFAULT (strftime('%Y-%m-%d %H:%M:%fZ')) NOT NULL, --- FOREIGN KEY ([[collectionId]]) REFERENCES {{_collections}} ([[id]]) ON UPDATE CASCADE ON DELETE CASCADE ); CREATE UNIQUE INDEX _externalAuths_record_provider_idx on {{_externalAuths}} ([[collectionId]], [[recordId]], [[provider]]); CREATE UNIQUE INDEX _externalAuths_provider_providerId_idx on {{_externalAuths}} ([[provider]], [[providerId]]); `).Execute() if tablesErr != nil { return tablesErr } // inserts the system profiles collection // ----------------------------------------------------------- usersCollection := &models.Collection{} usersCollection.MarkAsNew() usersCollection.Id = "_pb_users_auth_" usersCollection.Name = "users" usersCollection.Type = models.CollectionTypeAuth usersCollection.ListRule = types.Pointer("id = @request.auth.id") usersCollection.ViewRule = types.Pointer("id = @request.auth.id") usersCollection.CreateRule = types.Pointer("") usersCollection.UpdateRule = types.Pointer("id = @request.auth.id") usersCollection.DeleteRule = types.Pointer("id = @request.auth.id") // set auth options usersCollection.SetOptions(models.CollectionAuthOptions{ ManageRule: nil, AllowOAuth2Auth: true, AllowUsernameAuth: true, AllowEmailAuth: true, MinPasswordLength: 8, RequireEmail: false, }) // set optional default fields usersCollection.Schema = schema.NewSchema( &schema.SchemaField{ Id: "users_name", Type: schema.FieldTypeText, Name: "name", Options: &schema.TextOptions{}, }, &schema.SchemaField{ Id: "users_avatar", Type: schema.FieldTypeFile, Name: "avatar", Options: &schema.FileOptions{ MaxSelect: 1, MaxSize: 5242880, MimeTypes: []string{ "image/jpeg", "image/png", "image/svg+xml", "image/gif", "image/webp", }, }, }, ) return daos.New(db).SaveCollection(usersCollection) }, func(db dbx.Builder) error { tables := []string{ "users", "_externalAuths", "_params", "_collections", "_admins", } for _, name := range tables { if _, err := db.DropTable(name).Execute(); err != nil { return err } } return nil }) }