config.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package config
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "path/filepath"
  7. "strconv"
  8. "github.com/joho/godotenv"
  9. "github.com/felamaslen/go-music-player/pkg/logger"
  10. )
  11. var envLoaded = false
  12. func getEnvFile() (string, bool) {
  13. goEnv, _ := os.LookupEnv("GO_ENV")
  14. switch goEnv {
  15. case "test":
  16. return "test.env", true
  17. case "development":
  18. return ".env", true
  19. default:
  20. return "", false
  21. }
  22. }
  23. func loadEnv() {
  24. envFileBase, loadEnvFile := getEnvFile()
  25. cwd, _ := os.Getwd()
  26. envFile := filepath.Join(cwd, envFileBase)
  27. if loadEnvFile {
  28. err := godotenv.Load(envFile)
  29. if err != nil {
  30. log.Printf("Error loading dotenv file: %v\n", err)
  31. } else {
  32. envLoaded = true
  33. }
  34. }
  35. }
  36. func getDatabaseUrl() string {
  37. host, hasHost := os.LookupEnv("POSTGRES_HOST")
  38. if !hasHost {
  39. log.Fatal("Must set POSTGRES_HOST")
  40. }
  41. user := os.Getenv("POSTGRES_USER")
  42. password := os.Getenv("POSTGRES_PASSWORD")
  43. port, hasPort := os.LookupEnv("POSTGRES_PORT")
  44. if !hasPort {
  45. port = "5432"
  46. }
  47. portNumeric, err := strconv.Atoi(port)
  48. if err != nil {
  49. log.Fatal("POSTGRES_PORT must be numeric")
  50. }
  51. database, hasDatabase := os.LookupEnv("POSTGRES_DATABASE")
  52. if !hasDatabase {
  53. log.Fatal("Must set POSTGRES_DATABASE")
  54. }
  55. databaseUrl := fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=disable", user, password, host, portNumeric, database)
  56. return databaseUrl
  57. }
  58. const defaultLogLevel = logger.LevelInfo
  59. func getLogLevel() logger.LogLevel {
  60. level, hasLevel := os.LookupEnv("LOG_LEVEL")
  61. if !hasLevel {
  62. return defaultLogLevel
  63. }
  64. levelInt, err := strconv.Atoi(level)
  65. if err != nil {
  66. return defaultLogLevel
  67. }
  68. switch levelInt {
  69. case 0:
  70. return logger.LevelNone
  71. case 1:
  72. return logger.LevelError
  73. case 2:
  74. return logger.LevelWarn
  75. case 3:
  76. return logger.LevelInfo
  77. case 4:
  78. return logger.LevelVerbose
  79. case 5:
  80. return logger.LevelDebug
  81. }
  82. return defaultLogLevel
  83. }
  84. func getPort() int {
  85. var defaultPort = 3000
  86. port, hasPort := os.LookupEnv("PORT")
  87. if !hasPort {
  88. return defaultPort
  89. }
  90. result, err := strconv.Atoi(port)
  91. if err != nil {
  92. return defaultPort
  93. }
  94. return result
  95. }
  96. func getRedisUrl() string {
  97. url, hasUrl := os.LookupEnv("REDIS_URL")
  98. if !hasUrl {
  99. return "localhost:6379"
  100. }
  101. return url
  102. }
  103. type config struct {
  104. DatabaseUrl string
  105. LogLevel logger.LogLevel
  106. LibraryDirectory string
  107. Port int
  108. RedisUrl string
  109. }