2018-10-25 13:15:10 +00:00
package config
import (
"fmt"
"github.com/fatih/color"
"github.com/manifoldco/promptui"
"github.com/mitchellh/go-wordwrap"
"strconv"
)
func Configure ( ) error {
c , err := Load ( )
2018-11-08 06:31:01 +00:00
var action string
2018-10-25 13:15:10 +00:00
if err != nil {
fmt . Println ( "No configuration yet. Creating new." )
c = New ( )
2018-11-08 06:31:01 +00:00
action = "generate"
2018-10-25 13:15:10 +00:00
} else {
fmt . Println ( "Configuration loaded." )
2018-11-08 06:31:01 +00:00
action = "update"
2018-10-25 13:15:10 +00:00
}
title := color . New ( color . Bold , color . BgGreen ) . PrintlnFunc ( )
intro := color . New ( color . Bold , color . FgWhite ) . PrintlnFunc ( )
fmt . Println ( )
intro ( " ✍ Write Freely Configuration ✍" )
fmt . Println ( )
2018-11-08 06:31:01 +00:00
fmt . Println ( wordwrap . WrapString ( " This quick configuration process will " + action + " the application's config file, " + FileName + ".\n\n It validates your input along the way, so you can be sure any future errors aren't caused by a bad configuration. If you'd rather configure your server manually, instead run: writefreely --create-config and edit that file." , 75 ) )
2018-10-25 13:15:10 +00:00
fmt . Println ( )
title ( " Server setup " )
fmt . Println ( )
2018-11-08 03:06:34 +00:00
tmpls := & promptui . PromptTemplates {
Success : "{{ . | bold | faint }}: " ,
2018-10-25 13:15:10 +00:00
}
2018-11-08 03:06:34 +00:00
selTmpls := & promptui . SelectTemplates {
2018-11-08 17:16:52 +00:00
Selected : fmt . Sprintf ( ` {{ .Label }} {{ . | faint }} ` ) ,
2018-10-25 13:15:10 +00:00
}
2018-11-08 03:06:34 +00:00
prompt := promptui . Prompt {
Templates : tmpls ,
Label : "Local port" ,
Validate : validatePort ,
Default : fmt . Sprintf ( "%d" , c . Server . Port ) ,
2018-10-25 13:15:10 +00:00
}
2018-11-08 03:06:34 +00:00
port , err := prompt . Run ( )
2018-10-25 13:15:10 +00:00
if err != nil {
return err
}
2018-11-08 03:06:34 +00:00
c . Server . Port , _ = strconv . Atoi ( port ) // Ignore error, as we've already validated number
2018-10-25 13:15:10 +00:00
fmt . Println ( )
title ( " Database setup " )
fmt . Println ( )
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : "Username" ,
Validate : validateNonEmpty ,
Default : c . Database . User ,
2018-10-25 13:15:10 +00:00
}
c . Database . User , err = prompt . Run ( )
if err != nil {
return err
}
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : "Password" ,
Validate : validateNonEmpty ,
Default : c . Database . Password ,
Mask : '*' ,
2018-10-25 13:15:10 +00:00
}
c . Database . Password , err = prompt . Run ( )
if err != nil {
return err
}
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : "Database name" ,
Validate : validateNonEmpty ,
Default : c . Database . Database ,
2018-10-25 13:15:10 +00:00
}
c . Database . Database , err = prompt . Run ( )
if err != nil {
return err
}
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : "Host" ,
Validate : validateNonEmpty ,
Default : c . Database . Host ,
2018-10-25 13:15:10 +00:00
}
c . Database . Host , err = prompt . Run ( )
if err != nil {
return err
}
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : "Port" ,
Validate : validatePort ,
Default : fmt . Sprintf ( "%d" , c . Database . Port ) ,
2018-10-25 13:15:10 +00:00
}
dbPort , err := prompt . Run ( )
if err != nil {
return err
}
c . Database . Port , _ = strconv . Atoi ( dbPort ) // Ignore error, as we've already validated number
fmt . Println ( )
title ( " App setup " )
fmt . Println ( )
selPrompt := promptui . Select {
2018-11-08 03:06:34 +00:00
Templates : selTmpls ,
Label : "Site type" ,
Items : [ ] string { "Single user blog" , "Multi-user instance" } ,
2018-10-25 13:15:10 +00:00
}
_ , usersType , err := selPrompt . Run ( )
if err != nil {
return err
}
c . App . SingleUser = usersType == "Single user"
2018-11-08 03:06:34 +00:00
// TODO: if c.App.SingleUser {
// prompt for username
// prompt for password
// create blog
2018-10-25 13:15:10 +00:00
siteNameLabel := "Instance name"
if c . App . SingleUser {
siteNameLabel = "Blog name"
}
prompt = promptui . Prompt {
2018-11-08 03:06:34 +00:00
Templates : tmpls ,
Label : siteNameLabel ,
Validate : validateNonEmpty ,
Default : c . App . SiteName ,
2018-10-25 13:15:10 +00:00
}
c . App . SiteName , err = prompt . Run ( )
if err != nil {
return err
}
2018-11-08 03:06:34 +00:00
prompt = promptui . Prompt {
Templates : tmpls ,
Label : "Public URL" ,
Validate : validateDomain ,
Default : c . App . Host ,
}
c . App . Host , err = prompt . Run ( )
if err != nil {
return err
}
2018-10-25 13:15:10 +00:00
if ! c . App . SingleUser {
selPrompt = promptui . Select {
2018-11-08 03:06:34 +00:00
Templates : selTmpls ,
Label : "Registration" ,
Items : [ ] string { "Open" , "Closed" } ,
2018-10-25 13:15:10 +00:00
}
_ , regType , err := selPrompt . Run ( )
if err != nil {
return err
}
c . App . OpenRegistration = regType == "Open"
2018-11-08 03:06:34 +00:00
prompt = promptui . Prompt {
Templates : tmpls ,
Label : "Max blogs per user" ,
Default : fmt . Sprintf ( "%d" , c . App . MaxBlogs ) ,
}
maxBlogs , err := prompt . Run ( )
if err != nil {
return err
}
c . App . MaxBlogs , _ = strconv . Atoi ( maxBlogs ) // Ignore error, as we've already validated number
2018-10-25 13:15:10 +00:00
}
selPrompt = promptui . Select {
2018-11-08 03:06:34 +00:00
Templates : selTmpls ,
Label : "Federation" ,
Items : [ ] string { "Enabled" , "Disabled" } ,
2018-10-25 13:15:10 +00:00
}
_ , fedType , err := selPrompt . Run ( )
if err != nil {
return err
}
c . App . Federation = fedType == "Enabled"
if c . App . Federation {
selPrompt = promptui . Select {
2018-11-08 03:06:34 +00:00
Templates : selTmpls ,
Label : "Federation usage stats" ,
Items : [ ] string { "Public" , "Private" } ,
2018-10-25 13:15:10 +00:00
}
_ , fedStatsType , err := selPrompt . Run ( )
if err != nil {
return err
}
c . App . PublicStats = fedStatsType == "Public"
selPrompt = promptui . Select {
2018-11-08 03:06:34 +00:00
Templates : selTmpls ,
Label : "Instance metadata privacy" ,
Items : [ ] string { "Public" , "Private" } ,
2018-10-25 13:15:10 +00:00
}
_ , fedStatsType , err = selPrompt . Run ( )
if err != nil {
return err
}
c . App . Private = fedStatsType == "Private"
}
return Save ( c )
}