all repos — emessage @ 4938b2e7cc9504d8085b021945ec49563a3eaa67

The EMessage email client

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"
}