fasten-onprem/backend/pkg/config/config.go

86 lines
2.4 KiB
Go

package config
import (
"fmt"
"github.com/analogj/go-util/utils"
"github.com/fastenhealth/fasten-onprem/backend/pkg/errors"
"github.com/spf13/viper"
"log"
"os"
"strings"
)
// When initializing this class the following methods must be called:
// Config.New
// Config.Init
// This is done automatically when created via the Factory.
type configuration struct {
*viper.Viper
}
func (c *configuration) Init() error {
c.Viper = viper.New()
//set defaults
c.SetDefault("web.listen.port", "8080")
c.SetDefault("web.listen.host", "0.0.0.0")
c.SetDefault("web.listen.basepath", "")
// allow unsafe endpoints should never be enabled in Production.
// It enables direct API access to healthcare providers without authentication.
c.SetDefault("web.allow_unsafe_endpoints", false)
c.SetDefault("web.src.frontend.path", "/opt/fasten/web")
c.SetDefault("database.type", "sqlite")
c.SetDefault("database.location", "/opt/fasten/db/fasten.db")
c.SetDefault("cache.location", "/opt/fasten/cache/")
c.SetDefault("jwt.issuer.key", "thisismysupersecuressessionsecretlength")
c.SetDefault("log.level", "INFO")
c.SetDefault("log.file", "")
//set the default system config file search path.
//if you want to load a non-standard location system config file (~/capsule.yml), use ReadConfig
//if you want to load a repo specific config file, use ReadConfig
c.SetConfigType("yaml")
c.SetConfigName("template")
c.AddConfigPath("$HOME/")
//configure env variable parsing.
c.SetEnvPrefix("FASTEN")
c.SetEnvKeyReplacer(strings.NewReplacer("-", "_", ".", "_"))
c.AutomaticEnv()
//CLI options will be added via the `Set()` function
return nil
}
func (c *configuration) ReadConfig(configFilePath string) error {
if !utils.FileExists(configFilePath) {
message := fmt.Sprintf("The configuration file (%s) could not be found. Skipping", configFilePath)
log.Printf(message)
return errors.ConfigFileMissingError("The configuration file could not be found.")
}
log.Printf("Loading configuration file: %s", configFilePath)
config_data, err := os.Open(configFilePath)
if err != nil {
log.Printf("Error reading configuration file: %s", err)
return err
}
err = c.MergeConfig(config_data)
if err != nil {
log.Printf("Error merging config file: %s", err)
return err
}
return c.ValidateConfig()
}
// This function ensures that required configuration keys (that must be manually set) are present
func (c *configuration) ValidateConfig() error {
return nil
}