feat: add configuration file and environment

This commit is contained in:
Fritz Heiden 2025-03-13 18:06:20 +01:00
parent 2e27714fcf
commit e845d88b6c
2 changed files with 96 additions and 6 deletions

87
main/configuration.go Normal file
View File

@ -0,0 +1,87 @@
package main
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/rs/zerolog/log"
)
type Configuration struct {
Port string `json:"port"`
DatabaseDirectory string `json:"database_directory"`
}
func getDefaultConfig() Configuration {
return Configuration{
Port: "8080",
DatabaseDirectory: ".",
}
}
func LoadConfiguration(configurationFilePath string) (Configuration, error) {
config, err := fromFile(configurationFilePath)
if err != nil {
log.Info().Msg("failed to load configuration from file, using default values")
}
config.Port = os.Getenv("HTTP_PORT")
config.DatabaseDirectory = os.Getenv("DATABASE_DIRECTORY")
config = mergeConfig(getDefaultConfig(), config)
err = checkConfiguration(&config)
if err != nil {
return config, err
}
return config, nil
}
func fromFile(filePath string) (Configuration, error) {
file, err := os.Open(filePath)
if err != nil {
return Configuration{}, err
}
jsonData, err := io.ReadAll(file)
if err != nil {
return Configuration{}, err
}
var config Configuration
err = json.Unmarshal(jsonData, &config)
if err != nil {
return Configuration{}, err
}
return config, nil
}
func mergeConfig(base Configuration, override Configuration) Configuration {
mergedConfig := base
if override.Port != "" {
mergedConfig.Port = override.Port
}
if override.DatabaseDirectory != "" {
mergedConfig.DatabaseDirectory = override.DatabaseDirectory
}
return mergedConfig
}
func checkConfiguration(configuration *Configuration) error {
databaseDirectory := configuration.DatabaseDirectory
if !checkDirectoryPath(databaseDirectory) {
return fmt.Errorf("database directory %s does not exist", databaseDirectory)
}
return nil
}
func checkDirectoryPath(directoryPath string) bool {
_, err := os.Stat(directoryPath)
return !os.IsNotExist(err)
}

View File

@ -10,16 +10,19 @@ import (
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
) )
const USER_DATABASE_DIR = "."
const WEB_SERVER_PORT = "8080"
func main() { func main() {
initializeLogger() initializeLogger()
log.Info().Msg("starting playback device server") log.Info().Msg("starting playback device server")
configuration, err := LoadConfiguration("config.json")
if err != nil {
log.Error().Err(err).Msg("configuration error")
os.Exit(1)
}
userDatabase := users.UserDatabase{} userDatabase := users.UserDatabase{}
userDatabase.SetDirectory(USER_DATABASE_DIR) userDatabase.SetDirectory(configuration.DatabaseDirectory)
err := userDatabase.Initialize() err = userDatabase.Initialize()
if err != nil { if err != nil {
log.Error().Err(err).Msg("failed to initialize user database") log.Error().Err(err).Msg("failed to initialize user database")
os.Exit(1) os.Exit(1)
@ -34,7 +37,7 @@ func main() {
webServer := server.WebServer{} webServer := server.WebServer{}
webServer.SetWebAppDirectoryPath("www") webServer.SetWebAppDirectoryPath("www")
webServer.SetPort(WEB_SERVER_PORT) webServer.SetPort(configuration.Port)
webServer.Initialize() webServer.Initialize()
defer webServer.Close() defer webServer.Close()