diff --git a/main/configuration.go b/main/configuration.go new file mode 100644 index 0000000..2d027ea --- /dev/null +++ b/main/configuration.go @@ -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) +} diff --git a/main/main.go b/main/main.go index 215f617..cc15e39 100644 --- a/main/main.go +++ b/main/main.go @@ -10,16 +10,19 @@ import ( "github.com/rs/zerolog/log" ) -const USER_DATABASE_DIR = "." -const WEB_SERVER_PORT = "8080" - func main() { initializeLogger() 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.SetDirectory(USER_DATABASE_DIR) - err := userDatabase.Initialize() + userDatabase.SetDirectory(configuration.DatabaseDirectory) + err = userDatabase.Initialize() if err != nil { log.Error().Err(err).Msg("failed to initialize user database") os.Exit(1) @@ -34,7 +37,7 @@ func main() { webServer := server.WebServer{} webServer.SetWebAppDirectoryPath("www") - webServer.SetPort(WEB_SERVER_PORT) + webServer.SetPort(configuration.Port) webServer.Initialize() defer webServer.Close()