diff --git a/config/config.go b/config/config.go index fad258d..ab7cea3 100644 --- a/config/config.go +++ b/config/config.go @@ -60,16 +60,11 @@ type ( ) func New() *Config { - return &Config{ + c := &Config{ Server: ServerCfg{ Port: 8080, Bind: "localhost", /* IPV6 support when not using localhost? */ }, - Database: DatabaseCfg{ - Type: "mysql", - Host: "localhost", - Port: 3306, - }, App: AppCfg{ Host: "http://localhost:8080", Theme: "write", @@ -81,6 +76,25 @@ func New() *Config { PublicStats: true, }, } + c.UseMySQL(true) + return c +} + +// UseMySQL resets the Config's Database to use default values for a MySQL setup. +func (cfg *Config) UseMySQL(fresh bool) { + cfg.Database.Type = "mysql" + if fresh { + cfg.Database.Host = "localhost" + cfg.Database.Port = 3306 + } +} + +// UseSQLite resets the Config's Database to use default values for a SQLite setup. +func (cfg *Config) UseSQLite(fresh bool) { + cfg.Database.Type = "sqlite3" + if fresh { + cfg.Database.FileName = "writefreely.db" + } } func (cfg *Config) IsSecureStandalone() bool { diff --git a/config/setup.go b/config/setup.go index 6a2f780..d086500 100644 --- a/config/setup.go +++ b/config/setup.go @@ -20,10 +20,12 @@ func Configure() (*SetupData, error) { data.Config, err = Load() var action string + isNewCfg := false if err != nil { fmt.Println("No configuration yet. Creating new.") data.Config = New() action = "generate" + isNewCfg = true } else { fmt.Println("Configuration loaded.") action = "update" @@ -126,62 +128,91 @@ func Configure() (*SetupData, error) { title(" Database setup ") fmt.Println() - prompt = promptui.Prompt{ - Templates: tmpls, - Label: "Username", - Validate: validateNonEmpty, - Default: data.Config.Database.User, + selPrompt = promptui.Select{ + Templates: selTmpls, + Label: "Database driver", + Items: []string{"MySQL", "SQLite"}, } - data.Config.Database.User, err = prompt.Run() + sel, _, err := selPrompt.Run() if err != nil { return data, err } - prompt = promptui.Prompt{ - Templates: tmpls, - Label: "Password", - Validate: validateNonEmpty, - Default: data.Config.Database.Password, - Mask: '*', - } - data.Config.Database.Password, err = prompt.Run() - if err != nil { - return data, err - } + if sel == 0 { + // Configure for MySQL + data.Config.UseMySQL(isNewCfg) - prompt = promptui.Prompt{ - Templates: tmpls, - Label: "Database name", - Validate: validateNonEmpty, - Default: data.Config.Database.Database, - } - data.Config.Database.Database, err = prompt.Run() - if err != nil { - return data, err - } + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Username", + Validate: validateNonEmpty, + Default: data.Config.Database.User, + } + data.Config.Database.User, err = prompt.Run() + if err != nil { + return data, err + } - prompt = promptui.Prompt{ - Templates: tmpls, - Label: "Host", - Validate: validateNonEmpty, - Default: data.Config.Database.Host, - } - data.Config.Database.Host, err = prompt.Run() - if err != nil { - return data, err - } + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Password", + Validate: validateNonEmpty, + Default: data.Config.Database.Password, + Mask: '*', + } + data.Config.Database.Password, err = prompt.Run() + if err != nil { + return data, err + } - prompt = promptui.Prompt{ - Templates: tmpls, - Label: "Port", - Validate: validatePort, - Default: fmt.Sprintf("%d", data.Config.Database.Port), - } - dbPort, err := prompt.Run() - if err != nil { - return data, err + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Database name", + Validate: validateNonEmpty, + Default: data.Config.Database.Database, + } + data.Config.Database.Database, err = prompt.Run() + if err != nil { + return data, err + } + + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Host", + Validate: validateNonEmpty, + Default: data.Config.Database.Host, + } + data.Config.Database.Host, err = prompt.Run() + if err != nil { + return data, err + } + + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Port", + Validate: validatePort, + Default: fmt.Sprintf("%d", data.Config.Database.Port), + } + dbPort, err := prompt.Run() + if err != nil { + return data, err + } + data.Config.Database.Port, _ = strconv.Atoi(dbPort) // Ignore error, as we've already validated number + } else if sel == 1 { + // Configure for SQLite + data.Config.UseSQLite(isNewCfg) + + prompt = promptui.Prompt{ + Templates: tmpls, + Label: "Filename", + Validate: validateNonEmpty, + Default: data.Config.Database.FileName, + } + data.Config.Database.FileName, err = prompt.Run() + if err != nil { + return data, err + } } - data.Config.Database.Port, _ = strconv.Atoi(dbPort) // Ignore error, as we've already validated number fmt.Println() title(" App setup ")