blog/models/settings/settings.go

105 lines
2.4 KiB
Go

package settings
import (
"crypto/rand"
"encoding/base64"
"github.com/kirsle/blog/jsondb"
)
// DB is a reference to the parent app's JsonDB object.
var DB *jsondb.DB
// Settings holds the global app settings.
type Settings struct {
// Only gets set to true on save(), this determines whether
// the site has ever been configured before.
Initialized bool `json:"initialized"`
Site struct {
Title string `json:"title"`
Description string `json:"description"`
AdminEmail string `json:"adminEmail"`
NSFW bool `json:"nsfw"`
URL string `json:"url"`
} `json:"site"`
// Security-related settings.
Security struct {
SecretKey string `json:"secretKey"` // Session cookie secret key
HashCost int `json:"hashCost"` // Bcrypt hash cost for passwords
} `json:"security"`
// Blog settings.
Blog struct {
PostsPerPage int `json:"postsPerPage"`
PostsPerFeed int `json:"postsPerFeed"`
} `json:"blog"`
// Redis settings for caching in JsonDB.
Redis struct {
Enabled bool `json:"enabled"`
Host string `json:"host"`
Port int `json:"port"`
DB int `json:"db"`
Prefix string `json:"prefix"`
} `json:"redis"`
// Mail settings
Mail struct {
Enabled bool `json:"enabled"`
Sender string `json:"sender"`
Host string `json:"host"`
Port int `json:"port"`
Username string `json:"username"`
Password string `json:"password"`
} `json:"mail,omitempty"`
}
// Defaults returns default settings. The app initially sets this on
// startup before reading your site's saved settings (if available).
// Also this is used as a template when the user first configures their
// site.
func Defaults() *Settings {
s := &Settings{}
s.Site.Title = "Untitled Site"
s.Security.HashCost = 14
s.Security.SecretKey = RandomKey()
s.Blog.PostsPerPage = 10
s.Blog.PostsPerFeed = 10
s.Redis.Host = "localhost"
s.Redis.Port = 6379
s.Redis.DB = 0
s.Mail.Host = "localhost"
s.Mail.Port = 25
return s
}
// RandomKey generates a random string to use for the site's secret key.
func RandomKey() string {
keyLength := 32
b := make([]byte, keyLength)
rand.Read(b)
return base64.URLEncoding.EncodeToString(b)
}
// Load the settings.
func Load() (*Settings, error) {
s := &Settings{}
err := DB.Get("app/settings", &s)
return s, err
}
// Save the site settings.
func (s *Settings) Save() error {
s.Initialized = true
err := DB.Commit("app/settings", &s)
if err != nil {
return err
}
return nil
}