package main import ( "context" "github.com/adrg/xdg" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/clause" ) type AppConfig struct { Title string } type App struct { ctx context.Context Config AppConfig DB *gorm.DB UserContact Contact } func NewApp(config AppConfig) *App { app := &App{Config: config} db, err := gorm.Open(sqlite.Open(app.GetDataFile()), &gorm.Config{}) if err != nil { panic(err) } app.DB = db.Session(&gorm.Session{FullSaveAssociations: true}) app.migrate() return app } func (app *App) startup(ctx context.Context) { app.ctx = ctx app.EstablishMailConnections() } func (app *App) shutdown(ctx context.Context) { CloseMailConnections() return } func (app *App) migrate() { app.DB.AutoMigrate(&Contact{}) app.DB.AutoMigrate(&EmailAddress{}) app.DB.AutoMigrate(&PhoneNumber{}) app.DB.AutoMigrate(&URL{}) app.DB.AutoMigrate(&StreetAddress{}) app.DB.AutoMigrate(&Date{}) app.DB.AutoMigrate(&OtherField{}) app.DB.Preload(clause.Associations). FirstOrCreate( &app.UserContact, Contact{Model: gorm.Model{ID: 1}}, ) app.DB.AutoMigrate(&MailAccountConnection{}) } func (app *App) GetTitle() string { return app.Config.Title } func (app *App) GetDataFile() string { if file, err := xdg.DataFile(app.GetTitle() + "/data.db"); err != nil { panic(err) } else { return file } } func (app *App) GetMailPasswordKeyringService() string { title := app.GetTitle() return title + "-mail-password" }