go-skeletor/config/config.go

259 lines
10 KiB
Go

package config
import (
"arno/skeletor/entity"
"arno/skeletor/tool"
"os"
"strings"
"github.com/teacat/noire"
ini "gopkg.in/ini.v1"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
type Config struct {
AppDebug bool
AppVersion int
AppPrivate bool
AppServer string
AppWeburl string
AppAlias string
AppSecret string
AppName string
AppSubname string
AppDescription string
AppTheme string
AppLogodark string
AppLogolight string
AppColorbgbodydark string
AppColorbgbodylight string
AppColorftbodydark string
AppColorftbodylight string
AppColorfttitledark string
AppColorfttitlelight string
AppFontbody string
AppFonttitle string
AppFontsizeh1 string
AppFontsizeh2 string
AppFontsizeh3 string
AppFontsizeh4 string
AppFontsize string
AppColorbgbodylightdarker string
AppColorbgbodydarkdarker string
AppColorfttitlelightdarker string
AppColorfttitledarkdarker string
AppRoutes map[string]string
AppDbpath string
}
func NewConfig(filepath string, withlog bool) (*Config, *gorm.DB, error) {
// CHARGEMENT
if withlog {
tool.LogInfo("Chargement du fichier de configuration")
}
myconfig := NewConfigdefault()
cfg, err := ini.Load(filepath)
if err != nil {
tool.LogFatal(err.Error())
panic("exit")
}
cfg.ValueMapper = os.ExpandEnv
if err := cfg.MapTo(myconfig); err != nil {
tool.LogFatal(err.Error())
panic("exit")
}
// DECLARATION ROUTES
if withlog {
tool.LogInfo("Déclaration des routes")
}
myconfig.AppRoutes["home"] = "/"
myconfig.AppRoutes["homeconfig"] = "/admin"
myconfig.AppRoutes["securitylogin"] = "/login"
myconfig.AppRoutes["securitylogout"] = "/logout"
myconfig.AppRoutes["upload"] = "/user/upload/"
myconfig.AppRoutes["uploaded"] = "/user/uploaded/"
myconfig.AppRoutes["uploadcrop"] = "/user/uploadcrop/"
myconfig.AppRoutes["uploadcropped"] = "/user/uploadcropped/"
myconfig.AppRoutes["configlist"] = "/admin/config"
myconfig.AppRoutes["configrefresh"] = "/admin/config/refresh"
myconfig.AppRoutes["configupdate"] = "/admin/config/update/"
myconfig.AppRoutes["configdelete"] = "/admin/config/delete/"
myconfig.AppRoutes["userlist"] = "/admin/user"
myconfig.AppRoutes["usersubmit"] = "/admin/user/submit"
myconfig.AppRoutes["userupdate"] = "/admin/user/update/"
myconfig.AppRoutes["userdelete"] = "/admin/user/delete/"
myconfig.AppRoutes["userprofil"] = "/user/profil"
// CONNEXION A LA BASE DONNEES
if withlog {
tool.LogInfo("Connexion à la base de données")
}
mydb, err := gorm.Open(mysql.Open(myconfig.AppDbpath), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})
if err != nil {
tool.LogFatal(err.Error())
panic("exit")
}
// Migrate the schema
if withlog {
tool.LogInfo("Migration des schémas")
}
mydb.AutoMigrate(&entity.Config{})
mydb.AutoMigrate(&entity.User{})
mydb.AutoMigrate(&entity.Command{})
mydb.AutoMigrate(&entity.Cron{})
if withlog {
tool.LogInfo("Initialisation de la table de configuration")
}
newConfig(mydb, "AppName", "Titre de votre site", "", myconfig.AppName, 1, true, true, false, "string", "", "site", "Titre de votre site")
newConfig(mydb, "AppSubname", "Sous-titre de votre site", "", "", 2, true, true, false, "string", "", "site", "Sous-titre de votre site")
newConfig(mydb, "AppDescription", "Description de votre site", "", "", 3, true, true, false, "editor", "", "site", "Description de votre site")
newConfig(mydb, "AppTheme", "Thème de votre site", "", "", 100, true, true, false, "themes", "", "site", "Thème de votre site")
newConfig(mydb, "AppLogodark", "Logo sur fond fonçé", "", "logo.png", 200, true, true, false, "logo", "", "logo", "Logo sur fond fonçé")
newConfig(mydb, "AppLogolight", "Logo sur fond clair", "", "logo.png", 201, true, true, false, "logo", "", "logo", "Logo sur fond clair")
newConfig(mydb, "AppColorbgbodydark", "Couleur de fond fonçée", "", "#27848e", 300, true, true, false, "color", "", "colorbgbody", "La couleur de fond quand le site a besoin d'avoir une couleur de fond foncée")
newConfig(mydb, "AppColorbgbodylight", "Couleur de fond claire", "", "#ffffff", 301, true, true, false, "color", "", "colorbgbody", "La couleur de fond quand le site a besoin d'avoir une couleur de fond claire")
newConfig(mydb, "AppColorftbodydark", "Couleur de la police sur fond fonçé", "", "#ffffff", 302, true, true, false, "color", "", "colorftbody", "La couleur de la police sur fond fonçé")
newConfig(mydb, "AppColorftbodylight", "Couleur de la police sur fond claire", "", "#343a40", 303, true, true, false, "color", "", "colorftbody", "La couleur de la police sur fond claire")
newConfig(mydb, "AppColorfttitledark", "Couleur des titres sur fond fonçé", "", "#ffffff", 304, true, true, false, "color", "", "colorfttitle", "La couleur des titres sur fond fonçé")
newConfig(mydb, "AppColorfttitlelight", "Couleur des titres sur fond claire", "", "#27848e", 305, true, true, false, "color", "", "colorfttitle", "La couleur des titres sur fond claire")
newConfig(mydb, "AppFontbody", "Police principale", "", "Roboto-Regular", 400, true, true, false, "font", "", "font", "Nom de la police principale")
newConfig(mydb, "AppFonttitle", "Police pour les titres", "", "FredokaOne-Regular", 401, true, true, false, "font", "", "font", "La couleur de la police de votre site")
newConfig(mydb, "AppFontsizeh1", "Taille des titres h1", "", "40", 402, true, true, false, "integer", "", "font", "Taille des titres h1 en px")
newConfig(mydb, "AppFontsizeh2", "Taille des titres h2", "", "32", 403, true, true, false, "integer", "", "font", "Taille des titres h2 en px")
newConfig(mydb, "AppFontsizeh3", "Taille des titres h3", "", "28", 404, true, true, false, "integer", "", "font", "Taille des titres h3 en px")
newConfig(mydb, "AppFontsizeh4", "Taille des titres h4", "", "24", 405, true, true, false, "integer", "", "font", "Taille des titres h4 en px")
newConfig(mydb, "AppFontsize", "Taille du texte", "", "16", 406, true, true, false, "integer", "", "font", "Taille du texte px")
if withlog {
tool.LogInfo("Chargement de la table de configuration en mémoire")
}
myconfig.Refresh(mydb)
if withlog {
tool.LogInfo("Initialisation des Commandes")
}
newCommand(mydb, "AppSetPassword", "Définir un password pour un utilisateur\ngo run cmd/AppSetPassword loginuser newpaspassord")
newCommand(mydb, "AppClear", "Nettoyage des fichiers obsolètes\ngo run cmd/AppClear")
if withlog {
tool.LogInfo("Initialisation des Jobs Cron")
}
newCron(mydb, "AppClear", "@every 4h00m")
return myconfig, mydb, nil
}
func NewConfigdefault() *Config {
return &Config{
AppDebug: false,
AppPrivate: true,
AppServer: ":3000",
AppWeburl: "",
AppAlias: "/",
AppSecret: "changeme",
AppName: "Skeletor",
AppRoutes: make(map[string]string),
}
}
func newConfig(mydb *gorm.DB, id string, title string, value string, defaultvalue string, roworder int, visible bool, changeable bool, required bool, typefield string, grouped string, category string, help string) {
var config entity.Config
result := mydb.First(&config, "id = ?", id)
if result.RowsAffected == 0 {
config.Id = id
config.Value = value
mydb.Create(&config)
}
mydb.First(&config, "id = ?", id)
config.Title = title
config.Defaultvalue = defaultvalue
config.Roworder = roworder
config.Visible = visible
config.Changeable = changeable
config.Required = required
config.Typefield = typefield
config.Grouped = grouped
config.Category = category
config.Help = help
mydb.Save(&config)
}
func GetConfig(mydb *gorm.DB, id string) string {
var myconfig entity.Config
mydb.First(&myconfig, "id = ?", id)
if myconfig.Value == "" {
return myconfig.Defaultvalue
} else {
return myconfig.Value
}
}
func (myconfig *Config) Refresh(mydb *gorm.DB) {
myconfig.AppName = GetConfig(mydb, "AppName")
myconfig.AppSubname = GetConfig(mydb, "AppSubname")
myconfig.AppDescription = GetConfig(mydb, "AppDescription")
myconfig.AppTheme = GetConfig(mydb, "AppTheme")
myconfig.AppLogodark = GetConfig(mydb, "AppLogodark")
myconfig.AppLogolight = GetConfig(mydb, "AppLogolight")
myconfig.AppColorbgbodydark = GetConfig(mydb, "AppColorbgbodydark")
myconfig.AppColorbgbodylight = GetConfig(mydb, "AppColorbgbodylight")
myconfig.AppColorftbodydark = GetConfig(mydb, "AppColorftbodydark")
myconfig.AppColorftbodylight = GetConfig(mydb, "AppColorftbodylight")
myconfig.AppColorfttitledark = GetConfig(mydb, "AppColorfttitledark")
myconfig.AppColorfttitlelight = GetConfig(mydb, "AppColorfttitlelight")
myconfig.AppFontbody = GetConfig(mydb, "AppFontbody")
myconfig.AppFonttitle = GetConfig(mydb, "AppFonttitle")
myconfig.AppFontsizeh1 = GetConfig(mydb, "AppFontsizeh1")
myconfig.AppFontsizeh2 = GetConfig(mydb, "AppFontsizeh2")
myconfig.AppFontsizeh3 = GetConfig(mydb, "AppFontsizeh3")
myconfig.AppFontsizeh4 = GetConfig(mydb, "AppFontsizeh4")
myconfig.AppFontsize = GetConfig(mydb, "AppFontsize")
myconfig.AppColorbgbodydarkdarker = "#" + noire.NewHex(strings.Replace(myconfig.AppColorbgbodydark, "#", "", -1)).Darken(0.10).Hex()
myconfig.AppColorfttitledarkdarker = "#" + noire.NewHex(strings.Replace(myconfig.AppColorfttitledark, "#", "", -1)).Darken(0.30).Hex()
myconfig.AppColorbgbodylightdarker = "#" + noire.NewHex(strings.Replace(myconfig.AppColorbgbodylight, "#", "", -1)).Darken(0.10).Hex()
myconfig.AppColorfttitlelightdarker = "#" + noire.NewHex(strings.Replace(myconfig.AppColorfttitlelight, "#", "", -1)).Darken(0.10).Hex()
}
func newCommand(mydb *gorm.DB, name string, description string) {
var command entity.Command
result := mydb.First(&command, "name = ?", name)
if result.RowsAffected == 0 {
command.Name = name
mydb.Create(&command)
}
mydb.First(&command, "name = ?", name)
command.Description = description
mydb.Save(&command)
}
func newCron(mydb *gorm.DB, name string, every string) {
var cron entity.Cron
var command entity.Command
mydb.First(&command, "name = ?", name)
result := mydb.First(&cron, "command_id = ?", command.Id)
if result.RowsAffected == 0 {
cron.CommandId = command.Id
cron.Every = every
mydb.Create(&cron)
}
}