1
0
mirror of https://github.com/pocketbase/pocketbase.git synced 2024-11-24 17:07:00 +02:00
pocketbase/migrations/1640988000_init.go
2022-07-10 14:40:51 +03:00

151 lines
4.1 KiB
Go

// Package migrations contains the system PocketBase DB migrations.
package migrations
import (
"fmt"
"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"
)
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,
[[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 "" NOT NULL,
[[updated]] TEXT DEFAULT "" NOT NULL
);
CREATE TABLE {{_users}} (
[[id]] TEXT PRIMARY KEY,
[[verified]] BOOLEAN DEFAULT FALSE NOT NULL,
[[email]] TEXT UNIQUE NOT NULL,
[[tokenKey]] TEXT UNIQUE NOT NULL,
[[passwordHash]] TEXT NOT NULL,
[[lastResetSentAt]] TEXT DEFAULT "" NOT NULL,
[[lastVerificationSentAt]] TEXT DEFAULT "" NOT NULL,
[[created]] TEXT DEFAULT "" NOT NULL,
[[updated]] TEXT DEFAULT "" NOT NULL
);
CREATE TABLE {{_collections}} (
[[id]] TEXT PRIMARY KEY,
[[system]] BOOLEAN DEFAULT FALSE NOT NULL,
[[name]] TEXT UNIQUE NOT NULL,
[[schema]] JSON DEFAULT "[]" NOT NULL,
[[listRule]] TEXT DEFAULT NULL,
[[viewRule]] TEXT DEFAULT NULL,
[[createRule]] TEXT DEFAULT NULL,
[[updateRule]] TEXT DEFAULT NULL,
[[deleteRule]] TEXT DEFAULT NULL,
[[created]] TEXT DEFAULT "" NOT NULL,
[[updated]] TEXT DEFAULT "" NOT NULL
);
CREATE TABLE {{_params}} (
[[id]] TEXT PRIMARY KEY,
[[key]] TEXT UNIQUE NOT NULL,
[[value]] JSON DEFAULT NULL,
[[created]] TEXT DEFAULT "" NOT NULL,
[[updated]] TEXT DEFAULT "" NOT NULL
);
`).Execute()
if tablesErr != nil {
return tablesErr
}
// inserts the system profiles collection
// -----------------------------------------------------------
profileOwnerRule := fmt.Sprintf("%s = @request.user.id", models.ProfileCollectionUserFieldName)
collection := &models.Collection{
Name: models.ProfileCollectionName,
System: true,
CreateRule: &profileOwnerRule,
ListRule: &profileOwnerRule,
ViewRule: &profileOwnerRule,
UpdateRule: &profileOwnerRule,
Schema: schema.NewSchema(
&schema.SchemaField{
Name: models.ProfileCollectionUserFieldName,
Type: schema.FieldTypeUser,
Unique: true,
Required: true,
System: true,
Options: &schema.UserOptions{
MaxSelect: 1,
CascadeDelete: true,
},
},
&schema.SchemaField{
Name: "name",
Type: schema.FieldTypeText,
Options: &schema.TextOptions{},
},
&schema.SchemaField{
Name: "avatar",
Type: schema.FieldTypeFile,
Options: &schema.FileOptions{
MaxSelect: 1,
MaxSize: 5242880,
MimeTypes: []string{
"image/jpg",
"image/jpeg",
"image/png",
"image/svg+xml",
"image/gif",
},
},
},
),
}
return daos.New(db).SaveCollection(collection)
}, func(db dbx.Builder) error {
tables := []string{
"_params",
"_collections",
"_users",
"_admins",
models.ProfileCollectionName,
}
for _, name := range tables {
if _, err := db.DropTable(name).Execute(); err != nil {
return err
}
}
return nil
})
}