app.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
package main
import (
"context"
"github.com/adrg/xdg"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"gorm.io/gorm/clause"
)
type AppConfig struct {
Title string
Version 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{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
panic(err)
}
app.DB = db
app.migrate()
return app
}
func (app *App) startup(ctx context.Context) {
app.Log("Running startup.").
Stdout()
defer app.Log("Startup finished.").
Stdout()
app.ctx = ctx
app.EstablishMailConnections()
return
}
func (app *App) shutdown(ctx context.Context) {
app.Log("Running shutdown.").
Stdout()
defer app.Log("finished shutdown.").
Stdout()
CloseMailConnections()
return
}
func (app *App) migrate() {
app.Log("Starting migration...").
Stdout()
defer app.Log("finished migration.").
Stdout()
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.Log("Ensuring contact.").
Stdout()
app.DB.AutoMigrate(&MailAccountConnection{})
app.DB.AutoMigrate(&Conversation{})
app.DB.AutoMigrate(&Message{})
app.DB.AutoMigrate(&MailHeader{})
app.DB.AutoMigrate(&LastSynced{})
app.DB.AutoMigrate(&MessageContent{})
app.DB.AutoMigrate(&DisplayImage{})
return
}
func (app *App) GetTitle() string {
return app.Config.Title
}
func (app *App) GetVersion() string {
return app.Config.Version
}
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"
}
|