diff --git a/web/pkg/config/config.go b/web/pkg/config/config.go new file mode 100644 index 0000000..1360325 --- /dev/null +++ b/web/pkg/config/config.go @@ -0,0 +1,56 @@ +package config + +import ( + "strings" + + "github.com/spf13/viper" +) + +const FileName = "podsync" + +type AppConfig struct { + YouTubeApiKey string `yaml:"youtubeApiKey"` + VimeoApiKey string `yaml:"vimeoApiKey"` + PatreonClientId string `yaml:"patreonClientId"` + PatreonSecret string `yaml:"patreonSecret"` + PostgresConnectionURL string `yaml:"postgresConnectionUrl"` +} + +func ReadConfiguration() (cfg *AppConfig, err error) { + viper.SetConfigName(FileName) + + // Configuration file + viper.AddConfigPath(".") + viper.AddConfigPath("/app/config/") + + // Env variables + viper.AutomaticEnv() + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + + envmap := map[string]string{ + "youtubeApiKey": "YOUTUBE_API_KEY", + "vimeoApiKey": "VIMEO_API_KEY", + "patreonClientId": "PATREON_CLIENT_ID", + "patreonSecret": "PATREON_SECRET", + "postgresConnectionUrl": "POSTGRES_CONNECTION_URL", + } + + for k, v := range envmap { + viper.BindEnv(k, v) + } + + err = viper.ReadInConfig() + if err != nil { + if _, ok := err.(viper.ConfigFileNotFoundError); !ok { + return + } + + // Ignore file not found error + err = nil + } + + cfg = &AppConfig{} + + viper.Unmarshal(cfg) + return +} diff --git a/web/pkg/config/config_test.go b/web/pkg/config/config_test.go new file mode 100644 index 0000000..7682ae7 --- /dev/null +++ b/web/pkg/config/config_test.go @@ -0,0 +1,54 @@ +package config + +import ( + "io/ioutil" + "os" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/require" +) + +const YamlConfig = ` +youtubeApiKey: "1" +vimeoApiKey: "2" +patreonClientId: "3" +patreonSecret: "4" +postgresConnectionUrl: "5" +` + +func TestReadYaml(t *testing.T) { + defer viper.Reset() + + err := ioutil.WriteFile("./podsync.yaml", []byte(YamlConfig), 0644) + defer os.Remove("./podsync.yaml") + require.NoError(t, err) + + cfg, err := ReadConfiguration() + require.NoError(t, err) + + require.Equal(t, "1", cfg.YouTubeApiKey) + require.Equal(t, "2", cfg.VimeoApiKey) + require.Equal(t, "3", cfg.PatreonClientId) + require.Equal(t, "4", cfg.PatreonSecret) + require.Equal(t, "5", cfg.PostgresConnectionURL) +} + +func TestReadEnv(t *testing.T) { + defer viper.Reset() + defer os.Clearenv() + + os.Setenv("YOUTUBE_API_KEY", "11") + os.Setenv("VIMEO_API_KEY", "22") + os.Setenv("PATREON_CLIENT_ID", "33") + os.Setenv("PATREON_SECRET", "44") + os.Setenv("POSTGRES_CONNECTION_URL", "55") + + cfg, err := ReadConfiguration() + require.NoError(t, err) + + require.Equal(t, "11", cfg.YouTubeApiKey) + require.Equal(t, "22", cfg.VimeoApiKey) + require.Equal(t, "33", cfg.PatreonClientId) + require.Equal(t, "44", cfg.PatreonSecret) +}