Skip to content

Commit

Permalink
Move uninstall app into own package
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikKalkoken committed Sep 8, 2024
1 parent 8ab8c60 commit 844e308
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 159 deletions.
2 changes: 1 addition & 1 deletion FyneApp.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Website = "https://github.com/ErikKalkoken/evebuddy"
Icon = "icon.png"
Name = "EVE Buddy"
ID = "io.github.erikkalkoken.evebuddy"
Version = "0.1.6"
Version = "0.1.7"
Build = 1

[Release]
Expand Down
52 changes: 52 additions & 0 deletions internal/appdirs/appdirs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package appdirs

import (
"os"
"path/filepath"

"fyne.io/fyne/v2"
xappdirs "github.com/chasinglogic/appdirs"
)

const (
appName = "evebuddy"
cacheFolderName = "images"
)

// AppDirs represents the app's local directories for storing logs etc.
type AppDirs struct {
Cache string
Data string
Log string
Settings string
}

func New(fyneApp fyne.App) (AppDirs, error) {
ad := xappdirs.New(appName)
x := AppDirs{
Data: ad.UserData(),
Cache: ad.UserCache(),
Log: ad.UserLog(),
Settings: fyneApp.Storage().RootURI().Path(),
}
if err := os.MkdirAll(x.Log, os.ModePerm); err != nil {
return x, err
}
if err := os.MkdirAll(x.Data, os.ModePerm); err != nil {
return x, err
}
p := filepath.Join(x.Cache, cacheFolderName)
if err := os.MkdirAll(p, os.ModePerm); err != nil {
return x, err
}
return x, nil
}

func (ad AppDirs) DeleteAll() error {
for _, p := range []string{ad.Log, ad.Cache, ad.Data, ad.Settings} {
if err := os.RemoveAll(p); err != nil {
return err
}
}
return nil
}
48 changes: 48 additions & 0 deletions internal/appdirs/appdirs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package appdirs_test

import (
"errors"
"os"
"path/filepath"
"testing"

"github.com/ErikKalkoken/evebuddy/internal/appdirs"
"github.com/stretchr/testify/assert"
)

func TestAppDirsDeleteAll(t *testing.T) {
// given
ap := appdirs.AppDirs{
Cache: t.TempDir(),
Data: t.TempDir(),
Log: t.TempDir(),
Settings: t.TempDir(),
}
paths := []string{ap.Cache, ap.Data, ap.Log, ap.Settings}
for _, p := range paths {
x := filepath.Join(p, "dummy.txt")
if err := os.WriteFile(x, []byte("dummy"), 0644); err != nil {
t.Fatal(err)
}
}
for _, p := range paths {
assert.True(t, fileExists(p))
}
// when
ap.DeleteAll()
// then
for _, p := range paths {
assert.False(t, fileExists(p))
}
}

func fileExists(name string) bool {
_, err := os.Stat(name)
if err == nil {
return true
}
if errors.Is(err, os.ErrNotExist) {
return false
}
panic(err)
}
49 changes: 49 additions & 0 deletions internal/uninstall/uninstall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package uninstall

import (
"fmt"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"

"github.com/ErikKalkoken/evebuddy/internal/appdirs"
)

// RunApp runs the uninstall app
func RunApp(fyneApp fyne.App, ad appdirs.AppDirs) {
w := fyneApp.NewWindow("Uninstall - EVE Buddy")
label := widget.NewLabel(
"Are you sure you want to uninstall this app\n" +
"and delete all user files?")
ok := widget.NewButtonWithIcon("OK", theme.ConfirmIcon(), func() {
if err := ad.DeleteAll(); err != nil {
closeApp(w, fmt.Sprintf("ERROR: %s", err))
return
}
closeApp(w, "Files deleted")
})
cancel := widget.NewButtonWithIcon("Cancel", theme.CancelIcon(), func() {
closeApp(w, "Aborted")
})
cancel.Importance = widget.HighImportance
c := container.NewBorder(
nil,
container.NewHBox(cancel, layout.NewSpacer(), ok),
nil,
nil,
container.NewCenter(label),
)
w.SetContent(c)
w.Resize(fyne.Size{Width: 300, Height: 200})
w.ShowAndRun()
}

func closeApp(w fyne.Window, message string) {
d := dialog.NewInformation("Uninstall", message, w)
d.SetOnClosed(w.Close)
d.Show()
}
136 changes: 20 additions & 116 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ import (
"runtime/debug"
"strings"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
"fyne.io/fyne/v2/dialog"
xappdirs "github.com/chasinglogic/appdirs"
"gopkg.in/natefinch/lumberjack.v2"

"github.com/ErikKalkoken/evebuddy/internal/app/character"
Expand All @@ -25,21 +22,21 @@ import (
"github.com/ErikKalkoken/evebuddy/internal/app/statuscache"
"github.com/ErikKalkoken/evebuddy/internal/app/storage"
"github.com/ErikKalkoken/evebuddy/internal/app/ui"
"github.com/ErikKalkoken/evebuddy/internal/appdirs"
"github.com/ErikKalkoken/evebuddy/internal/cache"
"github.com/ErikKalkoken/evebuddy/internal/eveimage"
"github.com/ErikKalkoken/evebuddy/internal/httptransport"
"github.com/ErikKalkoken/evebuddy/internal/sso"
"github.com/ErikKalkoken/evebuddy/internal/uninstall"
"github.com/antihax/goesi"
)

const (
ssoClientID = "11ae857fe4d149b2be60d875649c05f1"
appID = "io.github.erikkalkoken.evebuddy"
appName = "evebuddy"
logFileName = "evebuddy.log"
dbFileName = "evebuddy.sqlite"
cacheFolderName = "images"
userAgent = "EveBuddy kalkoken87@gmail.com"
ssoClientID = "11ae857fe4d149b2be60d875649c05f1"
appID = "io.github.erikkalkoken.evebuddy"
userAgent = "EveBuddy kalkoken87@gmail.com"
dbFileName = "evebuddy.sqlite"
logFileName = "evebuddy.log"
)

type logLevelFlag struct {
Expand Down Expand Up @@ -69,74 +66,18 @@ var (
// showDirsFlag = flag.Bool("show-dirs", false, "Show directories where user data is stored")
)

// appDirs represents the app's local directories for storing logs etc.
type appDirs struct {
cache string
data string
log string
settings string
}

func newAppDirs(fyneApp fyne.App) appDirs {
ad := xappdirs.New(appName)
x := appDirs{
data: ad.UserData(),
cache: ad.UserCache(),
log: ad.UserLog(),
settings: fyneApp.Storage().RootURI().Path(),
}
return x
}

func (ad appDirs) deleteAll() error {
for _, p := range []string{ad.log, ad.cache, ad.data, ad.settings} {
if err := os.RemoveAll(p); err != nil {
return err
}
}
return nil
}

func (ad appDirs) initLogFile() (string, error) {
if err := os.MkdirAll(ad.log, os.ModePerm); err != nil {
return "", err
}
return fmt.Sprintf("%s/%s", ad.log, logFileName), nil
}

func (ad appDirs) initDSN() (string, error) {
if err := os.MkdirAll(ad.data, os.ModePerm); err != nil {
return "", err
}
dsn := fmt.Sprintf("file:%s/%s", ad.data, dbFileName)
return dsn, nil
}

func (ad appDirs) initImageCachePath() (string, error) {
p := filepath.Join(ad.cache, cacheFolderName)
if err := os.MkdirAll(p, os.ModePerm); err != nil {
return "", err
}
return p, nil
}

func init() {
levelFlag.value = slog.LevelInfo
flag.Var(&levelFlag, "loglevel", "set log level")
}

func main() {
flag.Parse()
slog.SetLogLoggerLevel(levelFlag.value)
fyneApp := app.NewWithID(appID)
ad := newAppDirs(fyneApp)
f, err := os.Create(filepath.Join(ad.log, "crash.txt"))
ad, err := appdirs.New(fyneApp)
if err != nil {
log.Fatal(err)
}
if err := debug.SetCrashOutput(f, debug.CrashOptions{}); err != nil {
log.Fatal(err)
}
// if *showDirsFlag {
// fmt.Printf("Database: %s\n", ad.data)
// fmt.Printf("Cache: %s\n", ad.cache)
Expand All @@ -145,24 +86,26 @@ func main() {
// return
// }
if *uninstallFlag {
uninstall(fyneApp, ad)
uninstall.RunApp(fyneApp, ad)
return
}
f, err := os.Create(filepath.Join(ad.Log, "crash.txt"))
if err != nil {
log.Fatal(err)
}
if err := debug.SetCrashOutput(f, debug.CrashOptions{}); err != nil {
log.Fatal(err)
}
slog.SetLogLoggerLevel(levelFlag.value)
if *logFileFlag {
fn, err := ad.initLogFile()
if err != nil {
log.Fatal(err)
}
fn := fmt.Sprintf("%s/%s", ad.Log, logFileName)
log.SetOutput(&lumberjack.Logger{
Filename: fn,
MaxSize: 50, // megabytes
MaxBackups: 3,
})
}
dsn, err := ad.initDSN()
if err != nil {
log.Fatal(err)
}
dsn := fmt.Sprintf("file:%s/%s", ad.Data, dbFileName)
db, err := storage.InitDB(dsn)
if err != nil {
log.Fatalf("Failed to initialize database %s: %s", dsn, err)
Expand Down Expand Up @@ -201,52 +144,13 @@ func main() {
cs.StatusCacheService = sc
cs.SSOService = sso.New(ssoClientID, httpClient, cache)

imageCacheDir, err := ad.initImageCachePath()
if err != nil {
log.Fatal(err)
}

u := ui.NewUI(fyneApp, *debugFlag)
u.CacheService = cache
u.CharacterService = cs
u.ESIStatusService = esistatus.New(esiClient)
u.EveImageService = eveimage.New(imageCacheDir, httpClient)
u.EveImageService = eveimage.New(ad.Cache, httpClient)
u.EveUniverseService = eu
u.StatusCacheService = sc
u.Init()
u.ShowAndRun()
}

func uninstall(fyneApp fyne.App, ad appDirs) {
w := fyneApp.NewWindow("Uninstall - EVE Buddy")
w.SetFullScreen(true)
d := dialog.NewConfirm(
"Confirmation",
"Are you sure you want to uninstall this app and delete all user files?",
func(isConfirmed bool) {
var result string
if isConfirmed {
if err := ad.deleteAll(); err != nil {
d3 := dialog.NewError(err, w)
d3.Show()
d3.SetOnClosed(func() {
w.Close()
})
return
} else {
result = "User files deleted"
}
} else {
result = "Aborted"
}
d2 := dialog.NewInformation("Uninstall", result, w)
d2.Show()
d2.SetOnClosed(func() {
w.Close()
})
},
w,
)
d.Show()
w.ShowAndRun()
}
Loading

0 comments on commit 844e308

Please sign in to comment.