config.go 2.5 KB

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